Repository navigation
Conversation
Quit confirmation, Runtime Host recovery, settings confirmation and the other main-process decisions were drawn in a frameless BrowserWindow. That window is invisible to the accessibility tree, so AppleScript, System Events and VoiceOver could not see or answer it, and it never activated the app. A quit requested while Maka was in the background (Dock or AppleScript quit) put the "background work is running" confirmation behind the active app, and every later quit request was swallowed while it waited. Present these decisions with Electron's native message box instead: a sheet on the visible main window, or an app-modal alert without one. The app is activated before a decision is shown, and a quit request that arrives while one is pending activates it again. E2E runs that may not reveal windows still settle the dialog as cancelled without showing it. This removes the BrowserWindow dialog renderer, its presentation timeout, native fallback, design-token asset, navigation allowance and dialog-window lifetime guard, and moves the wordmark path back into the UI component that is now its only consumer. Generated-by: Claude Code
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Desktop decisions raised by the main process — quit while Runtime Host work is active, Runtime Host recovery, storage-root repair, Renderer recovery, settings confirmation and the fatal startup error — were drawn in a frameless
BrowserWindow(#4474). That window has two defects that cannot be fixed inside it without re-implementing the platform:osascript -e 'tell application "Maka" to quit') shows "Maka is working in the background" behind the active app, and the quit coordinator silently swallows every further quit request while it waits, so the quit looks ignored.This PR presents these decisions with Electron's native message box instead (an NSAlert sheet on macOS, a Task Dialog on Windows, a GTK dialog on Linux), attached to the main window when it is visible and app-modal otherwise. Before a decision is shown, the app is activated; a quit request that arrives while the quit decision is pending activates it again. E2E runs that may not reveal windows still settle the dialog as cancelled without showing it.
Process-level decisions use the platform's own dialog on purpose: they must work when the Renderer is missing or broken, which is exactly what forced the BrowserWindow version into its own lifecycle, presentation timeout and native fallback. Visually these dialogs follow the OS instead of Maka's palette; the macOS alert carries the app icon. Copy and button semantics are unchanged.
Removed with the BrowserWindow renderer: its presentation timeout and native fallback, the generated
browser-dialog-design-tokens.css, its navigation allowance in the architecture check, the dialog-window guard inwindow-all-closed, and the@maka/core/maka-wordmarkexport (the path moves back intoMakaWordmark, its only consumer).Verification
npm run build,npm --workspace @maka/desktop run typecheck,npm run format,npm run lint,npx knip(desktop, ui, core), renderer architecture check and its tests@maka/desktoptest:distsuite: 3276 passed, 0 failed. New:desktop-message-box.test.ts(hidden runs cancel without showing; active runs activate before showing, as a sheet when a parent is given), and a quit-coordinator case for re-revealing a pending decision.before-quitand brought Maka forward again; choosing "Stop tasks and quit" exited the app.-128(user canceled) beforebefore-quit; the sender gets an error instead of silence.workflow_dispatchprobe that bundles this branch'spresentMessageBox, shows the quit decision attached to a window and the startup error standalone, and answers both from outside the process (Windows run, Linux run):NO_AT_BRIDGE=1, so GTK's bridge stays off, and Chromium's own bridge only covers its frames. This matches the open/save dialogs Maka already shows on Linux; in the same run Chromium exposed the window frame but none of its web content either, so the probe gives no evidence the BrowserWindow dialog was more reachable there.AI use
Select exactly one:
Tool(s) and scope: Claude Code — diagnosis, implementation, tests, macOS verification and the Windows/Linux probe.
Checklist
Does this PR entail a change in behavior?