From c50747802b3a7705854b03392f31bbb14bfb808c Mon Sep 17 00:00:00 2001 From: maskar Date: Fri, 27 Mar 2026 22:10:42 -0500 Subject: [PATCH 1/2] feat(electron): grant microphone and clipboard permissions Add permission handler for media (microphone) and clipboard-read access. Add audio-input entitlement for macOS builds. --- build/entitlements.mac.plist | 2 ++ electron/main.ts | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist index 46f67566..0d041c2c 100644 --- a/build/entitlements.mac.plist +++ b/build/entitlements.mac.plist @@ -8,5 +8,7 @@ com.apple.security.cs.disable-library-validation + com.apple.security.device.audio-input + diff --git a/electron/main.ts b/electron/main.ts index e4fb5ffd..41e154f9 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, shell } from 'electron'; +import { app, BrowserWindow, session, shell } from 'electron'; import path from 'path'; import fs from 'fs'; import { fileURLToPath } from 'url'; @@ -138,7 +138,14 @@ function createWindow() { }); } -app.whenReady().then(createWindow); +app.whenReady().then(() => { + // Grant microphone and clipboard access + session.defaultSession.setPermissionRequestHandler((_webContents, permission, callback) => { + callback(permission === 'media' || permission === 'clipboard-read'); + }); + + createWindow(); +}); app.on('before-quit', () => { killAllAgents(); From 2a48935afc73d5aa1850e91c137dd4062d13cb4e Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Sat, 28 Mar 2026 21:34:04 +0100 Subject: [PATCH 2/2] fix(electron): scope media permission to audio-only, add NSMicrophoneUsageDescription - Check details.mediaTypes to grant only audio (microphone), deny video (camera) - Add NSMicrophoneUsageDescription for macOS hardened runtime compatibility --- electron/main.ts | 17 +++++++++++++---- package.json | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index 41e154f9..75bc93c4 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -139,10 +139,19 @@ function createWindow() { } app.whenReady().then(() => { - // Grant microphone and clipboard access - session.defaultSession.setPermissionRequestHandler((_webContents, permission, callback) => { - callback(permission === 'media' || permission === 'clipboard-read'); - }); + // Grant microphone and clipboard access (deny camera/video) + session.defaultSession.setPermissionRequestHandler( + (_webContents, permission, callback, details) => { + if (permission === 'clipboard-read') { + return callback(true); + } + if (permission === 'media') { + const types = (details as { mediaTypes?: string[] }).mediaTypes ?? []; + return callback(types.every((t) => t === 'audio')); + } + callback(false); + }, + ); createWindow(); }); diff --git a/package.json b/package.json index c3ba8c9d..0593bd24 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,9 @@ "target": "dmg", "category": "public.app-category.developer-tools", "hardenedRuntime": true, + "extendInfo": { + "NSMicrophoneUsageDescription": "Parallel Code needs microphone access for voice input in terminal sessions." + }, "gatekeeperAssess": false, "notarize": true, "x64ArchFiles": "Contents/Resources/app.asar.unpacked/node_modules/node-pty/prebuilds/**",