• Will Chen's avatar
    Add native notification when chat stream completes (#2413) · 0409aa03
    Will Chen 提交于
    ## Summary
    - Add a native notification that appears when a chat response completes
    while the Dyad app window is not focused
    - Controlled by a new setting "Show notification when chat completes" in
    Workflow Settings
    - Enabled by default for a seamless notification experience
    
    ## Implementation
    - Added `enableChatCompletionNotifications` setting to
    UserSettingsSchema (default: true)
    - Added `isWindowFocused` IPC contract and handler to check window focus
    state from main process
    - Added notification logic to `useStreamChat`'s `onEnd` callback using
    the Web Notification API
    - Created `ChatCompletionNotificationSwitch` component for the settings
    toggle
    - Added the toggle to the Workflow Settings section in the Settings page
    
    ## Test plan
    1. Start the app and enable notifications in Workflow Settings (enabled
    by default)
    2. Start a chat and switch focus to another application
    3. Wait for the chat response to complete
    4. Verify a native notification appears saying "Chat response completed"
    5. When Dyad is focused, verify no notification appears
    6. Disable the setting and verify notifications stop appearing
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    <!-- devin-review-badge-begin -->
    
    ---
    
    <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2413">
      <picture>
    <source media="(prefers-color-scheme: dark)"
    srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
    <img
    src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
    alt="Open with Devin">
      </picture>
    </a>
    <!-- devin-review-badge-end -->
    
    <!-- CURSOR_SUMMARY -->
    ---
    
    > [!NOTE]
    > **Low Risk**
    > Mostly additive UI/renderer changes with an optional IPC payload
    field; main risk is runtime differences around `Notification`
    permissions/focus detection across platforms.
    > 
    > **Overview**
    > Adds an opt-in Workflow Settings toggle
    (`enableChatCompletionNotifications`) that requests Web Notification
    permission when enabled.
    > 
    > When a chat stream ends, the renderer now conditionally fires a native
    `Notification` if the setting is enabled, permission is granted, and the
    window is not focused, using the app name as the title and a truncated
    `chatSummary`/chat title as the body.
    > 
    > Extends the `ChatResponseEnd` IPC payload with optional `chatSummary`
    and populates it from both the standard stream handler and the
    local-agent handler so the renderer can display richer completion
    notifications.
    > 
    > <sup>Written by [Cursor
    Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
    02cb0c28d1bd72cf01e48f6923f4d2285df4aaa3. This will update automatically
    on new commits. Configure
    [here](https://cursor.com/dashboard?tab=bugbot).</sup>
    <!-- /CURSOR_SUMMARY -->
    
    <!-- This is an auto-generated description by cubic. -->
    ---
    ## Summary by cubic
    Adds a native desktop notification when a chat response completes while
    Dyad isn’t focused, controlled by a new Workflow Settings toggle enabled
    by default. Helps you notice finished replies while multitasking.
    
    - **New Features**
      - New setting: “Show notification when chat completes” (default on).
    - Requests notification permission when you enable it; notifications
    show only if permission is granted.
    - Sends a notification via the Web Notification API when the window
    isn’t focused (document.hasFocus), using the app name as the title and
    the chat summary (or chat title) as the body.
    
    <sup>Written for commit 02cb0c28d1bd72cf01e48f6923f4d2285df4aaa3.
    Summary will update on new commits.</sup>
    
    <!-- End of auto-generated description by cubic. -->
    
    ---------
    Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
    0409aa03
名称
最后提交
最后更新
..
chat 正在载入提交数据...
home 正在载入提交数据...
preview_panel 正在载入提交数据...
settings 正在载入提交数据...
ui 正在载入提交数据...
AIGeneratorTab.tsx 正在载入提交数据...
AppList.tsx 正在载入提交数据...
AppSearchDialog.tsx 正在载入提交数据...
AppUpgrades.tsx 正在载入提交数据...
AutoApproveSwitch.tsx 正在载入提交数据...
AutoExpandPreviewSwitch.tsx 正在载入提交数据...
AutoFixProblemsSwitch.tsx 正在载入提交数据...
AutoUpdateSwitch.tsx 正在载入提交数据...
BugScreenshotDialog.tsx 正在载入提交数据...
CapacitorControls.tsx 正在载入提交数据...
ChatCompletionNotificationSwitch.tsx 正在载入提交数据...
ChatInputControls.tsx 正在载入提交数据...
ChatList.tsx 正在载入提交数据...
ChatModeSelector.tsx 正在载入提交数据...
ChatPanel.tsx 正在载入提交数据...
ChatSearchDialog.tsx 正在载入提交数据...
CommunityCodeConsentDialog.tsx 正在载入提交数据...
ConfirmationDialog.tsx 正在载入提交数据...
ContextFilesPicker.tsx 正在载入提交数据...
CopyErrorMessage.tsx 正在载入提交数据...
CreateAppDialog.tsx 正在载入提交数据...
CreateCustomModelDialog.tsx 正在载入提交数据...
CreateCustomProviderDialog.tsx 正在载入提交数据...
CreatePromptDialog.tsx 正在载入提交数据...
CustomErrorToast.tsx 正在载入提交数据...
CustomThemeDialog.tsx 正在载入提交数据...
DefaultChatModeSelector.tsx 正在载入提交数据...
DeleteConfirmationDialog.tsx 正在载入提交数据...
DyadProSuccessDialog.tsx 正在载入提交数据...
DyadProTrialDialog.tsx 正在载入提交数据...
EditCustomModelDialog.tsx 正在载入提交数据...
EditThemeDialog.tsx 正在载入提交数据...
ErrorBoundary.tsx 正在载入提交数据...
ForceCloseDialog.tsx 正在载入提交数据...
GitHubConnector.tsx 正在载入提交数据...
GitHubIntegration.tsx 正在载入提交数据...
GithubBranchManager.tsx 正在载入提交数据...
GithubCollaboratorManager.tsx 正在载入提交数据...
HelpBotDialog.tsx 正在载入提交数据...
HelpDialog.tsx 正在载入提交数据...
ImportAppButton.tsx 正在载入提交数据...
ImportAppDialog.tsx 正在载入提交数据...
InputRequestToast.tsx 正在载入提交数据...
LibraryList.tsx 正在载入提交数据...
LoadingBlock.tsx 正在载入提交数据...
LocalAgentNewChatToast.tsx 正在载入提交数据...
MaxChatTurnsSelector.tsx 正在载入提交数据...
McpConsentToast.tsx 正在载入提交数据...
McpToolsPicker.tsx 正在载入提交数据...
ModelPicker.tsx 正在载入提交数据...
NeonConnector.tsx 正在载入提交数据...
NeonDisconnectButton.tsx 正在载入提交数据...
NeonIntegration.tsx 正在载入提交数据...
NodePathSelector.tsx 正在载入提交数据...
PortalMigrate.tsx 正在载入提交数据...
PriceBadge.tsx 正在载入提交数据...
ProBanner.tsx 正在载入提交数据...
ProModeSelector.tsx 正在载入提交数据...
ProviderSettings.tsx 正在载入提交数据...
ReleaseChannelSelector.tsx 正在载入提交数据...
RuntimeModeSelector.tsx 正在载入提交数据...
ScreenshotSuccessDialog.tsx 正在载入提交数据...
SettingsList.tsx 正在载入提交数据...
SetupBanner.tsx 正在载入提交数据...
SetupProviderCard.tsx 正在载入提交数据...
SupabaseConnector.tsx 正在载入提交数据...
SupabaseIntegration.tsx 正在载入提交数据...
TelemetryBanner.tsx 正在载入提交数据...
TelemetrySwitch.tsx 正在载入提交数据...
TemplateCard.tsx 正在载入提交数据...
ThinkingBudgetSelector.tsx 正在载入提交数据...
VercelConnector.tsx 正在载入提交数据...
VercelIntegration.tsx 正在载入提交数据...
ZoomSelector.tsx 正在载入提交数据...
app-sidebar.tsx 正在载入提交数据...
appItem.tsx 正在载入提交数据...