* feat: add recording state tracking to NodeService
Add IsScreenRecording/IsCameraRecording properties and RecordingStateChanged
event to NodeService. Wrap OnScreenRecord and OnCameraClip handlers to set
state and raise events before/after async recording calls.
This enables downstream UI components (tray icon, toasts, activity log) to
react to recording lifecycle changes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: add toast notifications for screen and camera recording
Show toasts on recording start, completion, and failure for both screen
recording and camera clips. Extract reusable ShowToast helper and add
localized strings for all 5 locales (en-us, fr-fr, zh-cn, zh-tw, nl-nl).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: log recording events to activity stream
Add recording start/complete events with emoji indicators (🔴/✅) to the
activity stream. Render emoji in a separate TextBlock element to prevent
color emoji clipping by the card's CornerRadius clip mask.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: add recording consent dialog before first recording
Show a standalone WindowEx consent dialog the first time an agent
requests screen or camera recording. Consent is tracked separately
per recording type (ScreenRecordingConsentGiven, CameraRecordingConsentGiven)
so users can allow screen recording without granting camera access.
The dialog uses extend-into-titlebar styling, Mica backdrop, and
SetForegroundWindow to ensure visibility.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: add privacy settings UI and polish consent dialog
- Add Privacy section to Settings with screen/camera recording toggles
- Settings toggles auto-refresh when consent changes externally
- Fix consent dialog z-order with HWND_TOPMOST technique
- Fix button width (MinWidth instead of fixed Width)
- Add SettingsManager.Saved event for cross-component reactivity
- Allow button uses AccentButtonStyle for consistency
- Remove misleading 'only asked once' from privacy text
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: serialize consent dialogs and settings saves to prevent races
- Add SemaphoreSlim guard in EnsureRecordingConsentAsync so concurrent
recording requests coalesce onto a single consent dialog per type
- Add lock around SettingsManager.Save() to prevent concurrent file writes
- Update privacy toggle text in all 5 locales to clarify that enabling
skips future consent prompts (e.g. 'Allow screen recording without prompting')
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: add 3-2-1 countdown overlay before recording starts
Show a translucent topmost countdown window (3 → 2 → 1) before screen
and camera recordings begin, similar to Windows Snipping Tool. Gives users
clear visual indication that recording is about to start.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(video): harden recording consent persistence
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: settings dirty-state guard, consent dialog copy, and tests
- Add dirty-state guard to SettingsPage: external consent saves no
longer overwrite unsaved user edits on the Settings page
- Update consent dialog description in all 5 locales to explicitly
state that the choice persists until changed in Settings
- Add 4 focused tests for settings save thread safety, Saved event,
consent persistence, and consent revocation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Christine Yan <christineyan@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Scott Hanselman <scott@hanselman.com>