From ad8873a0137f00c3992d6a0deb6cd1883973b5ac Mon Sep 17 00:00:00 2001 From: cmorten Date: Sun, 16 Aug 2026 15:31:50 +0100 Subject: [PATCH] fix: better timeouts and retries for tcc perms propagation --- src/commands/setup/macOS/enableDoNotDisturb.ts | 15 ++++++++++----- src/commands/setup/macOS/runAppleScript.ts | 4 ++-- src/commands/setup/macOS/setup.ts | 4 ++-- src/commands/setup/macOS/updateTccDb.ts | 5 ++++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/commands/setup/macOS/enableDoNotDisturb.ts b/src/commands/setup/macOS/enableDoNotDisturb.ts index 4f059d7..c2e96db 100644 --- a/src/commands/setup/macOS/enableDoNotDisturb.ts +++ b/src/commands/setup/macOS/enableDoNotDisturb.ts @@ -104,15 +104,20 @@ export async function enableDoNotDisturb() { await promisify(exec)(enableFocusModeShellscript); } else if (platformMajor === 21) { // From macOS 12 Monterey (Darwin 21) there is no known way to enable DND via system defaults - await retryOnError(() => runAppleScript(enableFocusModeAppleScript)); + await retryOnError(() => runAppleScript(enableFocusModeAppleScript), { + retries: 5, + delay: 500, + }); } else { const { stdout: locale } = await promisify(exec)(getLocale); // From macOS 13 Ventura (Darwin 22) there is no known way to enable DND via system settings - await retryOnError(() => - runAppleScript( - enableFocusModeVenturaAppleScript(locale, platformMajor), - ), + await retryOnError( + () => + runAppleScript( + enableFocusModeVenturaAppleScript(locale, platformMajor), + ), + { retries: 5, delay: 500 }, ); } } catch (cause) { diff --git a/src/commands/setup/macOS/runAppleScript.ts b/src/commands/setup/macOS/runAppleScript.ts index 5c8a763..26748e3 100644 --- a/src/commands/setup/macOS/runAppleScript.ts +++ b/src/commands/setup/macOS/runAppleScript.ts @@ -1,6 +1,6 @@ import { execFile } from "child_process"; -export const DEFAULT_TIMEOUT = 10000; +export const DEFAULT_TIMEOUT = 120; export const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; export async function runAppleScript( @@ -28,7 +28,7 @@ end tell" delay 0.2 end repeat -end doWithTimeout +end withTimeout `; return (await new Promise((resolve, reject) => { diff --git a/src/commands/setup/macOS/setup.ts b/src/commands/setup/macOS/setup.ts index 8363243..dbd2c05 100644 --- a/src/commands/setup/macOS/setup.ts +++ b/src/commands/setup/macOS/setup.ts @@ -30,7 +30,7 @@ export async function setup({ }: MacOSSetupOptions = {}): Promise { if (!macosIgnoreTccDb) { try { - updateTccDb(USER_PATH); + await updateTccDb(USER_PATH); } catch (e) { if (ci) { throw e; @@ -43,7 +43,7 @@ export async function setup({ } try { - updateTccDb(SYSTEM_PATH); + await updateTccDb(SYSTEM_PATH); } catch { // Swallow error - most CI don't allow system configuration } diff --git a/src/commands/setup/macOS/updateTccDb.ts b/src/commands/setup/macOS/updateTccDb.ts index 3d448a6..6ff44e4 100644 --- a/src/commands/setup/macOS/updateTccDb.ts +++ b/src/commands/setup/macOS/updateTccDb.ts @@ -184,7 +184,7 @@ const getEntries = (): string[] => { export const USER_PATH = `${homedir()}/Library/Application Support/com.apple.TCC/TCC.db`; export const SYSTEM_PATH = "/Library/Application Support/com.apple.TCC/TCC.db"; -export function updateTccDb(path: string): void { +export async function updateTccDb(path: string): Promise { const osRelease = release(); const isSonomaOrNewer = parseInt(osRelease.split(".")[0], 10) >= 23; @@ -204,4 +204,7 @@ export function updateTccDb(path: string): void { }); } } + + // 1s sleep to give cache for updates to propagate + await new Promise((resolve) => setTimeout(resolve, 1000)); }