From f11585586fa111bedff50cf632186b2d37d220ec Mon Sep 17 00:00:00 2001 From: Noah <37805707+Curve@users.noreply.github.com> Date: Thu, 23 Jul 2026 19:21:17 +0200 Subject: [PATCH 01/29] Update Venmic to 7.1.0 (#1291) - Fixes https://github.com/Vencord/venmic/issues/43 - Fixes https://github.com/Vencord/venmic/issues/36 - Fixes https://github.com/Vencord/venmic/issues/34 - Fixes #772 --- package.json | 2 +- pnpm-lock.yaml | 10 +- pnpm-workspace.yaml | 3 +- src/main/venmic.ts | 86 +++++++-------- src/preload/VesktopNative.ts | 1 + src/renderer/components/ScreenSharePicker.tsx | 104 +++++++++--------- src/shared/IpcEvents.ts | 1 + src/shared/settings.d.ts | 1 + 8 files changed, 102 insertions(+), 106 deletions(-) diff --git a/package.json b/package.json index ec7e229..99b6e2f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "electron-updater": "6.6.2" }, "optionalDependencies": { - "@vencord/venmic": "^6.1.0" + "@vencord/venmic": "^7.1.0" }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4cb06d8..41a9a3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: version: 3.7.0 optionalDependencies: '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 + specifier: ^7.1.0 + version: 7.1.0 packages/libvesktop: devDependencies: @@ -555,8 +555,8 @@ packages: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 - '@vencord/venmic@6.1.0': - resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} + '@vencord/venmic@7.1.0': + resolution: {integrity: sha512-HQpZoUKGz8j7m1+1BCgE+7B6T/+/IArVO8km7SjsWxe/5+2YblAs0Fwgy9C9XqCCir/u0+F1FMqrQQUX2PATYw==} engines: {node: '>=14.15'} os: [linux] @@ -3317,7 +3317,7 @@ snapshots: ts-pattern: 5.9.0 type-fest: 4.41.0 - '@vencord/venmic@6.1.0': + '@vencord/venmic@7.1.0': dependencies: cmake-js: 7.4.0 node-addon-api: 8.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 23f5fc8..8306458 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,4 +13,5 @@ recursiveInstall: false packages: - packages/* minimumReleaseAgeExclude: - - electron \ No newline at end of file + - electron + - '@vencord/*' diff --git a/src/main/venmic.ts b/src/main/venmic.ts index b6a0d08..80192c5 100644 --- a/src/main/venmic.ts +++ b/src/main/venmic.ts @@ -66,70 +66,60 @@ function getRendererAudioServicePid() { ); } +function buildLinkData({ include, exclude }: { include?: Node[]; exclude?: Node[] }) { + const pid = getRendererAudioServicePid(); + + const { mute, ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround, onlySpeakers, onlyDefaultSpeakers } = + Settings.store.audio ?? {}; + + const data: LinkData = { + mute: mute ?? true, + include: include ?? [], + exclude: exclude ?? [], + only_speakers: onlySpeakers, + ignore_devices: ignoreDevices, + only_default_speakers: onlyDefaultSpeakers + }; + + data.exclude.push({ "application.process.id": pid }); + + if (ignoreInputMedia ?? true) { + data.exclude.push({ "media.class": "Stream/Input/Audio" }); + } + + if (ignoreVirtual) { + data.exclude.push({ "node.virtual": "true" }); + } + + if (workaround) { + data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; + } + + return data; +} + ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => { const audioPid = getRendererAudioServicePid(); const { granularSelect } = Settings.store.audio ?? {}; const targets = obtainVenmic() - ?.list(granularSelect ? ["node.name"] : undefined) + ?.list(granularSelect ? [] : ["application.name", "node.name"]) .filter(s => s["application.process.id"] !== audioPid); return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; }); ipcMain.handle(IpcEvents.VIRT_MIC_START, (_, include: Node[]) => { - const pid = getRendererAudioServicePid(); - const { ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround } = Settings.store.audio ?? {}; - - const data: LinkData = { - include, - exclude: [{ "application.process.id": pid }], - ignore_devices: ignoreDevices - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); + return obtainVenmic()?.link(buildLinkData({ include })); }); ipcMain.handle(IpcEvents.VIRT_MIC_START_SYSTEM, (_, exclude: Node[]) => { - const pid = getRendererAudioServicePid(); + return obtainVenmic()?.link(buildLinkData({ exclude })); +}); - const { workaround, ignoreDevices, ignoreInputMedia, ignoreVirtual, onlySpeakers, onlyDefaultSpeakers } = - Settings.store.audio ?? {}; - - const data: LinkData = { - include: [], - exclude: [{ "application.process.id": pid }, ...exclude], - only_speakers: onlySpeakers, - ignore_devices: ignoreDevices, - only_default_speakers: onlyDefaultSpeakers - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); +ipcMain.handle(IpcEvents.VIRT_MIC_UNMUTE, () => { + return obtainVenmic()?.unmute(); }); ipcMain.handle(IpcEvents.VIRT_MIC_STOP, () => obtainVenmic()?.unlink()); diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index e11fae7..1dd6710 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -92,6 +92,7 @@ export const VesktopNative = { >(IpcEvents.VIRT_MIC_LIST), start: (include: Node[]) => invoke(IpcEvents.VIRT_MIC_START, include), startSystem: (exclude: Node[]) => invoke(IpcEvents.VIRT_MIC_START_SYSTEM, exclude), + unmute: () => invoke(IpcEvents.VIRT_MIC_UNMUTE), stop: () => invoke(IpcEvents.VIRT_MIC_STOP) }, clipboard: { diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index a5fb8a0..26e8b1b 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -122,15 +122,25 @@ addPatch({ if (isLinux) { onceReady.then(() => { - FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { - const owner = streamKey.split(":").at(-1); + const ownsStream = (streamKey: string) => { + return streamKey.split(":").at(-1) === UserStore.getCurrentUser().id; + }; - if (owner !== UserStore.getCurrentUser().id) { + FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { return; } VesktopNative.virtmic.stop(); }); + + FluxDispatcher.subscribe("STREAM_UPDATE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { + return; + } + + VesktopNative.virtmic.unmute(); + }); }); } @@ -219,6 +229,13 @@ function AudioSettingsModal({ + (Settings.audio = { ...Settings.audio, mute: v })} + value={Settings.audio?.mute ?? true} + /> value[key] === other[key]); -} - function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] { if (isSpecialSource(node)) { return [{ name: node, value: node }]; } - const rtn: AudioItem[] = []; - const mediaClass = node["media.class"]; if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) { - return rtn; + return []; } if (!deviceSelect && node["device.id"]) { - return rtn; + return []; } - const name = node["application.name"]; + const preferred = ["application.name", "node.description", "node.name", "application.process.binary"] as const; + const prop = preferred.find(prop => node[prop]); - if (name) { - rtn.push({ name: name, value: { "application.name": name } }); + if (!prop) { + return []; } + const name = node[prop]!; + const items: AudioItem[] = [{ name: name, value: { [prop]: name } }]; + if (!granularSelect) { - return rtn; + return items; } - const rawName = node["node.name"]; + let granularName = name; + const granularProps: Node = { [prop]: name }; - if (!name) { - rtn.push({ name: rawName, value: { "node.name": rawName } }); - } + const append = (name: string, brackets: string) => { + const value = node[name]; - const binary = node["application.process.binary"]; + if (!value) { + return; + } - if (!name && binary) { - rtn.push({ name: binary, value: { "application.process.binary": binary } }); - } + granularName += ` ${brackets[0]}${value}${brackets[1]}`; + granularProps[name] = value; + }; - const pid = node["application.process.id"]; + append("application.process.id", "<>"); + append("application.process.binary", "()"); + append("media.name", "[]"); - const first = rtn[0]; - const firstValues = first.value as Node; + items.push({ name: granularName, value: granularProps }); - if (pid) { - rtn.push({ - name: `${first.name} (${pid})`, - value: { ...firstValues, "application.process.id": pid } - }); - } + return items; +} - const mediaName = node["media.name"]; - - if (mediaName) { - rtn.push({ - name: `${first.name} [${mediaName}]`, - value: { ...firstValues, "media.name": mediaName } - }); - } - - if (mediaClass) { - rtn.push({ - name: `${first.name} [${mediaClass}]`, - value: { ...firstValues, "media.class": mediaClass } - }); - } - - return rtn; +function hasMatchingProps(value: Node, other: Node) { + const keys = Object.keys(value); + return keys.length === Object.keys(other).length && keys.every(key => value[key] === other[key]); } function isItemSelected(sources?: AudioSources) { @@ -655,9 +655,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(includeSources)} select={updateItems(setIncludeSources, includeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> @@ -675,9 +676,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(excludeSources)} select={updateItems(setExcludeSources, excludeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index 13f27b4..55efe80 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -49,6 +49,7 @@ export const enum IpcEvents { VIRT_MIC_LIST = "VCD_VIRT_MIC_LIST", VIRT_MIC_START = "VCD_VIRT_MIC_START", VIRT_MIC_START_SYSTEM = "VCD_VIRT_MIC_START_ALL", + VIRT_MIC_UNMUTE = "VCD_VIRT_MIC_UNMUTE", VIRT_MIC_STOP = "VCD_VIRT_MIC_STOP", CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index b127f6d..f992d61 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -48,6 +48,7 @@ export interface Settings { ignoreDevices?: boolean; ignoreInputMedia?: boolean; + mute?: boolean; onlySpeakers?: boolean; onlyDefaultSpeakers?: boolean; }; From 1c9f6871c20697dde1441b9557263ffa113adc2e Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Aug 2026 02:40:08 +0200 Subject: [PATCH 02/29] upgrade dependencies --- .github/workflows/meta.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- package.json | 20 +- pnpm-lock.yaml | 894 +++++++++++++++++----------------- 5 files changed, 465 insertions(+), 455 deletions(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 6b03113..85cae92 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -18,7 +18,7 @@ jobs: - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee14c98..db5c06b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 cache: "pnpm" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bdfef7f..69f0458 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 cache: "pnpm" diff --git a/package.json b/package.json index 99b6e2f..31e8790 100644 --- a/package.json +++ b/package.json @@ -36,28 +36,28 @@ "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", "@stylistic/eslint-plugin": "^5.10.0", - "@types/node": "^26.0.1", + "@types/node": "^26.2.0", "@types/react": "19.2.9", - "@vencord/types": "^1.14.1", + "@vencord/types": "^1.15.1", "dotenv": "^17.3.1", - "electron": "^43.0.0", + "electron": "^43.4.0", "electron-builder": "^26.15.3", - "esbuild": "^0.28.1", - "eslint": "^10.6.0", + "esbuild": "^0.28.2", + "eslint": "^10.8.1", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "^2.1.0", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", "eslint-plugin-simple-header": "^1.2.2", - "eslint-plugin-simple-import-sort": "^13.0.0", + "eslint-plugin-simple-import-sort": "^14.0.0", "eslint-plugin-unused-imports": "^4.4.1", "libvesktop": "link:packages/libvesktop", - "prettier": "^3.9.4", + "prettier": "^3.9.6", "source-map-support": "^0.5.21", - "tsx": "^4.22.4", - "type-fest": "^5.7.0", + "tsx": "^4.23.12", + "type-fest": "^5.8.0", "typescript": "^6.0.3", - "typescript-eslint": "^8.62.1", + "typescript-eslint": "^8.67.0", "xml-formatter": "^3.6.7" }, "packageManager": "pnpm@11.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41a9a3f..fde678f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,87 +17,87 @@ importers: version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4) electron-updater: specifier: 6.6.2 - version: 6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887) + version: 6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887)(supports-color@7.2.0) devDependencies: '@fal-works/esbuild-plugin-global-externals': specifier: ^2.1.2 version: 2.1.2 '@stylistic/eslint-plugin': specifier: ^5.10.0 - version: 5.10.0(eslint@10.6.0(jiti@2.7.0)) + version: 5.10.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@types/node': - specifier: ^26.0.1 - version: 26.0.1 + specifier: ^26.2.0 + version: 26.2.0 '@types/react': specifier: 19.2.9 version: 19.2.9 '@vencord/types': - specifier: ^1.14.1 - version: 1.14.1(@types/react-dom@18.3.1)(@types/react@19.2.9) + specifier: ^1.15.1 + version: 1.15.1(@types/react-dom@18.3.1)(@types/react@19.2.9) dotenv: specifier: ^17.3.1 version: 17.4.2 electron: - specifier: ^43.0.0 - version: 43.0.0 + specifier: ^43.4.0 + version: 43.4.0(supports-color@7.2.0) electron-builder: specifier: ^26.15.3 - version: 26.15.3(electron-builder-squirrel-windows@26.15.3) + version: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) esbuild: - specifier: ^0.28.1 - version: 0.28.1 + specifier: ^0.28.2 + version: 0.28.2 eslint: - specifier: ^10.6.0 - version: 10.6.0(jiti@2.7.0) + specifier: ^10.8.1 + version: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)) eslint-plugin-path-alias: specifier: ^2.1.0 - version: 2.1.0(eslint@10.6.0(jiti@2.7.0)) + version: 2.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint@10.6.0(jiti@2.7.0))(prettier@3.9.4) + version: 5.5.6(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@10.6.0(jiti@2.7.0)) + version: 7.37.5(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-simple-header: specifier: ^1.2.2 - version: 1.2.2(eslint@10.6.0(jiti@2.7.0)) + version: 1.2.2(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-simple-import-sort: - specifier: ^13.0.0 - version: 13.0.0(eslint@10.6.0(jiti@2.7.0)) + specifier: ^14.0.0 + version: 14.0.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-unused-imports: specifier: ^4.4.1 - version: 4.4.1(@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) + version: 4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) libvesktop: specifier: link:packages/libvesktop version: link:packages/libvesktop prettier: - specifier: ^3.9.4 - version: 3.9.4 + specifier: ^3.9.6 + version: 3.9.6 source-map-support: specifier: ^0.5.21 version: 0.5.21 tsx: - specifier: ^4.22.4 - version: 4.22.4 + specifier: ^4.23.12 + version: 4.23.12 type-fest: - specifier: ^5.7.0 - version: 5.7.0 + specifier: ^5.8.0 + version: 5.8.0 typescript: specifier: ^6.0.3 version: 6.0.3 typescript-eslint: - specifier: ^8.62.1 - version: 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.67.0 + version: 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) xml-formatter: specifier: ^3.6.7 version: 3.7.0 optionalDependencies: '@vencord/venmic': specifier: ^7.1.0 - version: 7.1.0 + version: 7.1.0(supports-color@7.2.0) packages/libvesktop: devDependencies: @@ -106,12 +106,12 @@ importers: version: 8.9.0 node-gyp: specifier: ^11.4.2 - version: 11.5.0 + version: 11.5.0(supports-color@7.2.0) packages: - '@electron-internal/extract-zip@1.0.4': - resolution: {integrity: sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==} + '@electron-internal/extract-zip@1.0.5': + resolution: {integrity: sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==} engines: {node: '>=22.12.0'} '@electron/asar@3.4.1': @@ -127,8 +127,8 @@ packages: resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} engines: {node: '>=14'} - '@electron/get@5.0.0': - resolution: {integrity: sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==} + '@electron/get@5.1.0': + resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==} engines: {node: '>=22.12.0'} '@electron/notarize@2.5.0': @@ -154,162 +154,168 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -324,8 +330,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -461,20 +467,17 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + '@types/lodash@4.17.19': + resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/node@24.13.2': - resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} - - '@types/node@26.0.1': - resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} @@ -485,39 +488,39 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@typescript-eslint/eslint-plugin@8.62.1': - resolution: {integrity: sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==} + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.62.1 + '@typescript-eslint/parser': ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.62.1': - resolution: {integrity: sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==} + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.62.1': - resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.62.1': - resolution: {integrity: sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==} + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.62.1': - resolution: {integrity: sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==} + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.62.1': - resolution: {integrity: sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==} + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -527,30 +530,34 @@ packages: resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.62.1': - resolution: {integrity: sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==} + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.62.1': - resolution: {integrity: sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==} + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.62.1': - resolution: {integrity: sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==} + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vencord/discord-types@1.0.1': - resolution: {integrity: sha512-uSQMDUTo9hMFgOMykNtTMTxScSKVVUHHFCevktO3bMyaLh1s3iDMfIvUvqU1fBkmFwvMbmEYsUrztsVKKHvang==} + '@vencord/discord-types@1.0.2': + resolution: {integrity: sha512-nq3YZebbv085/FsFcKhoVBCs9U9QuAEPy1noL9x9Bb5B29TdhQqr/hJCcApSWjY8J299+tLi30LEe0YGo3yn0Q==} peerDependencies: - '@types/react': ^19.0.10 + '@types/react': 19.1.0 - '@vencord/types@1.14.1': - resolution: {integrity: sha512-P4eYl3IJKXLjAWH2Ejs2/z8eOS0LsuTNFqL9OHXQRXtOWoAEYNG6z9MXH25Thr/dIUH839IZCW872XjOSVIauQ==} + '@vencord/types@1.15.1': + resolution: {integrity: sha512-69hnv7kLzMhHWyIAQ9WE3gIXE1kf4wl9bioBVk7nRxZomDHeYUwTPA5r6MnJcAts52IcupZfswi/gUxRBSnrtg==} peerDependencies: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 @@ -747,9 +754,9 @@ packages: brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1035,8 +1042,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@43.0.0: - resolution: {integrity: sha512-PV60GsWU6qufhuOhw3n+Yix3WPDcqDtBqE8orbEQGQGHEkgp9o/JCPgb7L4vIL0r1HnfPdqSRtboOTqbDkcFDQ==} + electron@43.4.0: + resolution: {integrity: sha512-3qxGF0CeQbiox5oWV1JlbWGQ1VerbmDhTFqW4sJ8h7uqTHniFYPObXJcDna0DMh32et0fFyKzz0YY8lJv3t5jg==} engines: {node: '>= 22.12.0'} hasBin: true @@ -1102,8 +1109,8 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -1185,8 +1192,8 @@ packages: peerDependencies: eslint: '>=8.41.0' - eslint-plugin-simple-import-sort@13.0.0: - resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} + eslint-plugin-simple-import-sort@14.0.0: + resolution: {integrity: sha512-NUJO0+XFCkk+o5EsAJruTgnfMEpeWrPWeJS15UVF60GgXmqz1BJ9/3hzlvG7lkL8Bubzos5cCLptThbFfPnSMQ==} peerDependencies: eslint: '>=5.0.0' @@ -1215,8 +1222,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.6.0: - resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1311,8 +1318,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -1908,8 +1915,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -1979,6 +1986,9 @@ packages: engines: {node: '>=10'} hasBin: true + moment@2.22.2: + resolution: {integrity: sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw==} + moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -2191,8 +2201,8 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.9.4: - resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -2620,8 +2630,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.12: + resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} engines: {node: '>=18.0.0'} hasBin: true @@ -2633,12 +2643,8 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - type-fest@5.7.0: - resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} typed-array-buffer@1.0.3: @@ -2657,8 +2663,8 @@ packages: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.62.1: - resolution: {integrity: sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==} + typescript-eslint@8.67.0: + resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2673,9 +2679,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -2686,8 +2689,8 @@ packages: resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} union-value@1.0.1: @@ -2842,7 +2845,7 @@ packages: snapshots: - '@electron-internal/extract-zip@1.0.4': {} + '@electron-internal/extract-zip@1.0.5': {} '@electron/asar@3.4.1': dependencies: @@ -2856,45 +2859,45 @@ snapshots: fs-extra: 9.1.0 minimist: 1.2.8 - '@electron/get@3.1.0': + '@electron/get@3.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 semver: 6.3.1 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: global-agent: 3.0.0 transitivePeerDependencies: - supports-color - '@electron/get@5.0.0': + '@electron/get@5.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) env-paths: 3.0.0 graceful-fs: 4.2.11 progress: 2.0.3 semver: 7.8.5 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: - undici: 7.28.0 + undici: 7.29.0 transitivePeerDependencies: - supports-color - '@electron/notarize@2.5.0': + '@electron/notarize@2.5.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.3': + '@electron/osx-sign@1.3.3(supports-color@7.2.0)': dependencies: compare-version: 0.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -2902,22 +2905,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/rebuild@4.0.6': + '@electron/rebuild@4.0.6(supports-color@7.2.0)': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) node-abi: 4.32.0 node-api-version: 0.2.1 node-gyp: 12.4.0 - read-binary-file-arch: 1.0.6 + read-binary-file-arch: 1.0.6(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@electron/universal@2.0.3': + '@electron/universal@2.0.3(supports-color@7.2.0)': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) dir-compare: 4.2.0 fs-extra: 11.3.6 minimatch: 9.0.9 @@ -2925,10 +2928,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/windows-sign@1.2.2': + '@electron/windows-sign@1.2.2(supports-color@7.2.0)': dependencies: cross-dirname: 0.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 11.3.6 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -2936,100 +2939,105 @@ snapshots: - supports-color optional: true - '@esbuild/aix-ppc64@0.28.1': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.28.1': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.28.1': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.28.1': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.28.1': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.28.1': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.28.1': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.28.1': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.28.1': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.28.1': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.28.1': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.28.1': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.28.1': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.28.1': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.28.1': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.28.1': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.28.1': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.28.1': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.28.1': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.28.1': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.28.1': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.28.1': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.28.1': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.28.1': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.28.1': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.28.1': + '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': + dependencies: + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -3079,9 +3087,9 @@ snapshots: dependencies: cross-spawn: 7.0.6 - '@malept/flatpak-bundler@0.4.0': + '@malept/flatpak-bundler@0.4.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 lodash: 4.18.1 tmp-promise: 3.0.3 @@ -3092,13 +3100,13 @@ snapshots: '@noble/hashes@2.2.0': {} - '@npmcli/agent@3.0.0': + '@npmcli/agent@3.0.0(supports-color@7.2.0)': dependencies: agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) lru-cache: 10.4.3 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3137,11 +3145,11 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.6.0(jiti@2.7.0))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/types': 8.62.1 - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -3155,7 +3163,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 26.0.1 + '@types/node': 26.2.0 '@types/responselike': 1.0.3 '@types/debug@4.1.13': @@ -3168,7 +3176,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 '@types/http-cache-semantics@4.2.0': {} @@ -3178,21 +3186,17 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 - '@types/lodash@4.17.15': {} + '@types/lodash@4.17.19': {} '@types/ms@2.1.0': {} - '@types/node@22.20.0': - dependencies: - undici-types: 6.21.0 - - '@types/node@24.13.2': + '@types/node@24.13.3': dependencies: undici-types: 7.18.2 - '@types/node@26.0.1': + '@types/node@26.2.0': dependencies: undici-types: 8.3.0 @@ -3206,17 +3210,17 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 - '@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/type-utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3224,43 +3228,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.62.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.62.1': + '@typescript-eslint/scope-manager@8.67.0': dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.62.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -3268,14 +3272,16 @@ snapshots: '@typescript-eslint/types@8.62.1': {} - '@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3)': + '@typescript-eslint/types@8.67.0': {} + + '@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.62.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - minimatch: 10.2.5 + '@typescript-eslint/project-service': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3283,43 +3289,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.62.1': + '@typescript-eslint/visitor-keys@8.67.0': dependencies: - '@typescript-eslint/types': 8.62.1 + '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 - '@vencord/discord-types@1.0.1(@types/react@19.2.9)': + '@vencord/discord-types@1.0.2(@types/react@19.2.9)': dependencies: '@types/react': 19.2.9 - moment: 2.30.1 - type-fest: 4.41.0 + moment: 2.22.2 + type-fest: 5.8.0 - '@vencord/types@1.14.1(@types/react-dom@18.3.1)(@types/react@19.2.9)': + '@vencord/types@1.15.1(@types/react-dom@18.3.1)(@types/react@19.2.9)': dependencies: - '@types/lodash': 4.17.15 - '@types/node': 22.20.0 + '@types/lodash': 4.17.19 + '@types/node': 26.2.0 '@types/react': 19.2.9 '@types/react-dom': 18.3.1 - '@vencord/discord-types': 1.0.1(@types/react@19.2.9) + '@vencord/discord-types': 1.0.2(@types/react@19.2.9) highlight.js: 11.11.1 moment: 2.30.1 ts-pattern: 5.9.0 - type-fest: 4.41.0 + type-fest: 5.8.0 - '@vencord/venmic@7.1.0': + '@vencord/venmic@7.1.0(supports-color@7.2.0)': dependencies: - cmake-js: 7.4.0 + cmake-js: 7.4.0(supports-color@7.2.0) node-addon-api: 8.9.0 pkg-prebuilds: 0.2.1 transitivePeerDependencies: @@ -3338,9 +3344,9 @@ snapshots: acorn@8.17.0: {} - agent-base@6.0.2: + agent-base@6.0.2(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color optional: true @@ -3371,33 +3377,33 @@ snapshots: ansi-styles@6.2.3: {} - app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3): + app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.0.6 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 + '@electron/get': 3.1.0(supports-color@7.2.0) + '@electron/notarize': 2.5.0(supports-color@7.2.0) + '@electron/osx-sign': 1.3.3(supports-color@7.2.0) + '@electron/rebuild': 4.0.6(supports-color@7.2.0) + '@electron/universal': 2.0.3(supports-color@7.2.0) + '@malept/flatpak-bundler': 0.4.0(supports-color@7.2.0) '@noble/hashes': 2.2.0 '@peculiar/webcrypto': 1.7.1 '@types/fs-extra': 9.0.13 ajv: 8.20.0 asn1js: 3.0.10 async-exit-hook: 2.0.1 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chromium-pickle-js: 0.2.0 ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) + debug: 4.4.3(supports-color@7.2.0) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3) - electron-publish: 26.15.3 + electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3)(supports-color@7.2.0) + electron-publish: 26.15.3(supports-color@7.2.0) fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.7 @@ -3405,7 +3411,7 @@ snapshots: js-yaml: 4.3.0 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.2.5 + minimatch: 10.2.6 pkijs: 3.4.0 plist: 3.1.0 proper-lockfile: 4.1.2 @@ -3536,11 +3542,11 @@ snapshots: aws4@1.13.2: {} - axios@1.18.1(debug@4.4.3): + axios@1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - follow-redirects: 1.16.0(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) form-data: 4.0.6 - https-proxy-agent: 5.0.1 + https-proxy-agent: 5.0.1(supports-color@7.2.0) proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -3577,36 +3583,36 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.7: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 buffer-from@1.1.2: {} - builder-util-runtime@9.3.1: + builder-util-runtime@9.3.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) sax: 1.6.0 transitivePeerDependencies: - supports-color - builder-util-runtime@9.7.0: + builder-util-runtime@9.7.0(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) sax: 1.6.0 transitivePeerDependencies: - supports-color - builder-util@26.15.3: + builder-util@26.15.3(supports-color@7.2.0): dependencies: '@types/debug': 4.1.13 - builder-util-runtime: 9.7.0 + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) js-yaml: 4.3.0 sanitize-filename: 1.6.4 source-map-support: 0.5.21 @@ -3707,10 +3713,10 @@ snapshots: dependencies: mimic-response: 1.0.1 - cmake-js@7.4.0: + cmake-js@7.4.0(supports-color@7.2.0): dependencies: - axios: 1.18.1(debug@4.4.3) - debug: 4.4.3 + axios: 1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + debug: 4.4.3(supports-color@7.2.0) fs-extra: 11.3.6 memory-stream: 1.0.0 node-api-headers: 1.9.0 @@ -3790,17 +3796,23 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debug@2.6.9: + debug@2.6.9(supports-color@7.2.0): dependencies: ms: 2.0.0 + optionalDependencies: + supports-color: 7.2.0 - debug@3.2.7: + debug@3.2.7(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 decode-uri-component@0.2.2: {} @@ -3853,10 +3865,10 @@ snapshots: minimatch: 3.1.5 p-limit: 3.1.0 - dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): + dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.0 transitivePeerDependencies: @@ -3891,23 +3903,23 @@ snapshots: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3): + electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - electron-winstaller: 5.4.0 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) + electron-winstaller: 5.4.0(supports-color@7.2.0) transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): + electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -3916,12 +3928,12 @@ snapshots: - electron-builder-squirrel-windows - supports-color - electron-publish@26.15.3: + electron-publish@26.15.3(supports-color@7.2.0): dependencies: '@types/fs-extra': 9.0.13 aws4: 1.13.2 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 form-data: 4.0.6 fs-extra: 10.1.0 @@ -3930,9 +3942,9 @@ snapshots: transitivePeerDependencies: - supports-color - electron-updater@6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887): + electron-updater@6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887)(supports-color@7.2.0): dependencies: - builder-util-runtime: 9.3.1 + builder-util-runtime: 9.3.1(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.0 lazy-val: 1.0.5 @@ -3943,23 +3955,23 @@ snapshots: transitivePeerDependencies: - supports-color - electron-winstaller@5.4.0: + electron-winstaller@5.4.0(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 7.0.1 lodash: 4.18.1 temp: 0.9.4 optionalDependencies: - '@electron/windows-sign': 1.2.2 + '@electron/windows-sign': 1.2.2(supports-color@7.2.0) transitivePeerDependencies: - supports-color - electron@43.0.0: + electron@43.4.0(supports-color@7.2.0): dependencies: - '@electron-internal/extract-zip': 1.0.4 - '@electron/get': 5.0.0 - '@types/node': 24.13.2 + '@electron-internal/extract-zip': 1.0.5 + '@electron/get': 5.1.0(supports-color@7.2.0) + '@types/node': 24.13.3 transitivePeerDependencies: - supports-color @@ -4096,73 +4108,73 @@ snapshots: es6-error@4.1.1: optional: true - esbuild@0.28.1: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - eslint-import-resolver-node@0.3.10: + eslint-import-resolver-node@0.3.10(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) is-core-module: 2.16.2 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.6.0(jiti@2.7.0)): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) doctrine: 2.1.0 - eslint: 10.6.0(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.6.0(jiti@2.7.0)) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -4174,29 +4186,29 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-path-alias@2.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) find-pkg: 2.0.0 get-tsconfig: 4.14.0 - nanomatch: 1.2.13 + nanomatch: 1.2.13(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.5.6(eslint@10.6.0(jiti@2.7.0))(prettier@3.9.4): + eslint-plugin-prettier@5.5.6(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6): dependencies: - eslint: 10.6.0(jiti@2.7.0) - prettier: 3.9.4 + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + prettier: 3.9.6 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 - eslint-plugin-react@7.37.5(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4204,7 +4216,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.3 - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -4218,19 +4230,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-simple-header@1.2.2(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-simple-import-sort@13.0.0(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-simple-import-sort@14.0.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint-scope@9.1.2: dependencies: @@ -4245,12 +4257,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.6.0(jiti@2.7.0): + eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 + '@eslint/config-array': 0.23.5(supports-color@7.2.0) + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -4259,7 +4271,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -4274,7 +4286,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -4358,14 +4370,14 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.4.4: {} - follow-redirects@1.16.0(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3(supports-color@7.2.0)): optionalDependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) optional: true for-each@0.3.5: @@ -4633,10 +4645,10 @@ snapshots: http-cache-semantics@4.2.0: {} - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4645,18 +4657,18 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: + https-proxy-agent@5.0.1(supports-color@7.2.0): dependencies: - agent-base: 6.0.2 - debug: 4.4.3 + agent-base: 6.0.2(supports-color@7.2.0) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color optional: true - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4962,9 +4974,9 @@ snapshots: dependencies: yallist: 4.0.0 - make-fetch-happen@14.0.3: + make-fetch-happen@14.0.3(supports-color@7.2.0): dependencies: - '@npmcli/agent': 3.0.0 + '@npmcli/agent': 3.0.0(supports-color@7.2.0) cacache: 19.0.1 http-cache-semantics: 4.2.0 minipass: 7.1.3 @@ -5008,9 +5020,9 @@ snapshots: mimic-response@3.1.0: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.8 minimatch@3.1.5: dependencies: @@ -5081,13 +5093,15 @@ snapshots: mkdirp@1.0.4: optional: true + moment@2.22.2: {} + moment@2.30.1: {} ms@2.0.0: {} ms@2.1.3: {} - nanomatch@1.2.13: + nanomatch@1.2.13(supports-color@7.2.0): dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -5098,7 +5112,7 @@ snapshots: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2 + snapdragon: 0.8.2(supports-color@7.2.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color @@ -5127,12 +5141,12 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-gyp@11.5.0: + node-gyp@11.5.0(supports-color@7.2.0): dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 14.0.3 + make-fetch-happen: 14.0.3(supports-color@7.2.0) nopt: 8.1.0 proc-log: 5.0.0 semver: 7.8.5 @@ -5320,7 +5334,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.9.4: {} + prettier@3.9.6: {} proc-log@5.0.0: {} @@ -5375,9 +5389,9 @@ snapshots: react-is@16.13.1: {} - read-binary-file-arch@1.0.6: + read-binary-file-arch@1.0.6(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5602,10 +5616,10 @@ snapshots: smart-buffer@4.2.0: {} - snapdragon@0.8.2: + snapdragon@0.8.2(supports-color@7.2.0): dependencies: base: 0.11.2 - debug: 2.6.9 + debug: 2.6.9(supports-color@7.2.0) define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -5615,10 +5629,10 @@ snapshots: transitivePeerDependencies: - supports-color - socks-proxy-agent@8.0.5: + socks-proxy-agent@8.0.5(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -5749,9 +5763,9 @@ snapshots: strip-json-comments@2.0.1: optional: true - sumchecker@3.0.1: + sumchecker@3.0.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5842,9 +5856,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.22.4: + tsx@4.23.12: dependencies: - esbuild: 0.28.1 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 @@ -5855,9 +5869,7 @@ snapshots: type-fest@0.13.1: optional: true - type-fest@4.41.0: {} - - type-fest@5.7.0: + type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 @@ -5894,13 +5906,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5914,15 +5926,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} - undici-types@7.18.2: {} undici-types@8.3.0: {} undici@6.27.0: {} - undici@7.28.0: + undici@7.29.0: optional: true union-value@1.0.1: From 04e902705e50ba34b256e26c11513ff8346de89f Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Aug 2026 02:40:16 +0200 Subject: [PATCH 03/29] migrate to new modal api --- src/renderer/components/ScreenSharePicker.tsx | 224 ++++++++---------- src/renderer/components/screenSharePicker.css | 4 - .../components/settings/DeveloperOptions.tsx | 52 ++-- .../components/settings/UserAssets.tsx | 37 +-- 4 files changed, 128 insertions(+), 189 deletions(-) diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index 26e8b1b..69d8d63 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -8,7 +8,6 @@ import "./screenSharePicker.css"; import { classNameFactory } from "@vencord/types/api/Styles"; import { - BaseText, Button, Card, CogWheel, @@ -20,18 +19,18 @@ import { RestartIcon, Span } from "@vencord/types/components"; +import { Logger, useAwaiter, useForceUpdater } from "@vencord/types/utils"; +import { onceReady } from "@vencord/types/webpack"; import { closeModal, - Logger, - ModalCloseButton, - Modals, - ModalSize, + FluxDispatcher, + MediaEngineStore, + Modal, openModal, - useAwaiter, - useForceUpdater -} from "@vencord/types/utils"; -import { onceReady } from "@vencord/types/webpack"; -import { FluxDispatcher, MediaEngineStore, Select, UserStore, useState } from "@vencord/types/webpack/common"; + Select, + UserStore, + useState +} from "@vencord/types/webpack/common"; import { Node } from "@vencord/venmic"; import type { Dispatch, SetStateAction } from "react"; import { addPatch } from "renderer/patches/shared"; @@ -220,15 +219,13 @@ function AudioSettingsModal({ const Settings = useSettings(); return ( - - - - Audio Settings - - - - - + +
- - - - - +
+
); } @@ -723,101 +715,91 @@ function ModalComponent({ frameRate: "30" }); + function handleGoLive() { + currentSettings = settings; + try { + const frameRate = Number(qualitySettings.frameRate); + const height = Number(qualitySettings.resolution); + const width = Math.round(height * (16 / 9)); + + const conn = [...MediaEngineStore.getMediaEngine().connections].find( + connection => connection.streamUserId === UserStore.getCurrentUser().id + ); + + if (conn) { + conn.videoStreamParameters[0].maxFrameRate = frameRate; + conn.videoStreamParameters[0].maxResolution ??= { width: 0, height: 0 }; + conn.videoStreamParameters[0].maxResolution.height = height; + conn.videoStreamParameters[0].maxResolution.width = width; + } + + submit({ + id: selected!, + ...settings + }); + + setTimeout(async () => { + const conn = [...MediaEngineStore.getMediaEngine().connections].find( + connection => connection.streamUserId === UserStore.getCurrentUser().id + ); + if (!conn) return; + + // @ts-expect-error incorrect type + const track = conn.input.stream.getVideoTracks()[0]; + + const constraints = { + ...track.getConstraints(), + frameRate: { min: frameRate, ideal: frameRate }, + width: { min: 640, ideal: width, max: width }, + height: { min: 480, ideal: height, max: height }, + advanced: [{ width: width, height: height }], + resizeMode: "none" + }; + + try { + await track.applyConstraints(constraints); + + logger.info("Applied constraints successfully. New constraints:", track.getConstraints()); + } catch (e) { + logger.error("Failed to apply constraints.", e); + } + }, 100); + } catch (error) { + logger.error("Error while submitting stream.", error); + } + + close(); + } + + const showGoBack = selected && !skipPicker; return ( - - - - Screen Share Picker - - - - - {!selected ? ( - - ) : ( - s.id === selected)!} - settings={settings} - setSettings={setSettings} - skipPicker={skipPicker} - /> - )} - - - - - {selected && !skipPicker ? ( - - ) : ( - - )} - - + (showGoBack ? setSelected(void 0) : close()) + }, + { + text: "Go Live", + disabled: !selected, + onClick: handleGoLive + } + ]} + > + {!selected ? ( + + ) : ( + s.id === selected)!} + settings={settings} + setSettings={setSettings} + skipPicker={skipPicker} + /> + )} + ); } diff --git a/src/renderer/components/screenSharePicker.css b/src/renderer/components/screenSharePicker.css index c00c622..d221c8d 100644 --- a/src/renderer/components/screenSharePicker.css +++ b/src/renderer/components/screenSharePicker.css @@ -1,7 +1,3 @@ -.vcd-screen-picker-modal { - padding: 1em; -} - .vcd-screen-picker-header-close-button { margin-left: auto; } diff --git a/src/renderer/components/settings/DeveloperOptions.tsx b/src/renderer/components/settings/DeveloperOptions.tsx index 87c69a8..4ed5feb 100644 --- a/src/renderer/components/settings/DeveloperOptions.tsx +++ b/src/renderer/components/settings/DeveloperOptions.tsx @@ -4,18 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { BaseText, Button, Heading, Paragraph, TextButton } from "@vencord/types/components"; -import { - Margins, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalRoot, - ModalSize, - openModal, - useForceUpdater -} from "@vencord/types/utils"; -import { Toasts } from "@vencord/types/webpack/common"; +import { Button, Heading, Paragraph, TextButton } from "@vencord/types/components"; +import { Margins, useForceUpdater } from "@vencord/types/utils"; +import { Modal, openModal, Toasts } from "@vencord/types/webpack/common"; import { Settings } from "shared/settings"; import { cl, SettingsComponent } from "./Settings"; @@ -26,31 +17,20 @@ export const DeveloperOptionsButton: SettingsComponent = ({ settings }) => { function openDeveloperOptionsModal(settings: Settings) { openModal(props => ( - - - - Vesktop Developer Options - - - + + Vencord Location + - -
- Vencord Location - - - - Debugging - -
- - -
-
-
-
+ + Debugging + +
+ + +
+ )); } diff --git a/src/renderer/components/settings/UserAssets.tsx b/src/renderer/components/settings/UserAssets.tsx index 71033f3..aac6b61 100644 --- a/src/renderer/components/settings/UserAssets.tsx +++ b/src/renderer/components/settings/UserAssets.tsx @@ -7,18 +7,8 @@ import "./UserAssets.css"; import { BaseText, Button, FormSwitch } from "@vencord/types/components"; -import { - Margins, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalRoot, - ModalSize, - openModal, - wordsFromCamel, - wordsToTitle -} from "@vencord/types/utils"; -import { showToast, useState } from "@vencord/types/webpack/common"; +import { Margins, wordsFromCamel, wordsToTitle } from "@vencord/types/utils"; +import { Modal, openModal, showToast, useState } from "@vencord/types/webpack/common"; import { UserAssetType } from "main/userAssets"; import { useSettings } from "renderer/settings"; @@ -32,22 +22,13 @@ export const UserAssetsButton: SettingsComponent = () => { function openAssetsModal() { openModal(props => ( - - - - User Assets - - - - - -
- {CUSTOMIZABLE_ASSETS.map(asset => ( - - ))} -
-
-
+ +
+ {CUSTOMIZABLE_ASSETS.map(asset => ( + + ))} +
+
)); } From 1c79187e6a84305d722f52c74ca7a14ab7a6a88d Mon Sep 17 00:00:00 2001 From: luk1337 Date: Mon, 17 Aug 2026 02:50:21 +0200 Subject: [PATCH 04/29] Make rounded corners and shadow customizable (#1281) Co-authored-by: V --- src/main/mainWindow.ts | 14 ++++++++++++-- src/renderer/components/settings/Settings.tsx | 14 ++++++++++++++ src/shared/settings.d.ts | 2 ++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 979629d..daf0c0c 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -312,8 +312,16 @@ function getWindowBoundsOptions(): BrowserWindowConstructorOptions { } function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { - const { staticTitle, transparencyOption, enableMenu, customTitleBar, splashTheming, splashBackground } = - Settings.store; + const { + staticTitle, + transparencyOption, + enableMenu, + enableShadow, + enableRoundedCorners, + customTitleBar, + splashTheming, + splashBackground + } = Settings.store; const { frameless, transparent, macosVibrancyStyle } = VencordSettings.store; @@ -336,6 +344,8 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { }, frame: !noFrame, autoHideMenuBar: enableMenu, + hasShadow: enableShadow !== false, + roundedCorners: enableRoundedCorners !== false, ...getWindowBoundsOptions() }; diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index e0d0b0d..add6698 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -74,6 +74,20 @@ const SettingsOptions: Record> defaultValue: false, disabled: () => Settings.store.customTitleBar ?? isWindows }, + { + key: "enableShadow", + title: "Enable Window Shadow", + description: "Enables the window shadow. Requires a full restart.", + defaultValue: true, + disabled: () => Settings.store.customTitleBar !== true + }, + { + key: "enableRoundedCorners", + title: "Enable Rounded Corners", + description: "Enables rounded corners. Requires a full restart.", + defaultValue: true, + disabled: () => Settings.store.customTitleBar !== true + }, { key: "enableSplashScreen", title: "Enable Splash Screen", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index f992d61..53065c9 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -20,6 +20,8 @@ export interface Settings { openLinksWithElectron?: boolean; staticTitle?: boolean; enableMenu?: boolean; + enableShadow?: boolean; + enableRoundedCorners?: boolean; disableSmoothScroll?: boolean; hardwareAcceleration?: boolean; hardwareVideoAcceleration?: boolean; From 592133ba8dc66d2350c6884e0f5e975cb1a5906d Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Aug 2026 02:51:24 +0200 Subject: [PATCH 05/29] v1.6.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 31e8790..266e57b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vesktop", - "version": "1.6.5", + "version": "1.6.6", "private": true, "description": "Vesktop is a custom Discord desktop app", "keywords": [], From b96b9f3a4161d53a516aca0b5d0c5fd57e84c22e Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 17 Aug 2026 20:17:46 +0200 Subject: [PATCH 06/29] new issue & pr templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 96 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 12 ++- .github/ISSUE_TEMPLATE/dev-issue.yml | 20 ----- .github/ISSUE_TEMPLATE/feature_request.yml | 45 ++++++++++ .github/pull_request_template.md | 12 +++ 5 files changed, 162 insertions(+), 23 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/dev-issue.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..9670471 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,96 @@ +name: Bug/Crash Report +description: Create a bug or crash report for Vesktop. +labels: [bug] +title: "[Bug] " + +body: + - type: markdown + attributes: + value: | + GitHub Issues are for development, not support! + + Vesktop and Vencord are two separate things. This issue tracker is only for Vesktop. If your Vesktop crashes, it is very likely an issue with Vencord, not Vesktop. + + If you are experiencing any of the following issues, go to our [Discord server](https://discord.gg/D9uwnFnqmd) for support: + - Vesktop doesn't work or crashes + - A Vencord plugin doesn't work anymore + - You are having issues installing Vesktop + - You want to ask a question about Vesktop, Vencord or one of its plugins + + - type: input + id: vesktop-version + attributes: + label: Vesktop Version + placeholder: 1.6.7 + validations: + required: true + + - type: input + id: os + attributes: + label: Operation System + placeholder: e.g. Windows 11, macOS Tahoe, Fedora Linux 44 (GNOME), Arch Linux (Hyprland) + validations: + required: true + + - type: input + id: install-method + attributes: + label: Install Method + placeholder: e.g. Setup exe, dmg, Flatpak, rpm, vesktop-git AUR + validations: + required: true + + - type: textarea + id: bug-description + attributes: + label: What happens when the bug or crash occurs? + description: Where does this bug or crash occur, when does it occur, etc. + placeholder: The bug/crash happens sometimes when I do ..., causing this to not work/the app to crash. I think it happens because of ... + validations: + required: true + + - type: textarea + id: expected-behaviour + attributes: + label: What is the expected behaviour? + description: Simply detail what the expected behaviour is. + placeholder: I expect Vesktop/Discord to open the ... page instead of ..., it prevents me from doing ... + validations: + required: true + + - type: textarea + id: steps-to-take + attributes: + label: How do you recreate this bug or crash? + description: Give us a list of steps in order to recreate the bug or crash. + placeholder: | + 1. Do ... + 2. Then ... + 3. Do this ..., ... and then ... + 4. Observe "the bug" or "the crash" + validations: + required: true + + - type: textarea + id: crash-log + attributes: + label: Errors + description: Open the Developer Console with `Ctrl+Shift+i` / `Cmd+Option+i`. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them between the "```". Run Vesktop from the command line to get console output and also paste that here + value: | + ``` + Replace this text with your crash-log. + ``` + validations: + required: false + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + description: We only accept reports for bugs that happen on official builds on Discord Stable. Canary and PTB are Development branches and may be unstable + options: + - label: I've searched existing issues and this hasn't been reported before + - label: I installed Vesktop via an official method (download from vesktop.dev or from source), not via something like Nix packages + - label: This is not a support request + - label: I am willing to submit a fix for this myself diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 471fd51..9e96e5f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,11 @@ blank_issues_enabled: false contact_links: - - name: Vencord Support Server - url: https://discord.gg/D9uwnFnqmd - about: "Need Help? Join our support server and ask in the #vesktop-support channel!" + - name: 💬 Discord Community + url: https://discord.gg/D9uwnFnqmd + about: For plugin requests, support questions, and general help - join our Discord server + - name: 🔌 Plugin Requests + url: https://discord.gg/D9uwnFnqmd + about: Want a new plugin? Request it in our Discord community, not here + - name: ❓ Support & Questions + url: https://discord.gg/D9uwnFnqmd + about: Need help? Ask in our Discord server for faster responses diff --git a/.github/ISSUE_TEMPLATE/dev-issue.yml b/.github/ISSUE_TEMPLATE/dev-issue.yml deleted file mode 100644 index 501989b..0000000 --- a/.github/ISSUE_TEMPLATE/dev-issue.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Vesktop Developer Issue -description: Reserved for Vesktop Developers. Join our support server for support. - -body: - - type: markdown - attributes: - value: | - # This form is reserved for Vesktop Developers. Do not open an issue. - - Instead, use the [#vesktop-support channel](https://discord.com/channels/1015060230222131221/1345457031426871417) on our [Discord server](https://vencord.dev/discord) for help and reporting issues. - - Your issue will be closed immediately with no comment and you will be blocked if you ignore this. - - This is because 99% of issues are not actually bugs, but rather user or system issues and it adds a lot of noise to our development process. - - type: textarea - id: content - attributes: - label: Content - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..2a8d59f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,45 @@ +name: Feature Request +description: Have an idea for a new feature? Request it here! No plugin requests, go to our Discord server for that +labels: [enhancement] +title: "[Feature] <title>" + +body: + - type: markdown + attributes: + value: | + This form is not for any of the following: + - Plugin requests — Go to our [Discord server](https://discord.gg/D9uwnFnqmd) for that + - Feature requests for plugins — Go to our [Discord server](https://discord.gg/D9uwnFnqmd) for that + + - type: textarea + id: feature-description + attributes: + label: A clear and concise description of the feature you'd like to see + validations: + required: true + + - type: textarea + id: implementation-notes + attributes: + label: Implementation Notes + description: If you have ideas about how this could be implemented technically, share them here + validations: + required: false + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Screenshots, mockups, examples from other apps, etc. + validations: + required: false + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + options: + - label: I've searched existing issues and this hasn't been suggested before + - label: This is a **core modification feature**, not a plugin request (those go in Discord) + - label: This feature would benefit most users, not just a specific use case + - label: I am willing to work on this myself diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..fc8ae34 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,12 @@ +<!-- +We do not accept PRs that were created by AI. You will be permanently blocked with no further warning if you submit AI generated PRs. +Also do not use AI in communication, it makes me ill +--> + +## Describe your Changes + +## Screenshots (if applicable) + +## Checklist before submitting +<!-- Hint: [x] this is how to check boxes --> +- [ ] This pull request was written by me, and not an AI agent From 62a1564e55e95c2d0b254e193b1c50c771d29455 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 17 Aug 2026 20:20:02 +0200 Subject: [PATCH 07/29] template fixes --- .github/ISSUE_TEMPLATE/bug_report.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 9670471..77f9381 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -21,14 +21,14 @@ body: id: vesktop-version attributes: label: Vesktop Version - placeholder: 1.6.7 + placeholder: e.g. 1.6.7 validations: required: true - type: input id: os attributes: - label: Operation System + label: Operating System placeholder: e.g. Windows 11, macOS Tahoe, Fedora Linux 44 (GNOME), Arch Linux (Hyprland) validations: required: true @@ -76,11 +76,8 @@ body: id: crash-log attributes: label: Errors - description: Open the Developer Console with `Ctrl+Shift+i` / `Cmd+Option+i`. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them between the "```". Run Vesktop from the command line to get console output and also paste that here - value: | - ``` - Replace this text with your crash-log. - ``` + render: text + description: Open the Developer Console with `Ctrl+Shift+i` / `Cmd+Option+i`. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them. Run Vesktop from the command line to get console output and also paste that here validations: required: false From b89779c4d4a1fc5d9f640122440d1eecc1961d53 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 00:35:52 +0200 Subject: [PATCH 08/29] ci: switch metainfo generation to workflow_dispatch This is needed so we can start using immutable releases --- .github/workflows/meta.yml | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 85cae92..dd532b7 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -1,9 +1,6 @@ -name: Update metainfo on release +name: Upload release metainfo on: - release: - types: - - published workflow_dispatch: permissions: @@ -15,6 +12,18 @@ jobs: steps: - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - name: Get latest tag + id: latest_tag + run: | + tag=$(git tag --sort=-creatordate | head -n1) + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Checkout latest tag + run: git checkout "${{ steps.latest_tag.outputs.tag }}" + - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 @@ -28,11 +37,8 @@ jobs: - name: Update metainfo run: pnpm generateMeta - - name: Commit and merge in changes + - name: Upload metainfo to release run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - gh release upload "${{ github.event.release.tag_name }}" dist/dev.vencord.Vesktop.metainfo.xml + gh release upload "${{ steps.latest_tag.outputs.tag }}" dist/dev.vencord.Vesktop.metainfo.xml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c9ded5c658a57d61abbdb608b7c6cedc9ed2c060 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 04:28:00 +0200 Subject: [PATCH 09/29] downgrade electron - fixes tray on Linux --- package.json | 2 +- pnpm-lock.yaml | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 266e57b..294a9c4 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@types/react": "19.2.9", "@vencord/types": "^1.15.1", "dotenv": "^17.3.1", - "electron": "^43.4.0", + "electron": "43.2.0", "electron-builder": "^26.15.3", "esbuild": "^0.28.2", "eslint": "^10.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fde678f..a776af8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,8 +38,8 @@ importers: specifier: ^17.3.1 version: 17.4.2 electron: - specifier: ^43.4.0 - version: 43.4.0(supports-color@7.2.0) + specifier: 43.2.0 + version: 43.2.0(supports-color@7.2.0) electron-builder: specifier: ^26.15.3 version: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) @@ -570,6 +570,7 @@ packages: '@xmldom/xmldom@0.8.13': resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} @@ -1042,8 +1043,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@43.4.0: - resolution: {integrity: sha512-3qxGF0CeQbiox5oWV1JlbWGQ1VerbmDhTFqW4sJ8h7uqTHniFYPObXJcDna0DMh32et0fFyKzz0YY8lJv3t5jg==} + electron@43.2.0: + resolution: {integrity: sha512-80zvrgG7ZRXD+tD0IyLvrnN9n+veSxadMRsMaC9wKKP3iUbtC7rGM8+dVuCmOb0Rrwwv8ESW4awnUZh9Hbp1fA==} engines: {node: '>= 22.12.0'} hasBin: true @@ -3967,7 +3968,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@43.4.0(supports-color@7.2.0): + electron@43.2.0(supports-color@7.2.0): dependencies: '@electron-internal/extract-zip': 1.0.5 '@electron/get': 5.1.0(supports-color@7.2.0) From 7d087e727561a91e5dfa20ee39a4b8c09322264e Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 04:25:17 +0200 Subject: [PATCH 10/29] Revert "Update Venmic to 7.1.0 (#1291)" This reverts commit f11585586fa111bedff50cf632186b2d37d220ec. Because this upgrades venmic to require GLIBCXX_3.4.35 (gcc16), which is too new and won't work for most users --- package.json | 2 +- pnpm-lock.yaml | 10 +- pnpm-workspace.yaml | 3 +- src/main/venmic.ts | 76 +++++++------ src/preload/VesktopNative.ts | 1 - src/renderer/components/ScreenSharePicker.tsx | 104 +++++++++--------- src/shared/IpcEvents.ts | 1 - src/shared/settings.d.ts | 1 - 8 files changed, 101 insertions(+), 97 deletions(-) diff --git a/package.json b/package.json index 294a9c4..68d26c1 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "electron-updater": "6.6.2" }, "optionalDependencies": { - "@vencord/venmic": "^7.1.0" + "@vencord/venmic": "^6.1.0" }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a776af8..3e09751 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: version: 3.7.0 optionalDependencies: '@vencord/venmic': - specifier: ^7.1.0 - version: 7.1.0(supports-color@7.2.0) + specifier: ^6.1.0 + version: 6.1.0(supports-color@7.2.0) packages/libvesktop: devDependencies: @@ -562,8 +562,8 @@ packages: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 - '@vencord/venmic@7.1.0': - resolution: {integrity: sha512-HQpZoUKGz8j7m1+1BCgE+7B6T/+/IArVO8km7SjsWxe/5+2YblAs0Fwgy9C9XqCCir/u0+F1FMqrQQUX2PATYw==} + '@vencord/venmic@6.1.0': + resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} engines: {node: '>=14.15'} os: [linux] @@ -3324,7 +3324,7 @@ snapshots: ts-pattern: 5.9.0 type-fest: 5.8.0 - '@vencord/venmic@7.1.0(supports-color@7.2.0)': + '@vencord/venmic@6.1.0(supports-color@7.2.0)': dependencies: cmake-js: 7.4.0(supports-color@7.2.0) node-addon-api: 8.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8306458..23f5fc8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,5 +13,4 @@ recursiveInstall: false packages: - packages/* minimumReleaseAgeExclude: - - electron - - '@vencord/*' + - electron \ No newline at end of file diff --git a/src/main/venmic.ts b/src/main/venmic.ts index 80192c5..b6a0d08 100644 --- a/src/main/venmic.ts +++ b/src/main/venmic.ts @@ -66,23 +66,28 @@ function getRendererAudioServicePid() { ); } -function buildLinkData({ include, exclude }: { include?: Node[]; exclude?: Node[] }) { - const pid = getRendererAudioServicePid(); +ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => { + const audioPid = getRendererAudioServicePid(); - const { mute, ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround, onlySpeakers, onlyDefaultSpeakers } = - Settings.store.audio ?? {}; + const { granularSelect } = Settings.store.audio ?? {}; + + const targets = obtainVenmic() + ?.list(granularSelect ? ["node.name"] : undefined) + .filter(s => s["application.process.id"] !== audioPid); + + return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; +}); + +ipcMain.handle(IpcEvents.VIRT_MIC_START, (_, include: Node[]) => { + const pid = getRendererAudioServicePid(); + const { ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround } = Settings.store.audio ?? {}; const data: LinkData = { - mute: mute ?? true, - include: include ?? [], - exclude: exclude ?? [], - only_speakers: onlySpeakers, - ignore_devices: ignoreDevices, - only_default_speakers: onlyDefaultSpeakers + include, + exclude: [{ "application.process.id": pid }], + ignore_devices: ignoreDevices }; - data.exclude.push({ "application.process.id": pid }); - if (ignoreInputMedia ?? true) { data.exclude.push({ "media.class": "Stream/Input/Audio" }); } @@ -95,31 +100,36 @@ function buildLinkData({ include, exclude }: { include?: Node[]; exclude?: Node[ data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; } - return data; -} - -ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => { - const audioPid = getRendererAudioServicePid(); - - const { granularSelect } = Settings.store.audio ?? {}; - - const targets = obtainVenmic() - ?.list(granularSelect ? [] : ["application.name", "node.name"]) - .filter(s => s["application.process.id"] !== audioPid); - - return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; -}); - -ipcMain.handle(IpcEvents.VIRT_MIC_START, (_, include: Node[]) => { - return obtainVenmic()?.link(buildLinkData({ include })); + return obtainVenmic()?.link(data); }); ipcMain.handle(IpcEvents.VIRT_MIC_START_SYSTEM, (_, exclude: Node[]) => { - return obtainVenmic()?.link(buildLinkData({ exclude })); -}); + const pid = getRendererAudioServicePid(); -ipcMain.handle(IpcEvents.VIRT_MIC_UNMUTE, () => { - return obtainVenmic()?.unmute(); + const { workaround, ignoreDevices, ignoreInputMedia, ignoreVirtual, onlySpeakers, onlyDefaultSpeakers } = + Settings.store.audio ?? {}; + + const data: LinkData = { + include: [], + exclude: [{ "application.process.id": pid }, ...exclude], + only_speakers: onlySpeakers, + ignore_devices: ignoreDevices, + only_default_speakers: onlyDefaultSpeakers + }; + + if (ignoreInputMedia ?? true) { + data.exclude.push({ "media.class": "Stream/Input/Audio" }); + } + + if (ignoreVirtual) { + data.exclude.push({ "node.virtual": "true" }); + } + + if (workaround) { + data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; + } + + return obtainVenmic()?.link(data); }); ipcMain.handle(IpcEvents.VIRT_MIC_STOP, () => obtainVenmic()?.unlink()); diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index 1dd6710..e11fae7 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -92,7 +92,6 @@ export const VesktopNative = { >(IpcEvents.VIRT_MIC_LIST), start: (include: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START, include), startSystem: (exclude: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START_SYSTEM, exclude), - unmute: () => invoke<void>(IpcEvents.VIRT_MIC_UNMUTE), stop: () => invoke<void>(IpcEvents.VIRT_MIC_STOP) }, clipboard: { diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index 69d8d63..4f8d7aa 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -121,25 +121,15 @@ addPatch({ if (isLinux) { onceReady.then(() => { - const ownsStream = (streamKey: string) => { - return streamKey.split(":").at(-1) === UserStore.getCurrentUser().id; - }; - FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { - if (!ownsStream(streamKey)) { + const owner = streamKey.split(":").at(-1); + + if (owner !== UserStore.getCurrentUser().id) { return; } VesktopNative.virtmic.stop(); }); - - FluxDispatcher.subscribe("STREAM_UPDATE", ({ streamKey }: { streamKey: string }) => { - if (!ownsStream(streamKey)) { - return; - } - - VesktopNative.virtmic.unmute(); - }); }); } @@ -226,13 +216,6 @@ function AudioSettingsModal({ actions={[{ text: "Back", variant: "secondary", onClick: close }]} > <div className={cl("venmic-settings")}> - <FormSwitch - title="Initial Mute" - description="Fix an initial audio spike caused by chromium." - hideBorder - onChange={v => (Settings.audio = { ...Settings.audio, mute: v })} - value={Settings.audio?.mute ?? true} - /> <FormSwitch title="Microphone Workaround" description="Work around an issue that causes the microphone to be shared instead of the correct audio. Only enable if you're experiencing this issue." @@ -464,61 +447,78 @@ function isSpecialSource(value?: AudioSource | AudioSources): value is SpecialSo return typeof value === "string"; } +function hasMatchingProps(value: Node, other: Node) { + return Object.keys(value).every(key => value[key] === other[key]); +} + function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] { if (isSpecialSource(node)) { return [{ name: node, value: node }]; } + const rtn: AudioItem[] = []; + const mediaClass = node["media.class"]; if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) { - return []; + return rtn; } if (!deviceSelect && node["device.id"]) { - return []; + return rtn; } - const preferred = ["application.name", "node.description", "node.name", "application.process.binary"] as const; - const prop = preferred.find(prop => node[prop]); + const name = node["application.name"]; - if (!prop) { - return []; + if (name) { + rtn.push({ name: name, value: { "application.name": name } }); } - const name = node[prop]!; - const items: AudioItem[] = [{ name: name, value: { [prop]: name } }]; - if (!granularSelect) { - return items; + return rtn; } - let granularName = name; - const granularProps: Node = { [prop]: name }; + const rawName = node["node.name"]; - const append = (name: string, brackets: string) => { - const value = node[name]; + if (!name) { + rtn.push({ name: rawName, value: { "node.name": rawName } }); + } - if (!value) { - return; - } + const binary = node["application.process.binary"]; - granularName += ` ${brackets[0]}${value}${brackets[1]}`; - granularProps[name] = value; - }; + if (!name && binary) { + rtn.push({ name: binary, value: { "application.process.binary": binary } }); + } - append("application.process.id", "<>"); - append("application.process.binary", "()"); - append("media.name", "[]"); + const pid = node["application.process.id"]; - items.push({ name: granularName, value: granularProps }); + const first = rtn[0]; + const firstValues = first.value as Node; - return items; -} + if (pid) { + rtn.push({ + name: `${first.name} (${pid})`, + value: { ...firstValues, "application.process.id": pid } + }); + } -function hasMatchingProps(value: Node, other: Node) { - const keys = Object.keys(value); - return keys.length === Object.keys(other).length && keys.every(key => value[key] === other[key]); + const mediaName = node["media.name"]; + + if (mediaName) { + rtn.push({ + name: `${first.name} [${mediaName}]`, + value: { ...firstValues, "media.name": mediaName } + }); + } + + if (mediaClass) { + rtn.push({ + name: `${first.name} [${mediaClass}]`, + value: { ...firstValues, "media.class": mediaClass } + }); + } + + return rtn; } function isItemSelected(sources?: AudioSources) { @@ -647,10 +647,9 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(includeSources)} select={updateItems(setIncludeSources, includeSources)} - serialize={JSON.stringify} + serialize={String} popoutPosition="top" closeOnSelect={false} - renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> @@ -668,10 +667,9 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(excludeSources)} select={updateItems(setExcludeSources, excludeSources)} - serialize={JSON.stringify} + serialize={String} popoutPosition="top" closeOnSelect={false} - renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index 55efe80..13f27b4 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -49,7 +49,6 @@ export const enum IpcEvents { VIRT_MIC_LIST = "VCD_VIRT_MIC_LIST", VIRT_MIC_START = "VCD_VIRT_MIC_START", VIRT_MIC_START_SYSTEM = "VCD_VIRT_MIC_START_ALL", - VIRT_MIC_UNMUTE = "VCD_VIRT_MIC_UNMUTE", VIRT_MIC_STOP = "VCD_VIRT_MIC_STOP", CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 53065c9..9eb1045 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -50,7 +50,6 @@ export interface Settings { ignoreDevices?: boolean; ignoreInputMedia?: boolean; - mute?: boolean; onlySpeakers?: boolean; onlyDefaultSpeakers?: boolean; }; From 275c9f1d5b1ad27b8ee52b0557569b1a637cf40f Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 04:30:59 +0200 Subject: [PATCH 11/29] six seven --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68d26c1..5da4856 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vesktop", - "version": "1.6.6", + "version": "1.6.7", "private": true, "description": "Vesktop is a custom Discord desktop app", "keywords": [], From c2c46643aa7f8999e198570d20f6ac63f7039108 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 04:50:03 +0200 Subject: [PATCH 12/29] fix updater --- src/main/vesktopProtocol.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/vesktopProtocol.ts b/src/main/vesktopProtocol.ts index c05f5fe..7d18740 100644 --- a/src/main/vesktopProtocol.ts +++ b/src/main/vesktopProtocol.ts @@ -23,3 +23,16 @@ app.whenReady().then(() => { } }); }); + +protocol.registerSchemesAsPrivileged([ + { + scheme: "vesktop", + privileges: { + standard: true, + secure: true, + supportFetchAPI: true, + corsEnabled: true, + stream: true + } + } +]); From ceabe1b860bca785e31e047606dc6df131562d85 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 04:53:15 +0200 Subject: [PATCH 13/29] fix audio source picker --- src/renderer/components/ScreenSharePicker.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index 4f8d7aa..9f367bd 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -647,9 +647,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(includeSources)} select={updateItems(setIncludeSources, includeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> @@ -667,9 +668,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(excludeSources)} select={updateItems(setExcludeSources, excludeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> From 9c6019f29111f38b8ce9602b1f4e834a3618d7ff Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 18 Aug 2026 17:35:34 +0200 Subject: [PATCH 14/29] generateMeta: support drafts --- .github/workflows/meta.yml | 2 ++ scripts/utils/generateMeta.mts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index dd532b7..989d226 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -36,6 +36,8 @@ jobs: - name: Update metainfo run: pnpm generateMeta + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload metainfo to release run: | diff --git a/scripts/utils/generateMeta.mts b/scripts/utils/generateMeta.mts index 486f657..9120a2a 100644 --- a/scripts/utils/generateMeta.mts +++ b/scripts/utils/generateMeta.mts @@ -46,7 +46,8 @@ function generateDescription(description: string, descriptionNode: Element) { const releases = await fetch("https://api.github.com/repos/Vencord/Vesktop/releases", { headers: { Accept: "application/vnd.github+json", - "X-Github-Api-Version": "2022-11-28" + "X-Github-Api-Version": "2022-11-28", + Authorization: `Bearer ${process.env.GITHUB_TOKEN}` } }).then(res => res.json()); From cb9c55fe1aa4cd1d3fbe23bddfdca02627c8c372 Mon Sep 17 00:00:00 2001 From: vocal <280490408+vocaldll@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:30:48 +0200 Subject: [PATCH 15/29] Windows: fix screenshare containing other participants' voices (#1294) --- src/main/screenShare.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index a96b1ce..91fe0c5 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -5,6 +5,7 @@ */ import { desktopCapturer, session, Streams } from "electron"; +import { release } from "os"; import type { StreamPick } from "renderer/components/ScreenSharePicker"; import { IpcCommands, IpcEvents } from "shared/IpcEvents"; @@ -14,6 +15,8 @@ import { handle } from "./utils/ipcWrappers"; const isWayland = process.platform === "linux" && (process.env.XDG_SESSION_TYPE === "wayland" || !!process.env.WAYLAND_DISPLAY); +const supportsLoopbackWithoutChrome = process.platform === "win32" && Number(release().split(".").pop()) >= 20348; + export function registerScreenShareHandler() { handle(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, async (_, id: string) => { const sources = await desktopCapturer.getSources({ @@ -78,7 +81,10 @@ export function registerScreenShareHandler() { const streams: Streams = { video: source }; - if (choice.audio && process.platform === "win32") streams.audio = "loopback"; + if (choice.audio && process.platform === "win32") { + // @ts-expect-error loopbackWithoutChrome is real but not documented + streams.audio = supportsLoopbackWithoutChrome ? "loopbackWithoutChrome" : "loopback"; + } callback(streams); }); From 3da54b777c30e385ab18b9334c4dbc81ca5884d9 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 24 Aug 2026 13:31:54 +0200 Subject: [PATCH 16/29] allow zooming with numpad --- src/main/mainWindow.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index daf0c0c..a8323f8 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -156,6 +156,25 @@ function initMenuBar(win: BrowserWindow) { accelerator: "CmdOrCtrl+=", role: "zoomIn", visible: false + }, + // numpad zooms + { + label: "Zoom in (hidden)", + accelerator: "CmdOrCtrl+numadd", + role: "zoomIn", + visible: false + }, + { + label: "Zoom out (hidden)", + accelerator: "CmdOrCtrl+numsub", + role: "zoomOut", + visible: false + }, + { + label: "Reset Zoom (hidden)", + accelerator: "CmdOrCtrl+num0", + role: "resetZoom", + visible: false } ] satisfies MenuItemList; From 09ce424b304f3fef77ba50ede6190e97e351bad2 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 24 Aug 2026 14:14:39 +0200 Subject: [PATCH 17/29] rework Custom Titlebar setting -> Native Titlebar --- src/main/mainWindow.ts | 12 ++++++------ src/renderer/components/settings/Settings.tsx | 16 ++++++++-------- src/shared/settings.d.ts | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index a8323f8..9f5ff60 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -337,14 +337,14 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { enableMenu, enableShadow, enableRoundedCorners, - customTitleBar, + nativeTitleBar, splashTheming, splashBackground } = Settings.store; - const { frameless, transparent, macosVibrancyStyle } = VencordSettings.store; + const { transparent, macosVibrancyStyle } = VencordSettings.store; - const noFrame = frameless === true || customTitleBar === true; + const frameless = nativeTitleBar !== true; const backgroundColor = splashTheming !== false ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; @@ -361,7 +361,7 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { // disable renderer backgrounding to prevent the app from unloading when in the background backgroundThrottling: false }, - frame: !noFrame, + frame: !frameless, autoHideMenuBar: enableMenu, hasShadow: enableShadow !== false, roundedCorners: enableRoundedCorners !== false, @@ -377,7 +377,7 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { options.backgroundColor = "#00000000"; options.backgroundMaterial = transparencyOption; - if (customTitleBar) { + if (frameless) { options.transparent = true; } } @@ -407,7 +407,7 @@ function createMainWindow() { const win = (mainWin = new BrowserWindow(buildBrowserWindowOptions())); win.setMenuBarVisibility(false); - if (process.platform === "darwin" && Settings.store.customTitleBar) win.setWindowButtonVisibility(false); + if (process.platform === "darwin" && Settings.store.nativeTitleBar) win.setWindowButtonVisibility(false); win.on("close", e => { const useTray = !isDeckGameMode && Settings.store.minimizeToTray !== false && Settings.store.tray !== false; diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index add6698..d509c38 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -11,7 +11,7 @@ import { BaseText, Divider, ErrorBoundary } from "@vencord/types/components"; import { ComponentType } from "react"; import { WebRTCIPHandlingPolicyPicker } from "renderer/components/settings/WebRTCIPHandlingPolicyPicker"; import { Settings, useSettings } from "renderer/settings"; -import { isMac, isWindows } from "renderer/utils"; +import { isMac } from "renderer/utils"; import { AutoStartToggle } from "./AutoStartToggle"; import { DeveloperOptionsButton } from "./DeveloperOptions"; @@ -56,10 +56,10 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> ], "User Interface": [ { - key: "customTitleBar", - title: "Discord Titlebar", - description: "Use Discord's custom title bar instead of the native system one. Requires a full restart.", - defaultValue: isWindows + key: "nativeTitleBar", + title: "Native Titlebar", + description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart.", + defaultValue: false }, { key: "staticTitle", @@ -72,21 +72,21 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> title: "Enable Menu Bar", description: "Enables the application menu bar. Press ALT to toggle visibility.", defaultValue: false, - disabled: () => Settings.store.customTitleBar ?? isWindows + disabled: () => Settings.store.nativeTitleBar !== true }, { key: "enableShadow", title: "Enable Window Shadow", description: "Enables the window shadow. Requires a full restart.", defaultValue: true, - disabled: () => Settings.store.customTitleBar !== true + disabled: () => Settings.store.nativeTitleBar === true }, { key: "enableRoundedCorners", title: "Enable Rounded Corners", description: "Enables rounded corners. Requires a full restart.", defaultValue: true, - disabled: () => Settings.store.customTitleBar !== true + disabled: () => Settings.store.nativeTitleBar === true }, { key: "enableSplashScreen", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 9eb1045..3533e45 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -30,7 +30,7 @@ export interface Settings { enableTaskbarFlashing?: boolean; disableMinSize?: boolean; clickTrayToShowHide?: boolean; - customTitleBar?: boolean; + nativeTitleBar?: boolean; enableSplashScreen?: boolean; splashTheming?: boolean; From fd7ada3cd82c4253ca1968e5c2a52b770e98480f Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 24 Aug 2026 14:40:50 +0200 Subject: [PATCH 18/29] Improve settings default handling --- src/main/main.ts | 2 +- src/main/mainWindow.ts | 15 +++--- src/main/settings.ts | 10 +++- src/main/splash.ts | 2 +- src/main/utils/mergeDefaults.ts | 24 +++++++++ src/renderer/appBadge.ts | 2 +- .../components/settings/AutoStartToggle.tsx | 2 +- .../settings/NotificationBadgeToggle.tsx | 2 +- src/renderer/components/settings/Settings.tsx | 51 ++++++------------- .../components/settings/UserAssets.tsx | 2 +- .../settings/WebRTCIPHandlingPolicyPicker.tsx | 2 +- src/renderer/settings.ts | 8 +-- src/shared/defaultSettings.ts | 33 ++++++++++++ src/shared/settings.d.ts | 46 ++++++++--------- 14 files changed, 123 insertions(+), 78 deletions(-) create mode 100644 src/main/utils/mergeDefaults.ts create mode 100644 src/shared/defaultSettings.ts diff --git a/src/main/main.ts b/src/main/main.ts index 0c81512..7230e4d 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -40,7 +40,7 @@ function init() { app.commandLine.removeSwitch("enable-features"); app.commandLine.removeSwitch("disable-features"); - if (hardwareAcceleration === false || process.argv.includes("--disable-gpu")) { + if (!hardwareAcceleration || process.argv.includes("--disable-gpu")) { enableHardwareAcceleration = false; app.disableHardwareAcceleration(); } else { diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 9f5ff60..08bfe2e 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -344,12 +344,11 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { const { transparent, macosVibrancyStyle } = VencordSettings.store; - const frameless = nativeTitleBar !== true; - const backgroundColor = - splashTheming !== false ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; + const frameless = !nativeTitleBar; + const backgroundColor = splashTheming ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; const options: BrowserWindowConstructorOptions = { - show: Settings.store.enableSplashScreen === false && !CommandLine.values["start-minimized"], + show: !Settings.store.enableSplashScreen && !CommandLine.values["start-minimized"], backgroundColor, webPreferences: { nodeIntegration: false, @@ -363,8 +362,8 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { }, frame: !frameless, autoHideMenuBar: enableMenu, - hasShadow: enableShadow !== false, - roundedCorners: enableRoundedCorners !== false, + hasShadow: enableShadow, + roundedCorners: enableRoundedCorners, ...getWindowBoundsOptions() }; @@ -410,7 +409,7 @@ function createMainWindow() { if (process.platform === "darwin" && Settings.store.nativeTitleBar) win.setWindowButtonVisibility(false); win.on("close", e => { - const useTray = !isDeckGameMode && Settings.store.minimizeToTray !== false && Settings.store.tray !== false; + const useTray = !isDeckGameMode && Settings.store.minimizeToTray && Settings.store.tray; if (isQuitting || (process.platform !== "darwin" && !useTray)) return; e.preventDefault(); @@ -470,7 +469,7 @@ export async function createWindows() { const startMinimized = CommandLine.values["start-minimized"]; let splash: BrowserWindow | undefined; - if (Settings.store.enableSplashScreen !== false) { + if (Settings.store.enableSplashScreen) { splash = createSplashWindow(startMinimized); // SteamOS letterboxes and scales it terribly, so just full screen it diff --git a/src/main/settings.ts b/src/main/settings.ts index f23cbe5..267e2bf 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -7,15 +7,17 @@ import { type Settings as TVencordSettings } from "@vencord/types/Vencord"; import { mkdirSync, readFileSync, writeFileSync } from "fs"; import { dirname, join } from "path"; +import { DefaultVesktopSettings } from "shared/defaultSettings"; import type { Settings as TSettings, State as TState } from "shared/settings"; import { SettingsStore } from "shared/utils/SettingsStore"; import { DATA_DIR, VENCORD_SETTINGS_FILE } from "./constants"; +import { mergeDefaults } from "./utils/mergeDefaults"; const SETTINGS_FILE = join(DATA_DIR, "settings.json"); const STATE_FILE = join(DATA_DIR, "state.json"); -function loadSettings<T extends object = any>(file: string, name: string) { +function loadSettings<T extends object = any>(file: string, name: string, defaults?: T) { let settings = {} as T; try { const content = readFileSync(file, "utf8"); @@ -26,6 +28,10 @@ function loadSettings<T extends object = any>(file: string, name: string) { } } catch {} + if (defaults) { + mergeDefaults(settings, defaults); + } + const store = new SettingsStore(settings); store.addGlobalChangeListener(o => { try { @@ -39,6 +45,6 @@ function loadSettings<T extends object = any>(file: string, name: string) { return store; } -export const Settings = loadSettings<TSettings>(SETTINGS_FILE, "Vesktop settings"); +export const Settings = loadSettings<TSettings>(SETTINGS_FILE, "Vesktop settings", DefaultVesktopSettings); export const VencordSettings = loadSettings<TVencordSettings>(VENCORD_SETTINGS_FILE, "Vencord settings"); export const State = loadSettings<TState>(STATE_FILE, "Vesktop state"); diff --git a/src/main/splash.ts b/src/main/splash.ts index cfc7746..e11ec9d 100644 --- a/src/main/splash.ts +++ b/src/main/splash.ts @@ -26,7 +26,7 @@ export function createSplashWindow(startMinimized = false) { const { splashBackground, splashColor, splashTheming, splashPixelated } = Settings.store; - if (splashTheming !== false) { + if (splashTheming) { if (splashColor) { const semiTransparentSplashColor = splashColor.replace("rgb(", "rgba(").replace(")", ", 0.2)"); diff --git a/src/main/utils/mergeDefaults.ts b/src/main/utils/mergeDefaults.ts new file mode 100644 index 0000000..494d809 --- /dev/null +++ b/src/main/utils/mergeDefaults.ts @@ -0,0 +1,24 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2026 Vendicated and Vesktop contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Recursively merges defaults into an object and returns the same object + * @param obj Object + * @param defaults Defaults + * @returns obj + */ +export function mergeDefaults<T>(obj: T, defaults: T): T { + for (const key in defaults) { + const v = defaults[key]; + if (typeof v === "object" && !Array.isArray(v)) { + obj[key] ??= {} as any; + mergeDefaults(obj[key], v); + } else { + obj[key] ??= v; + } + } + return obj; +} diff --git a/src/renderer/appBadge.ts b/src/renderer/appBadge.ts index 97f3e36..bc9983f 100644 --- a/src/renderer/appBadge.ts +++ b/src/renderer/appBadge.ts @@ -14,7 +14,7 @@ let GuildReadStateStore: any; let NotificationSettingsStore: any; export function setBadge() { - if (Settings.store.appBadge === false) return; + if (!Settings.store.appBadge) return; try { const mentionCount = GuildReadStateStore.getTotalMentionCount(); diff --git a/src/renderer/components/settings/AutoStartToggle.tsx b/src/renderer/components/settings/AutoStartToggle.tsx index d99f2cd..a8ff5d9 100644 --- a/src/renderer/components/settings/AutoStartToggle.tsx +++ b/src/renderer/components/settings/AutoStartToggle.tsx @@ -27,7 +27,7 @@ export const AutoStartToggle: SettingsComponent = ({ settings }) => { <VesktopSettingsSwitch title="Auto Start Minimized" description={"Start Vesktop minimized when starting with system"} - value={settings.autoStartMinimized ?? false} + value={settings.autoStartMinimized} onChange={v => (settings.autoStartMinimized = v)} disabled={!autoStartEnabled} /> diff --git a/src/renderer/components/settings/NotificationBadgeToggle.tsx b/src/renderer/components/settings/NotificationBadgeToggle.tsx index 6e17e3d..bac9c38 100644 --- a/src/renderer/components/settings/NotificationBadgeToggle.tsx +++ b/src/renderer/components/settings/NotificationBadgeToggle.tsx @@ -14,7 +14,7 @@ export const NotificationBadgeToggle: SettingsComponent = ({ settings }) => { <VesktopSettingsSwitch title="Notification Badge" description="Show mention badge on the app icon" - value={settings.appBadge ?? true} + value={settings.appBadge} onChange={v => { settings.appBadge = v; if (v) setBadge(); diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index d509c38..d04b179 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -10,7 +10,7 @@ import { classNameFactory } from "@vencord/types/api/Styles"; import { BaseText, Divider, ErrorBoundary } from "@vencord/types/components"; import { ComponentType } from "react"; import { WebRTCIPHandlingPolicyPicker } from "renderer/components/settings/WebRTCIPHandlingPolicyPicker"; -import { Settings, useSettings } from "renderer/settings"; +import { getValueAndOnChange, Settings, useSettings } from "renderer/settings"; import { isMac } from "renderer/utils"; import { AutoStartToggle } from "./AutoStartToggle"; @@ -26,7 +26,6 @@ interface BooleanSetting { key: keyof typeof Settings.store; title: string; description: string; - defaultValue: boolean; disabled?(): boolean; invisible?(): boolean; } @@ -42,64 +41,55 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> { key: "hardwareAcceleration", title: "Hardware Acceleration", - description: "Enable hardware acceleration", - defaultValue: true + description: "Enable hardware acceleration" }, { key: "hardwareVideoAcceleration", title: "Video Hardware Acceleration", description: "Enable hardware video acceleration. This can improve performance of screenshare and video playback, but may cause graphical glitches and infinitely loading streams.", - defaultValue: false, - disabled: () => Settings.store.hardwareAcceleration === false + disabled: () => !Settings.store.hardwareAcceleration } ], "User Interface": [ { key: "nativeTitleBar", title: "Native Titlebar", - description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart.", - defaultValue: false + description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart." }, { key: "staticTitle", title: "Static Title", - description: 'Makes the window title "Vesktop" instead of changing to the current page', - defaultValue: false + description: 'Makes the window title "Vesktop" instead of changing to the current page' }, { key: "enableMenu", title: "Enable Menu Bar", description: "Enables the application menu bar. Press ALT to toggle visibility.", - defaultValue: false, disabled: () => Settings.store.nativeTitleBar !== true }, { key: "enableShadow", title: "Enable Window Shadow", description: "Enables the window shadow. Requires a full restart.", - defaultValue: true, disabled: () => Settings.store.nativeTitleBar === true }, { key: "enableRoundedCorners", title: "Enable Rounded Corners", description: "Enables rounded corners. Requires a full restart.", - defaultValue: true, disabled: () => Settings.store.nativeTitleBar === true }, { key: "enableSplashScreen", title: "Enable Splash Screen", description: - "Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading.", - defaultValue: true + "Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading." }, { key: "splashTheming", title: "Splash theming", - description: "Adapt the splash window colors to your custom theme", - defaultValue: true + description: "Adapt the splash window colors to your custom theme" }, WindowsTransparencyControls, UserAssetsButton @@ -109,34 +99,29 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> key: "tray", title: "Tray Icon", description: "Add a tray icon for Vesktop", - defaultValue: true, invisible: () => isMac }, { key: "minimizeToTray", title: "Minimize to tray", description: "Hitting X will make Vesktop minimize to the tray instead of closing", - defaultValue: true, invisible: () => isMac, - disabled: () => Settings.store.tray === false + disabled: () => !Settings.store.tray }, { key: "clickTrayToShowHide", title: "Hide/Show on tray click", - description: "Left clicking tray icon will toggle the vesktop window visibility.", - defaultValue: false + description: "Left clicking tray icon will toggle the vesktop window visibility." }, { key: "disableMinSize", title: "Disable minimum window size", - description: "Allows you to make the window as small as your heart desires", - defaultValue: false + description: "Allows you to make the window as small as your heart desires" }, { key: "disableSmoothScroll", title: "Disable smooth scrolling", - description: "Disables smooth scrolling", - defaultValue: false + description: "Disables smooth scrolling" } ], Notifications: [ @@ -144,23 +129,20 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> { key: "enableTaskbarFlashing", title: "Enable Taskbar Flashing", - description: "Flashes the app in your taskbar when you have new notifications.", - defaultValue: false + description: "Flashes the app in your taskbar when you have new notifications." } ], Miscellaneous: [ { key: "arRPC", title: "Rich Presence", - description: "Enables Rich Presence via arRPC", - defaultValue: false + description: "Enables Rich Presence via arRPC" }, { key: "openLinksWithElectron", title: "Open Links in app (experimental)", - description: "Opens links in a new Vesktop window instead of your web browser", - defaultValue: false + description: "Opens links in a new Vesktop window instead of your web browser" }, WebRTCIPHandlingPolicyPicker @@ -182,16 +164,15 @@ function SettingsSections() { {settings.map((Setting, i) => { if (typeof Setting === "function") return <Setting key={`Custom-${i}`} settings={Settings} />; - const { defaultValue, title, description, key, disabled, invisible } = Setting; + const { title, description, key, disabled, invisible } = Setting; if (invisible?.()) return null; return ( <VesktopSettingsSwitch title={title} description={description} - value={Settings[key as any] ?? defaultValue} - onChange={v => (Settings[key as any] = v)} disabled={disabled?.()} + {...getValueAndOnChange(key)} key={key} /> ); diff --git a/src/renderer/components/settings/UserAssets.tsx b/src/renderer/components/settings/UserAssets.tsx index aac6b61..04c174b 100644 --- a/src/renderer/components/settings/UserAssets.tsx +++ b/src/renderer/components/settings/UserAssets.tsx @@ -74,7 +74,7 @@ function Asset({ asset }: { asset: UserAssetType }) { {isSplash && ( <FormSwitch title="Nearest-Neighbor Scaling (for pixel art)" - value={settings.splashPixelated ?? false} + value={settings.splashPixelated} onChange={val => (settings.splashPixelated = val)} className={Margins.top16} hideBorder diff --git a/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx b/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx index 533dde0..f49621c 100644 --- a/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx +++ b/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx @@ -33,7 +33,7 @@ export const WebRTCIPHandlingPolicyPicker: SettingsComponent = ({ settings }) => ]} closeOnSelect={true} select={v => (settings.webRTCIPHandlingPolicy = v)} - isSelected={v => v === (settings.webRTCIPHandlingPolicy ?? "default")} + isSelected={v => v === settings.webRTCIPHandlingPolicy} serialize={s => s} /> </div> diff --git a/src/renderer/settings.ts b/src/renderer/settings.ts index 0a5ba80..f21daa6 100644 --- a/src/renderer/settings.ts +++ b/src/renderer/settings.ts @@ -25,10 +25,12 @@ export function useSettings() { return Settings.store; } -export function getValueAndOnChange(key: keyof typeof Settings.store) { +export function getValueAndOnChange<K extends keyof typeof Settings.store, V extends (typeof Settings.store)[K]>( + key: K +) { return { - value: Settings.store[key] as any, - onChange: (value: any) => (Settings.store[key] = value) + value: Settings.store[key] as V, + onChange: (value: V) => (Settings.store[key] = value) }; } diff --git a/src/shared/defaultSettings.ts b/src/shared/defaultSettings.ts new file mode 100644 index 0000000..c2f160e --- /dev/null +++ b/src/shared/defaultSettings.ts @@ -0,0 +1,33 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2026 Vendicated and Vesktop contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Settings } from "./settings"; + +export const DefaultVesktopSettings: Settings = { + discordBranch: "stable", + hardwareAcceleration: true, + hardwareVideoAcceleration: false, + nativeTitleBar: false, + staticTitle: false, + enableMenu: false, + enableShadow: true, + enableRoundedCorners: true, + enableSplashScreen: true, + splashTheming: true, + tray: true, + minimizeToTray: true, + clickTrayToShowHide: false, + disableMinSize: false, + disableSmoothScroll: false, + enableTaskbarFlashing: false, + arRPC: true, + openLinksWithElectron: false, + autoStartMinimized: false, + splashPixelated: false, + webRTCIPHandlingPolicy: "default", + appBadge: true, + transparencyOption: "none" +}; diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 3533e45..3faf5cf 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -7,36 +7,36 @@ import type { Rectangle } from "electron"; export interface Settings { - discordBranch?: "stable" | "canary" | "ptb"; - transparencyOption?: "none" | "mica" | "tabbed" | "acrylic"; - webRTCIPHandlingPolicy?: + discordBranch: "stable" | "canary" | "ptb"; + transparencyOption: "none" | "mica" | "tabbed" | "acrylic"; + webRTCIPHandlingPolicy: | "default" | "default_public_interface_only" | "default_public_and_private_interfaces" | "disable_non_proxied_udp"; - tray?: boolean; - minimizeToTray?: boolean; - autoStartMinimized?: boolean; - openLinksWithElectron?: boolean; - staticTitle?: boolean; - enableMenu?: boolean; - enableShadow?: boolean; - enableRoundedCorners?: boolean; - disableSmoothScroll?: boolean; - hardwareAcceleration?: boolean; - hardwareVideoAcceleration?: boolean; - arRPC?: boolean; - appBadge?: boolean; - enableTaskbarFlashing?: boolean; - disableMinSize?: boolean; - clickTrayToShowHide?: boolean; - nativeTitleBar?: boolean; + tray: boolean; + minimizeToTray: boolean; + autoStartMinimized: boolean; + openLinksWithElectron: boolean; + staticTitle: boolean; + enableMenu: boolean; + enableShadow: boolean; + enableRoundedCorners: boolean; + disableSmoothScroll: boolean; + hardwareAcceleration: boolean; + hardwareVideoAcceleration: boolean; + arRPC: boolean; + appBadge: boolean; + enableTaskbarFlashing: boolean; + disableMinSize: boolean; + clickTrayToShowHide: boolean; + nativeTitleBar: boolean; - enableSplashScreen?: boolean; - splashTheming?: boolean; + enableSplashScreen: boolean; + splashTheming: boolean; + splashPixelated: boolean; splashColor?: string; splashBackground?: string; - splashPixelated?: boolean; spellCheckLanguages?: string[]; From 667768c4332bc39d466112d7b11cc9622c115692 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 24 Aug 2026 14:47:48 +0200 Subject: [PATCH 19/29] fix lint --- src/main/utils/mergeDefaults.ts | 2 +- src/main/utils/popout.ts | 2 +- src/renderer/components/settings/Settings.tsx | 6 +++--- src/renderer/patches/platformClass.tsx | 2 -- src/renderer/patches/windowsTitleBar.tsx | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/utils/mergeDefaults.ts b/src/main/utils/mergeDefaults.ts index 494d809..58f52b6 100644 --- a/src/main/utils/mergeDefaults.ts +++ b/src/main/utils/mergeDefaults.ts @@ -13,7 +13,7 @@ export function mergeDefaults<T>(obj: T, defaults: T): T { for (const key in defaults) { const v = defaults[key]; - if (typeof v === "object" && !Array.isArray(v)) { + if (typeof v === "object" && !Array.isArray(v) && v !== null) { obj[key] ??= {} as any; mergeDefaults(obj[key], v); } else { diff --git a/src/main/utils/popout.ts b/src/main/utils/popout.ts index dd26896..fc81466 100644 --- a/src/main/utils/popout.ts +++ b/src/main/utils/popout.ts @@ -37,7 +37,7 @@ const DEFAULT_POPOUT_OPTIONS: BrowserWindowConstructorOptions = { backgroundColor: "#2f3136", minWidth: MIN_POPOUT_WIDTH, minHeight: MIN_POPOUT_HEIGHT, - frame: Settings.store.customTitleBar !== true, + frame: Settings.store.nativeTitleBar, titleBarStyle: process.platform === "darwin" ? "hidden" : undefined, trafficLightPosition: process.platform === "darwin" diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index d04b179..207ce3e 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -66,19 +66,19 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> key: "enableMenu", title: "Enable Menu Bar", description: "Enables the application menu bar. Press ALT to toggle visibility.", - disabled: () => Settings.store.nativeTitleBar !== true + disabled: () => !Settings.store.nativeTitleBar }, { key: "enableShadow", title: "Enable Window Shadow", description: "Enables the window shadow. Requires a full restart.", - disabled: () => Settings.store.nativeTitleBar === true + disabled: () => Settings.store.nativeTitleBar }, { key: "enableRoundedCorners", title: "Enable Rounded Corners", description: "Enables rounded corners. Requires a full restart.", - disabled: () => Settings.store.nativeTitleBar === true + disabled: () => Settings.store.nativeTitleBar }, { key: "enableSplashScreen", diff --git a/src/renderer/patches/platformClass.tsx b/src/renderer/patches/platformClass.tsx index 3fdbd22..f76384e 100644 --- a/src/renderer/patches/platformClass.tsx +++ b/src/renderer/patches/platformClass.tsx @@ -4,7 +4,6 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { Settings } from "renderer/settings"; import { isMac } from "renderer/utils"; import { addPatch } from "./shared"; @@ -21,7 +20,6 @@ addPatch({ ], getPlatformClass() { - if (Settings.store.customTitleBar) return "platform-win"; if (isMac) return "platform-osx"; return "platform-web"; } diff --git a/src/renderer/patches/windowsTitleBar.tsx b/src/renderer/patches/windowsTitleBar.tsx index 9ddba6b..505ca91 100644 --- a/src/renderer/patches/windowsTitleBar.tsx +++ b/src/renderer/patches/windowsTitleBar.tsx @@ -8,7 +8,7 @@ import { Settings } from "renderer/settings"; import { addPatch } from "./shared"; -if (Settings.store.customTitleBar) +if (!Settings.store.nativeTitleBar) addPatch({ patches: [ { From 50652cdd898db4a06d21123483701cf8d34d4099 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Mon, 24 Aug 2026 18:42:39 +0200 Subject: [PATCH 20/29] isValidVencordInstall: don't require package.json to exist --- src/main/ipc.ts | 2 +- src/main/utils/vencordLoader.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 395540b..aee11f3 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -149,7 +149,7 @@ handle(IpcEvents.SELECT_VENCORD_DIR, async (_e, value?: null) => { if (!res.filePaths.length) return "cancelled"; const dir = res.filePaths[0]; - if (!isValidVencordInstall(dir)) return "invalid"; + if (!(await isValidVencordInstall(dir))) return "invalid"; State.store.vencordDir = dir; diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts index 25748b3..f02e00d 100644 --- a/src/main/utils/vencordLoader.ts +++ b/src/main/utils/vencordLoader.ts @@ -64,7 +64,7 @@ const existsAsync = (path: string) => .catch(() => false); export async function isValidVencordInstall(dir: string) { - const results = await Promise.all(["package.json", ...FILES_TO_DOWNLOAD].map(f => existsAsync(join(dir, f)))); + const results = await Promise.all(FILES_TO_DOWNLOAD.map(f => existsAsync(join(dir, f)))); return !results.includes(false); } From e35e0dc5f78f21d2574634e117cb7cc3550ae962 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Sun, 30 Aug 2026 18:03:52 +0200 Subject: [PATCH 21/29] Remove flags that disable renderer backgrounding We added these in the past to work around issues where Vesktop would go blank while backgrounded. The issue is likely fixed now. The best way to test it out is to just remove them and see if anyone complains :P --- src/main/main.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/main.ts b/src/main/main.ts index 7230e4d..ad2c78a 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -59,16 +59,6 @@ function init() { app.commandLine.appendSwitch("disable-smooth-scrolling"); } - // disable renderer backgrounding to prevent the app from unloading when in the background - // https://github.com/electron/electron/issues/2822 - // https://github.com/GoogleChrome/chrome-launcher/blob/5a27dd574d47a75fec0fb50f7b774ebf8a9791ba/docs/chrome-flags-for-tools.md#task-throttling - app.commandLine.appendSwitch("disable-renderer-backgrounding"); - app.commandLine.appendSwitch("disable-background-timer-throttling"); - app.commandLine.appendSwitch("disable-backgrounding-occluded-windows"); - if (process.platform === "win32") { - disabledFeatures.add("CalculateNativeWinOcclusion"); - } - // work around chrome 66 disabling autoplay by default app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required"); From d92eecad0363dd8feeaa014807b7327d35f650ad Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Sun, 30 Aug 2026 18:05:22 +0200 Subject: [PATCH 22/29] Remove speech dispatcher flag as it causes issues On some systems, the dispatcher thread can generate many coredumps if no backend is configured. Users should manually enable this if they want it This commit also removes an obsolete flag and refactors a bit of code to be compatible with older Electron versions. This will allow people to build it with older Electron versions that still support older OS versions. --- src/main/main.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/main.ts b/src/main/main.ts index ad2c78a..079bfc2 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -62,16 +62,11 @@ function init() { // work around chrome 66 disabling autoplay by default app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required"); - // WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows. - // HardwareMediaKeyHandling, MediaSessionService: Prevent Discord from registering as a media service. - disabledFeatures.add("WinRetrieveSuggestionsOnlyOnDemand"); + // Prevent Discord from registering as a media service. disabledFeatures.add("HardwareMediaKeyHandling"); disabledFeatures.add("MediaSessionService"); if (isLinux) { - // Support TTS on Linux using https://wiki.archlinux.org/title/Speech_dispatcher - app.commandLine.appendSwitch("enable-speech-dispatcher"); - // This is needed to fix washed out colours - https://github.com/electron/electron/issues/49566 // Supposed to be fixed already according to comments there, but it's just not lol, I can repro on Electron 43.0.0 // when moving the window from my main monitor (HDR - not sure if this is relevant lol) to second monitor (SDR) and back @@ -80,8 +75,8 @@ function init() { disabledFeatures.forEach(feat => enabledFeatures.delete(feat)); - const enabledFeaturesArray = enabledFeatures.values().filter(Boolean).toArray(); - const disabledFeaturesArray = disabledFeatures.values().filter(Boolean).toArray(); + const enabledFeaturesArray = [...enabledFeatures].filter(Boolean); + const disabledFeaturesArray = [...disabledFeatures].filter(Boolean); if (enabledFeaturesArray.length) { app.commandLine.appendSwitch("enable-features", enabledFeaturesArray.join(",")); From aa2753e1d5eb81e9dff55dc030b4b7ce77411148 Mon Sep 17 00:00:00 2001 From: Noah <37805707+Curve@users.noreply.github.com> Date: Fri, 4 Sep 2026 03:24:03 +0200 Subject: [PATCH 23/29] Update venmic to 7.2.1 (#1319) --- package.json | 2 +- pnpm-lock.yaml | 10 +- pnpm-workspace.yaml | 3 +- src/main/venmic.ts | 86 +++++++--------- src/preload/VesktopNative.ts | 1 + src/renderer/components/ScreenSharePicker.tsx | 98 +++++++++---------- src/shared/IpcEvents.ts | 1 + src/shared/settings.d.ts | 1 + 8 files changed, 98 insertions(+), 104 deletions(-) diff --git a/package.json b/package.json index 5da4856..8c7e4f6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "electron-updater": "6.6.2" }, "optionalDependencies": { - "@vencord/venmic": "^6.1.0" + "@vencord/venmic": "^7.2.1" }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e09751..4986775 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: version: 3.7.0 optionalDependencies: '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0(supports-color@7.2.0) + specifier: ^7.2.1 + version: 7.2.1(supports-color@7.2.0) packages/libvesktop: devDependencies: @@ -562,8 +562,8 @@ packages: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 - '@vencord/venmic@6.1.0': - resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} + '@vencord/venmic@7.2.1': + resolution: {integrity: sha512-VwRDQDpLMgN328VeCdnZ/UwJpoBUbAi3rdXK3QqhCHC/u5p8mhze3/R1Y1Beoxe1MICITelE2dzATQ7pJU/xuw==} engines: {node: '>=14.15'} os: [linux] @@ -3324,7 +3324,7 @@ snapshots: ts-pattern: 5.9.0 type-fest: 5.8.0 - '@vencord/venmic@6.1.0(supports-color@7.2.0)': + '@vencord/venmic@7.2.1(supports-color@7.2.0)': dependencies: cmake-js: 7.4.0(supports-color@7.2.0) node-addon-api: 8.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 23f5fc8..8306458 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,4 +13,5 @@ recursiveInstall: false packages: - packages/* minimumReleaseAgeExclude: - - electron \ No newline at end of file + - electron + - '@vencord/*' diff --git a/src/main/venmic.ts b/src/main/venmic.ts index b6a0d08..80192c5 100644 --- a/src/main/venmic.ts +++ b/src/main/venmic.ts @@ -66,70 +66,60 @@ function getRendererAudioServicePid() { ); } +function buildLinkData({ include, exclude }: { include?: Node[]; exclude?: Node[] }) { + const pid = getRendererAudioServicePid(); + + const { mute, ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround, onlySpeakers, onlyDefaultSpeakers } = + Settings.store.audio ?? {}; + + const data: LinkData = { + mute: mute ?? true, + include: include ?? [], + exclude: exclude ?? [], + only_speakers: onlySpeakers, + ignore_devices: ignoreDevices, + only_default_speakers: onlyDefaultSpeakers + }; + + data.exclude.push({ "application.process.id": pid }); + + if (ignoreInputMedia ?? true) { + data.exclude.push({ "media.class": "Stream/Input/Audio" }); + } + + if (ignoreVirtual) { + data.exclude.push({ "node.virtual": "true" }); + } + + if (workaround) { + data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; + } + + return data; +} + ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => { const audioPid = getRendererAudioServicePid(); const { granularSelect } = Settings.store.audio ?? {}; const targets = obtainVenmic() - ?.list(granularSelect ? ["node.name"] : undefined) + ?.list(granularSelect ? [] : ["application.name", "node.name"]) .filter(s => s["application.process.id"] !== audioPid); return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; }); ipcMain.handle(IpcEvents.VIRT_MIC_START, (_, include: Node[]) => { - const pid = getRendererAudioServicePid(); - const { ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround } = Settings.store.audio ?? {}; - - const data: LinkData = { - include, - exclude: [{ "application.process.id": pid }], - ignore_devices: ignoreDevices - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); + return obtainVenmic()?.link(buildLinkData({ include })); }); ipcMain.handle(IpcEvents.VIRT_MIC_START_SYSTEM, (_, exclude: Node[]) => { - const pid = getRendererAudioServicePid(); + return obtainVenmic()?.link(buildLinkData({ exclude })); +}); - const { workaround, ignoreDevices, ignoreInputMedia, ignoreVirtual, onlySpeakers, onlyDefaultSpeakers } = - Settings.store.audio ?? {}; - - const data: LinkData = { - include: [], - exclude: [{ "application.process.id": pid }, ...exclude], - only_speakers: onlySpeakers, - ignore_devices: ignoreDevices, - only_default_speakers: onlyDefaultSpeakers - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); +ipcMain.handle(IpcEvents.VIRT_MIC_UNMUTE, () => { + return obtainVenmic()?.unmute(); }); ipcMain.handle(IpcEvents.VIRT_MIC_STOP, () => obtainVenmic()?.unlink()); diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index e11fae7..1dd6710 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -92,6 +92,7 @@ export const VesktopNative = { >(IpcEvents.VIRT_MIC_LIST), start: (include: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START, include), startSystem: (exclude: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START_SYSTEM, exclude), + unmute: () => invoke<void>(IpcEvents.VIRT_MIC_UNMUTE), stop: () => invoke<void>(IpcEvents.VIRT_MIC_STOP) }, clipboard: { diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index 9f367bd..69d8d63 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -121,15 +121,25 @@ addPatch({ if (isLinux) { onceReady.then(() => { - FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { - const owner = streamKey.split(":").at(-1); + const ownsStream = (streamKey: string) => { + return streamKey.split(":").at(-1) === UserStore.getCurrentUser().id; + }; - if (owner !== UserStore.getCurrentUser().id) { + FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { return; } VesktopNative.virtmic.stop(); }); + + FluxDispatcher.subscribe("STREAM_UPDATE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { + return; + } + + VesktopNative.virtmic.unmute(); + }); }); } @@ -216,6 +226,13 @@ function AudioSettingsModal({ actions={[{ text: "Back", variant: "secondary", onClick: close }]} > <div className={cl("venmic-settings")}> + <FormSwitch + title="Initial Mute" + description="Fix an initial audio spike caused by chromium." + hideBorder + onChange={v => (Settings.audio = { ...Settings.audio, mute: v })} + value={Settings.audio?.mute ?? true} + /> <FormSwitch title="Microphone Workaround" description="Work around an issue that causes the microphone to be shared instead of the correct audio. Only enable if you're experiencing this issue." @@ -447,78 +464,61 @@ function isSpecialSource(value?: AudioSource | AudioSources): value is SpecialSo return typeof value === "string"; } -function hasMatchingProps(value: Node, other: Node) { - return Object.keys(value).every(key => value[key] === other[key]); -} - function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] { if (isSpecialSource(node)) { return [{ name: node, value: node }]; } - const rtn: AudioItem[] = []; - const mediaClass = node["media.class"]; if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) { - return rtn; + return []; } if (!deviceSelect && node["device.id"]) { - return rtn; + return []; } - const name = node["application.name"]; + const preferred = ["application.name", "node.description", "node.name", "application.process.binary"] as const; + const prop = preferred.find(prop => node[prop]); - if (name) { - rtn.push({ name: name, value: { "application.name": name } }); + if (!prop) { + return []; } + const name = node[prop]!; + const items: AudioItem[] = [{ name: name, value: { [prop]: name } }]; + if (!granularSelect) { - return rtn; + return items; } - const rawName = node["node.name"]; + let granularName = name; + const granularProps: Node = { [prop]: name }; - if (!name) { - rtn.push({ name: rawName, value: { "node.name": rawName } }); - } + const append = (name: string, brackets: string) => { + const value = node[name]; - const binary = node["application.process.binary"]; + if (!value) { + return; + } - if (!name && binary) { - rtn.push({ name: binary, value: { "application.process.binary": binary } }); - } + granularName += ` ${brackets[0]}${value}${brackets[1]}`; + granularProps[name] = value; + }; - const pid = node["application.process.id"]; + append("application.process.id", "<>"); + append("application.process.binary", "()"); + append("media.name", "[]"); - const first = rtn[0]; - const firstValues = first.value as Node; + items.push({ name: granularName, value: granularProps }); - if (pid) { - rtn.push({ - name: `${first.name} (${pid})`, - value: { ...firstValues, "application.process.id": pid } - }); - } + return items; +} - const mediaName = node["media.name"]; - - if (mediaName) { - rtn.push({ - name: `${first.name} [${mediaName}]`, - value: { ...firstValues, "media.name": mediaName } - }); - } - - if (mediaClass) { - rtn.push({ - name: `${first.name} [${mediaClass}]`, - value: { ...firstValues, "media.class": mediaClass } - }); - } - - return rtn; +function hasMatchingProps(value: Node, other: Node) { + const keys = Object.keys(value); + return keys.length === Object.keys(other).length && keys.every(key => value[key] === other[key]); } function isItemSelected(sources?: AudioSources) { diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index 13f27b4..55efe80 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -49,6 +49,7 @@ export const enum IpcEvents { VIRT_MIC_LIST = "VCD_VIRT_MIC_LIST", VIRT_MIC_START = "VCD_VIRT_MIC_START", VIRT_MIC_START_SYSTEM = "VCD_VIRT_MIC_START_ALL", + VIRT_MIC_UNMUTE = "VCD_VIRT_MIC_UNMUTE", VIRT_MIC_STOP = "VCD_VIRT_MIC_STOP", CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE", diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 3faf5cf..d564906 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -50,6 +50,7 @@ export interface Settings { ignoreDevices?: boolean; ignoreInputMedia?: boolean; + mute?: boolean; onlySpeakers?: boolean; onlyDefaultSpeakers?: boolean; }; From 84d6f177e5b58708675060e4de405d81097f2518 Mon Sep 17 00:00:00 2001 From: vocal <280490408+vocaldll@users.noreply.github.com> Date: Fri, 4 Sep 2026 03:26:55 +0200 Subject: [PATCH 24/29] use lower minimum Windows version for excluding Vesktop audio (#1309) --- src/main/screenShare.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index 91fe0c5..019fbe0 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -15,7 +15,7 @@ import { handle } from "./utils/ipcWrappers"; const isWayland = process.platform === "linux" && (process.env.XDG_SESSION_TYPE === "wayland" || !!process.env.WAYLAND_DISPLAY); -const supportsLoopbackWithoutChrome = process.platform === "win32" && Number(release().split(".").pop()) >= 20348; +const supportsLoopbackWithoutChrome = process.platform === "win32" && Number(release().split(".").pop()) >= 19045; export function registerScreenShareHandler() { handle(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, async (_, id: string) => { From 6ac9ec4256b64156bc34e8c0e5ea298aecc9e945 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Sun, 6 Sep 2026 03:03:16 +0200 Subject: [PATCH 25/29] fix empty space right of close button in titlebar --- src/renderer/patches/platformClass.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/renderer/patches/platformClass.tsx b/src/renderer/patches/platformClass.tsx index f76384e..4840615 100644 --- a/src/renderer/patches/platformClass.tsx +++ b/src/renderer/patches/platformClass.tsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { Settings } from "renderer/settings"; import { isMac } from "renderer/utils"; import { addPatch } from "./shared"; @@ -21,6 +22,7 @@ addPatch({ getPlatformClass() { if (isMac) return "platform-osx"; + if (!Settings.store.nativeTitleBar) return "platform-win"; return "platform-web"; } }); From 72b4c38ad7a43e2ca3c5a42176c9747803a99d84 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Sun, 6 Sep 2026 03:06:10 +0200 Subject: [PATCH 26/29] fix titlebar class on mac --- src/renderer/patches/platformClass.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/patches/platformClass.tsx b/src/renderer/patches/platformClass.tsx index 4840615..b220c01 100644 --- a/src/renderer/patches/platformClass.tsx +++ b/src/renderer/patches/platformClass.tsx @@ -21,8 +21,7 @@ addPatch({ ], getPlatformClass() { - if (isMac) return "platform-osx"; - if (!Settings.store.nativeTitleBar) return "platform-win"; - return "platform-web"; + if (Settings.store.nativeTitleBar) return "platform-web"; + return isMac ? "platform-osx" : "platform-win"; } }); From 329faa322de0a5db4eb8c6d260f83a4ec37abadc Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 8 Sep 2026 00:25:38 +0200 Subject: [PATCH 27/29] Disable sourcemaps for arrpc This shaves off 20MB --- scripts/build/build.mts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/build/build.mts b/scripts/build/build.mts index 79002c7..2fcc026 100644 --- a/scripts/build/build.mts +++ b/scripts/build/build.mts @@ -86,7 +86,8 @@ await Promise.all([ ...NodeCommonOpts, entryPoints: ["src/main/arrpc/worker.ts"], outfile: "dist/js/arRpcWorker.js", - footer: { js: "//# sourceURL=VesktopArRpcWorker" } + footer: { js: "//# sourceURL=VesktopArRpcWorker" }, + sourcemap: false }), createContext({ ...NodeCommonOpts, From c38f94894fa5031f1b416204b5c752b7c485ac7f Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 8 Sep 2026 00:28:13 +0200 Subject: [PATCH 28/29] venmic 7.2.3 --- package.json | 2 +- pnpm-lock.yaml | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 8c7e4f6..d2755d7 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "electron-updater": "6.6.2" }, "optionalDependencies": { - "@vencord/venmic": "^7.2.1" + "@vencord/venmic": "^7.2.3" }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4986775..d0ce927 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: version: 3.7.0 optionalDependencies: '@vencord/venmic': - specifier: ^7.2.1 - version: 7.2.1(supports-color@7.2.0) + specifier: ^7.2.3 + version: 7.2.3(supports-color@7.2.0) packages/libvesktop: devDependencies: @@ -562,8 +562,8 @@ packages: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 - '@vencord/venmic@7.2.1': - resolution: {integrity: sha512-VwRDQDpLMgN328VeCdnZ/UwJpoBUbAi3rdXK3QqhCHC/u5p8mhze3/R1Y1Beoxe1MICITelE2dzATQ7pJU/xuw==} + '@vencord/venmic@7.2.3': + resolution: {integrity: sha512-57ei2g+mSJidLf8B2SSYPbHBsh5SS/Y08IWqkJ2+uWaj66qnWLPQjtJ2TslczgZqbVwE1JvYxCNTR1zVJGLW9A==} engines: {node: '>=14.15'} os: [linux] @@ -725,8 +725,8 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axios@1.18.1: - resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1363,6 +1363,10 @@ packages: resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} engines: {node: '>=14.14'} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2018,6 +2022,10 @@ packages: resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} engines: {node: ^18 || ^20 || >= 21} + node-addon-api@8.9.2: + resolution: {integrity: sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==} + engines: {node: ^18 || ^20 || >= 21} + node-api-headers@1.9.0: resolution: {integrity: sha512-2oNILP4jXwRB4ywnYKjVk1YyJ96n2D4EOVJO6S3oYZ5PtbJrw3Yt9TpAuX3nBLMuzn74rnfGQrv13pS9vC+YiA==} @@ -3324,10 +3332,10 @@ snapshots: ts-pattern: 5.9.0 type-fest: 5.8.0 - '@vencord/venmic@7.2.1(supports-color@7.2.0)': + '@vencord/venmic@7.2.3(supports-color@7.2.0)': dependencies: cmake-js: 7.4.0(supports-color@7.2.0) - node-addon-api: 8.9.0 + node-addon-api: 8.9.2 pkg-prebuilds: 0.2.1 transitivePeerDependencies: - supports-color @@ -3543,7 +3551,7 @@ snapshots: aws4@1.13.2: {} - axios@1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): + axios@1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) form-data: 4.0.6 @@ -3716,9 +3724,9 @@ snapshots: cmake-js@7.4.0(supports-color@7.2.0): dependencies: - axios: 1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + axios: 1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0) - fs-extra: 11.3.6 + fs-extra: 11.4.0 memory-stream: 1.0.0 node-api-headers: 1.9.0 npmlog: 6.0.2 @@ -4422,6 +4430,13 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + optional: true + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -5128,6 +5143,9 @@ snapshots: node-addon-api@8.9.0: {} + node-addon-api@8.9.2: + optional: true + node-api-headers@1.9.0: optional: true From a46e4822a091c7223b0780d8a792f62ea40422b7 Mon Sep 17 00:00:00 2001 From: Vendicated <vendicated@riseup.net> Date: Tue, 8 Sep 2026 02:11:33 +0200 Subject: [PATCH 29/29] switch to Vencord/arrpc fork --- package.json | 6 ++---- patches/arrpc@3.5.0.patch | 27 --------------------------- pnpm-lock.yaml | 36 ++++++++++++------------------------ pnpm-workspace.yaml | 1 - scripts/build/build.mts | 3 +-- src/main/arrpc/index.ts | 5 ++++- 6 files changed, 19 insertions(+), 59 deletions(-) delete mode 100644 patches/arrpc@3.5.0.patch diff --git a/package.json b/package.json index d2755d7..4020f98 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,10 @@ "test": "pnpm lint && pnpm testTypes", "testTypes": "tsc --noEmit", "watch": "pnpm build --watch", - "generateMeta": "tsx scripts/utils/generateMeta.mts", - "updateArrpcDB": "node ./node_modules/arrpc/update_db.js", - "postinstall": "pnpm updateArrpcDB" + "generateMeta": "tsx scripts/utils/generateMeta.mts" }, "dependencies": { - "arrpc": "github:OpenAsar/arrpc#2234e9c9111f4c42ebcc3aa6a2215bfd979eef77", + "arrpc": "github:Vencord/arrpc#82ece7442564d725d8202a8bb9bed5903ee85026", "electron-updater": "6.6.2" }, "optionalDependencies": { diff --git a/patches/arrpc@3.5.0.patch b/patches/arrpc@3.5.0.patch deleted file mode 100644 index baae84c..0000000 --- a/patches/arrpc@3.5.0.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/src/process/index.js b/src/process/index.js -index 389b0845256a34b4536d6da99edb00d17f13a6b4..f17a0ac687e9110ebfd33cb91fd2f6250d318643 100644 ---- a/src/process/index.js -+++ b/src/process/index.js -@@ -5,8 +5,20 @@ import fs from 'node:fs'; - import { dirname, join } from 'path'; - import { fileURLToPath } from 'url'; - --const __dirname = dirname(fileURLToPath(import.meta.url)); --const DetectableDB = JSON.parse(fs.readFileSync(join(__dirname, 'detectable.json'), 'utf8')); -+const DetectableDB = require('./detectable.json'); -+DetectableDB.push( -+ { -+ aliases: ["Obs"], -+ executables: [ -+ { is_launcher: false, name: "obs", os: "linux" }, -+ { is_launcher: false, name: "obs.exe", os: "win32" }, -+ { is_launcher: false, name: "obs.app", os: "darwin" } -+ ], -+ hook: true, -+ id: "STREAMERMODE", -+ name: "OBS" -+ } -+); - - import * as Natives from './native/index.js'; - const Native = Natives[process.platform]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0ce927..a5bb8e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - arrpc@3.5.0: 4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4 electron-updater: 080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887 importers: @@ -13,8 +12,8 @@ importers: .: dependencies: arrpc: - specifier: github:OpenAsar/arrpc#2234e9c9111f4c42ebcc3aa6a2215bfd979eef77 - version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4) + specifier: github:Vencord/arrpc#82ece7442564d725d8202a8bb9bed5903ee85026 + version: https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026 electron-updater: specifier: 6.6.2 version: 6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887)(supports-color@7.2.0) @@ -682,9 +681,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77: - resolution: {gitHosted: true, tarball: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77} - version: 3.5.0 + arrpc@https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026: + resolution: {gitHosted: true, integrity: sha512-2Tj4F1K+WEmu2gOLZC3Do8NtIPlMhLFvA2OrlE3lOV/HV9Lf8i5KboRv+NWv86zyrlCMzZUSVnzjYKPKuP3Ssw==, tarball: https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026} + version: 3.7.0 hasBin: true asn1js@3.0.10: @@ -1359,10 +1358,6 @@ packages: resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} - fs-extra@11.3.6: - resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} - engines: {node: '>=14.14'} - fs-extra@11.4.0: resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} @@ -2805,8 +2800,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2931,7 +2926,7 @@ snapshots: '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3(supports-color@7.2.0) dir-compare: 4.2.0 - fs-extra: 11.3.6 + fs-extra: 11.4.0 minimatch: 9.0.9 plist: 3.1.0 transitivePeerDependencies: @@ -2941,7 +2936,7 @@ snapshots: dependencies: cross-dirname: 0.1.0 debug: 4.4.3(supports-color@7.2.0) - fs-extra: 11.3.6 + fs-extra: 11.4.0 minimist: 1.2.8 postject: 1.0.0-alpha.6 transitivePeerDependencies: @@ -3518,9 +3513,9 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4): + arrpc@https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026: dependencies: - ws: 8.21.0 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -4424,18 +4419,11 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.3.6: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 - optional: true fs-extra@7.0.1: dependencies: @@ -6087,7 +6075,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.0: {} + ws@8.21.3: {} xml-formatter@3.7.0: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8306458..bdc4996 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,4 @@ patchedDependencies: - arrpc@3.5.0: patches/arrpc@3.5.0.patch electron-updater: patches/electron-updater.patch nodeLinker: hoisted allowBuilds: diff --git a/scripts/build/build.mts b/scripts/build/build.mts index 2fcc026..79002c7 100644 --- a/scripts/build/build.mts +++ b/scripts/build/build.mts @@ -86,8 +86,7 @@ await Promise.all([ ...NodeCommonOpts, entryPoints: ["src/main/arrpc/worker.ts"], outfile: "dist/js/arRpcWorker.js", - footer: { js: "//# sourceURL=VesktopArRpcWorker" }, - sourcemap: false + footer: { js: "//# sourceURL=VesktopArRpcWorker" } }), createContext({ ...NodeCommonOpts, diff --git a/src/main/arrpc/index.ts b/src/main/arrpc/index.ts index d4d663d..a190fae 100644 --- a/src/main/arrpc/index.ts +++ b/src/main/arrpc/index.ts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { resolve } from "path"; +import { SESSION_DATA_DIR } from "main/constants"; +import { join, resolve } from "path"; import { IpcCommands } from "shared/IpcEvents"; import { MessageChannel, Worker } from "worker_threads"; @@ -19,6 +20,8 @@ const inviteCodeRegex = /^(\w|-)+$/; export async function initArRPC() { if (worker || !Settings.store.arRPC) return; + process.env.ARRPC_DETECTABLE_CACHE_PATH = join(SESSION_DATA_DIR, "arrpc-detectable-db.json"); + try { const { port1: hostPort, port2: workerPort } = new MessageChannel();