From 37378fb346a5df1a875fb37685258265b5a93c33 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 9 Jan 2026 00:32:41 +0100 Subject: [PATCH] Fix setTheme not triggering rerender, improve mac-system-theme example --- packages/coding-agent/CHANGELOG.md | 5 +++++ .../coding-agent/examples/extensions/mac-system-theme.ts | 9 ++++++--- .../coding-agent/src/modes/interactive/theme/theme.ts | 6 ++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 54c9980c..86ce1c6e 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,11 @@ ## [Unreleased] +### Fixed + +- `setTheme()` now triggers a full rerender so previously rendered components update with the new theme colors +- `mac-system-theme.ts` example now polls every 2 seconds and uses `osascript` for real-time macOS appearance detection + ## [0.39.0] - 2026-01-08 ### Breaking Changes diff --git a/packages/coding-agent/examples/extensions/mac-system-theme.ts b/packages/coding-agent/examples/extensions/mac-system-theme.ts index 7b291e36..00009492 100644 --- a/packages/coding-agent/examples/extensions/mac-system-theme.ts +++ b/packages/coding-agent/examples/extensions/mac-system-theme.ts @@ -10,10 +10,13 @@ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; function isDarkMode(): boolean { try { - execSync("defaults read -g AppleInterfaceStyle", { encoding: "utf-8" }); - return true; // Returns "Dark" if dark mode + const result = execSync( + "osascript -e 'tell application \"System Events\" to tell appearance preferences to return dark mode'", + { encoding: "utf-8" }, + ); + return result.trim() === "true"; } catch { - return false; // Throws if light mode + return false; } } diff --git a/packages/coding-agent/src/modes/interactive/theme/theme.ts b/packages/coding-agent/src/modes/interactive/theme/theme.ts index d3fa6896..ae99ed40 100644 --- a/packages/coding-agent/src/modes/interactive/theme/theme.ts +++ b/packages/coding-agent/src/modes/interactive/theme/theme.ts @@ -621,6 +621,9 @@ export function setTheme(name: string, enableWatcher: boolean = false): { succes if (enableWatcher) { startThemeWatcher(); } + if (onThemeChangeCallback) { + onThemeChangeCallback(); + } return { success: true }; } catch (error) { // Theme is invalid - fall back to dark theme @@ -638,6 +641,9 @@ export function setThemeInstance(themeInstance: Theme): void { theme = themeInstance; currentThemeName = ""; stopThemeWatcher(); // Can't watch a direct instance + if (onThemeChangeCallback) { + onThemeChangeCallback(); + } } export function onThemeChange(callback: () => void): void {