Replace guided onboarding with welcome video#655
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
@copilot review but do not make fixes |
📝 WalkthroughWalkthroughRemoves the entire tour/wizard/tutorial onboarding system (registry, TourController, all tour definitions, step builders, TourHost/TourOverlay/TourStep, WelcomeWizard, onboardingStore, and fx animation components). Replaces it with a ChangesTour/Wizard Removal and Welcome Video Gate
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/desktop/src/main/services/onboarding/onboardingService.ts (1)
30-42: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winTrim glossary ids while normalizing.
Line 36 only checks
v.length > 0, so" Lane "and"Lane"survive as different ids even thoughmarkGlossaryTermSeen()later canonicalizes new input withtrim(). That makes upgraded or hand-edited state non-idempotent.Proposed fix
const seen = Array.isArray(r.glossaryTermsSeen) ? Array.from( new Set( - r.glossaryTermsSeen.filter((v): v is string => typeof v === "string" && v.length > 0), + r.glossaryTermsSeen + .map((v) => (typeof v === "string" ? v.trim() : "")) + .filter((v): v is string => v.length > 0), ), ) : [];🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/desktop/src/main/services/onboarding/onboardingService.ts` around lines 30 - 42, normalizeHelpState currently deduplicates glossaryTermsSeen without trimming, so values like " Lane " and "Lane" stay as separate ids. Update the normalization in normalizeHelpState to trim each string before filtering/deduping, and use the trimmed value when building the seen array so it stays consistent with markGlossaryTermSeen().
🧹 Nitpick comments (1)
apps/desktop/src/preload/global.d.ts (1)
649-652: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winMake
reasonrequired on the preload contract.
registerIpc.tswritesdismissedAtwhenever this arg is omitted, so the optional type here lets a caller accidentally suppress the gate without any TS error. Requiring the reason makes the preload contract match the persisted behavior.Proposed fix
markWelcomeVideoSeen: ( - reason?: "completed" | "dismissed", + reason: "completed" | "dismissed", ) => Promise<AppWelcomeVideoState>;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/desktop/src/preload/global.d.ts` around lines 649 - 652, The preload contract for markWelcomeVideoSeen currently allows reason to be omitted, which does not match the persisted behavior in registerIpc.ts. Update the AppWelcomeVideoState API declaration in global.d.ts so markWelcomeVideoSeen requires a reason argument, and keep the allowed values limited to "completed" and "dismissed" to align the preload signature with the IPC implementation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/desktop/src/main/rendererCsp.test.ts`:
- Around line 40-45: The renderer CSP test in rendererCsp.test.ts only checks
that the two YouTube frame hosts are present and that blanket https: is absent,
so extra allowed hosts could still pass. Tighten the assertion around
frameSrc/frameTokens to compare the external https:// allowlist against the
exact expected set for the frame-src directive, ensuring no additional external
frame origins are permitted.
In `@apps/desktop/src/main/services/ipc/registerIpc.ts`:
- Around line 1656-1663: The welcome video state normalization is keeping the
original timestamp string even after a trim check, so whitespace and invalid
values can persist in `normalizeWelcomeVideoState`. Update the `completedAt` and
`dismissedAt` handling to return a trimmed value only when it is a non-empty
valid date string, and otherwise return null so corrupted timestamps cannot
suppress the welcome gate. Use a small helper like
`normalizeWelcomeVideoTimestamp` near `normalizeWelcomeVideoState` and apply it
to both fields.
In `@apps/desktop/src/renderer/browserMock.ts`:
- Line 3570: The browser mock’s markGlossaryTermSeen mapping is returning the
unchanged BROWSER_MOCK_HELP_STATE, so glossary terms are not actually recorded
as seen. Update the mock in browserMock.ts so the markGlossaryTermSeen handler
mutates or derives a new help state that includes the newly seen term, instead
of using resolvedArg(BROWSER_MOCK_HELP_STATE) directly.
In `@apps/desktop/src/renderer/components/app/TabNav.tsx`:
- Around line 165-190: The disabled-tab branch in TabNav uses a non-focusable
div inside SmartTooltip, so the disabled state and tooltip text are only
available on hover. Update the isActiveAllowed false path to use a
keyboard-focusable element or disabled control and add the proper disabled
semantics/ARIA so TabNav items remain discoverable by keyboard and screen-reader
users. Keep the fix localized to the SmartTooltip wrapper and the tab item
rendering for it.to/it.label.
In `@apps/desktop/src/renderer/components/onboarding/WelcomeVideoGate.tsx`:
- Around line 235-240: The welcome video iframe in WelcomeVideoGate should be
hardened by reducing third-party capabilities and adding a sandbox boundary.
Update the iframe attributes to remove unnecessary permissions like
clipboard-write, sensors, and web-share, and add a restrictive sandbox
configuration that still allows required YouTube playback in the Electron
renderer. Verify the video still loads and plays correctly after tightening the
iframe permissions.
---
Outside diff comments:
In `@apps/desktop/src/main/services/onboarding/onboardingService.ts`:
- Around line 30-42: normalizeHelpState currently deduplicates glossaryTermsSeen
without trimming, so values like " Lane " and "Lane" stay as separate ids.
Update the normalization in normalizeHelpState to trim each string before
filtering/deduping, and use the trimmed value when building the seen array so it
stays consistent with markGlossaryTermSeen().
---
Nitpick comments:
In `@apps/desktop/src/preload/global.d.ts`:
- Around line 649-652: The preload contract for markWelcomeVideoSeen currently
allows reason to be omitted, which does not match the persisted behavior in
registerIpc.ts. Update the AppWelcomeVideoState API declaration in global.d.ts
so markWelcomeVideoSeen requires a reason argument, and keep the allowed values
limited to "completed" and "dismissed" to align the preload signature with the
IPC implementation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 359bf799-f015-41fa-8524-0fd18ba0e8ea
⛔ Files ignored due to path filters (16)
apps/desktop/src/renderer/assets/onboarding/automations-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/cto-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/files-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/ghost-cursor.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/graph-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/history-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/lanes-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/prs-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/run-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/settings-hero.svgis excluded by!**/*.svgapps/desktop/src/renderer/assets/onboarding/work-hero.svgis excluded by!**/*.svgdocs/ARCHITECTURE.mdis excluded by!docs/**docs/features/cto/README.mdis excluded by!docs/**docs/features/onboarding-and-settings/README.mdis excluded by!docs/**docs/features/onboarding-and-settings/configuration-schema.mdis excluded by!docs/**docs/features/onboarding-and-settings/first-run.mdis excluded by!docs/**
📒 Files selected for processing (88)
apps/desktop/src/main/rendererCsp.test.tsapps/desktop/src/main/rendererCsp.tsapps/desktop/src/main/services/adeActions/registry.tsapps/desktop/src/main/services/ipc/registerIpc.tsapps/desktop/src/main/services/onboarding/onboardingService.test.tsapps/desktop/src/main/services/onboarding/onboardingService.tsapps/desktop/src/main/services/state/globalState.tsapps/desktop/src/main/services/usage/usageTrackingService.test.tsapps/desktop/src/preload/global.d.tsapps/desktop/src/preload/preload.test.tsapps/desktop/src/preload/preload.tsapps/desktop/src/renderer/assets/onboarding/README.mdapps/desktop/src/renderer/browserMock.tsapps/desktop/src/renderer/components/app/CommandPalette.test.tsxapps/desktop/src/renderer/components/app/CommandPalette.tsxapps/desktop/src/renderer/components/app/TabNav.tsxapps/desktop/src/renderer/components/cto/CtoPage.tsxapps/desktop/src/renderer/components/lanes/LanesPage.tsxapps/desktop/src/renderer/components/onboarding/DidYouKnow.tsxapps/desktop/src/renderer/components/onboarding/HelpChip.tsxapps/desktop/src/renderer/components/onboarding/HelpMenu.tsxapps/desktop/src/renderer/components/onboarding/OnboardingBootstrap.tsxapps/desktop/src/renderer/components/onboarding/WelcomeVideoGate.test.tsxapps/desktop/src/renderer/components/onboarding/WelcomeVideoGate.tsxapps/desktop/src/renderer/components/onboarding/WelcomeWizard.tsxapps/desktop/src/renderer/components/onboarding/fx/ActIntro.tsxapps/desktop/src/renderer/components/onboarding/fx/AnimatedField.tsxapps/desktop/src/renderer/components/onboarding/fx/Confetti.tsxapps/desktop/src/renderer/components/onboarding/fx/GhostCursor.tsxapps/desktop/src/renderer/components/onboarding/fx/MorphingTree.tsxapps/desktop/src/renderer/components/onboarding/fx/Spotlight.tsxapps/desktop/src/renderer/components/onboarding/fx/StaggeredText.tsxapps/desktop/src/renderer/components/onboarding/fx/TourIllustration.tsxapps/desktop/src/renderer/components/onboarding/fx/index.tsapps/desktop/src/renderer/components/onboarding/fx/useReducedMotion.tsapps/desktop/src/renderer/components/onboarding/illustrations/WelcomeIllustrations.tsxapps/desktop/src/renderer/components/onboarding/tour/TourHost.tsxapps/desktop/src/renderer/components/onboarding/tour/TourOverlay.tsxapps/desktop/src/renderer/components/onboarding/tour/TourStep.tsxapps/desktop/src/renderer/components/prs/detail/PrDetailPane.tsxapps/desktop/src/renderer/components/terminals/SessionListPane.tsxapps/desktop/src/renderer/components/terminals/TerminalsPage.tsxapps/desktop/src/renderer/components/ui/SmartTooltip.tsxapps/desktop/src/renderer/index.cssapps/desktop/src/renderer/lib/dialogBus.tsapps/desktop/src/renderer/lib/useDialogBus.tsapps/desktop/src/renderer/onboarding/TourController.tsapps/desktop/src/renderer/onboarding/docsLinks.tsapps/desktop/src/renderer/onboarding/registry.tsapps/desktop/src/renderer/onboarding/stepBuilders/README.mdapps/desktop/src/renderer/onboarding/stepBuilders/createLaneDialog.test.tsapps/desktop/src/renderer/onboarding/stepBuilders/createLaneDialog.tsapps/desktop/src/renderer/onboarding/stepBuilders/gitActionsPane.tsapps/desktop/src/renderer/onboarding/stepBuilders/index.tsapps/desktop/src/renderer/onboarding/stepBuilders/manageLaneDialog.tsapps/desktop/src/renderer/onboarding/stepBuilders/prCreateModal.tsapps/desktop/src/renderer/onboarding/tourGuards.tsapps/desktop/src/renderer/onboarding/tours/automationsHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/automationsTour.tsapps/desktop/src/renderer/onboarding/tours/ctoHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/ctoTour.tsapps/desktop/src/renderer/onboarding/tours/filesHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/filesTour.tsapps/desktop/src/renderer/onboarding/tours/firstJourneyTour.test.tsapps/desktop/src/renderer/onboarding/tours/firstJourneyTour.tsapps/desktop/src/renderer/onboarding/tours/graphHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/graphTour.tsapps/desktop/src/renderer/onboarding/tours/historyHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/historyTour.tsapps/desktop/src/renderer/onboarding/tours/index.tsapps/desktop/src/renderer/onboarding/tours/laneWorkPaneHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/laneWorkPaneTour.tsapps/desktop/src/renderer/onboarding/tours/lanesHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/lanesTour.tsapps/desktop/src/renderer/onboarding/tours/prsHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/prsTour.test.tsapps/desktop/src/renderer/onboarding/tours/prsTour.tsapps/desktop/src/renderer/onboarding/tours/runHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/runTour.tsapps/desktop/src/renderer/onboarding/tours/settingsHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/settingsTour.tsapps/desktop/src/renderer/onboarding/tours/workHighlightsTour.tsapps/desktop/src/renderer/onboarding/tours/workTour.tsapps/desktop/src/renderer/onboarding/waitForTarget.tsapps/desktop/src/renderer/state/onboardingStore.tsapps/desktop/src/shared/ipc.tsapps/desktop/src/shared/types/core.tsapps/desktop/src/shared/welcomeVideo.ts
💤 Files with no reviewable changes (58)
- apps/desktop/src/renderer/onboarding/TourController.ts
- apps/desktop/src/renderer/components/onboarding/fx/ActIntro.tsx
- apps/desktop/src/renderer/onboarding/tours/automationsHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/prsTour.test.ts
- apps/desktop/src/renderer/components/onboarding/fx/useReducedMotion.ts
- apps/desktop/src/renderer/onboarding/tours/runTour.ts
- apps/desktop/src/renderer/components/onboarding/tour/TourHost.tsx
- apps/desktop/src/renderer/onboarding/tours/lanesHighlightsTour.ts
- apps/desktop/src/renderer/components/onboarding/fx/StaggeredText.tsx
- apps/desktop/src/renderer/onboarding/tours/runHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/workHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/index.ts
- apps/desktop/src/renderer/components/onboarding/fx/AnimatedField.tsx
- apps/desktop/src/renderer/components/onboarding/illustrations/WelcomeIllustrations.tsx
- apps/desktop/src/renderer/components/onboarding/fx/Spotlight.tsx
- apps/desktop/src/renderer/onboarding/stepBuilders/createLaneDialog.test.ts
- apps/desktop/src/renderer/onboarding/tours/laneWorkPaneHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/waitForTarget.ts
- apps/desktop/src/renderer/components/onboarding/fx/GhostCursor.tsx
- apps/desktop/src/renderer/onboarding/stepBuilders/manageLaneDialog.ts
- apps/desktop/src/renderer/onboarding/tours/graphHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/stepBuilders/index.ts
- apps/desktop/src/renderer/components/onboarding/fx/TourIllustration.tsx
- apps/desktop/src/renderer/components/onboarding/fx/MorphingTree.tsx
- apps/desktop/src/renderer/components/onboarding/tour/TourOverlay.tsx
- apps/desktop/src/renderer/onboarding/tours/historyTour.ts
- apps/desktop/src/renderer/components/app/CommandPalette.tsx
- apps/desktop/src/renderer/components/onboarding/fx/Confetti.tsx
- apps/desktop/src/renderer/onboarding/tours/historyHighlightsTour.ts
- apps/desktop/src/renderer/components/onboarding/WelcomeWizard.tsx
- apps/desktop/src/renderer/onboarding/stepBuilders/README.md
- apps/desktop/src/renderer/onboarding/tours/ctoHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/firstJourneyTour.ts
- apps/desktop/src/renderer/onboarding/tours/laneWorkPaneTour.ts
- apps/desktop/src/renderer/onboarding/tours/filesTour.ts
- apps/desktop/src/renderer/onboarding/tours/prsHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/workTour.ts
- apps/desktop/src/renderer/onboarding/tours/settingsTour.ts
- apps/desktop/src/renderer/assets/onboarding/README.md
- apps/desktop/src/main/services/adeActions/registry.ts
- apps/desktop/src/renderer/onboarding/tours/settingsHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/automationsTour.ts
- apps/desktop/src/renderer/components/onboarding/fx/index.ts
- apps/desktop/src/renderer/state/onboardingStore.ts
- apps/desktop/src/renderer/onboarding/tours/graphTour.ts
- apps/desktop/src/renderer/components/prs/detail/PrDetailPane.tsx
- apps/desktop/src/renderer/components/onboarding/tour/TourStep.tsx
- apps/desktop/src/renderer/onboarding/stepBuilders/prCreateModal.ts
- apps/desktop/src/renderer/onboarding/tours/filesHighlightsTour.ts
- apps/desktop/src/renderer/onboarding/tours/firstJourneyTour.test.ts
- apps/desktop/src/renderer/onboarding/stepBuilders/gitActionsPane.ts
- apps/desktop/src/renderer/onboarding/tourGuards.ts
- apps/desktop/src/renderer/onboarding/tours/ctoTour.ts
- apps/desktop/src/renderer/onboarding/tours/lanesTour.ts
- apps/desktop/src/renderer/onboarding/stepBuilders/createLaneDialog.ts
- apps/desktop/src/renderer/onboarding/registry.ts
- apps/desktop/src/renderer/index.css
- apps/desktop/src/renderer/onboarding/tours/prsTour.ts
|
@codex review |
|
Codex Review: Didn't find any major issues. More of your lovely PRs please. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Summary
Describe the change.
What Changed
Key files and behaviors.
Validation
How you tested.
Risks
Anything to watch.
Summary by CodeRabbit
New Features
Bug Fixes
Greptile Summary
This PR replaces the multi-step tour/wizard onboarding system (~8 400 lines removed) with a lightweight welcome video gate backed by two new IPC endpoints (
getWelcomeVideoState/markWelcomeVideoSeen), stored in global state with version-aware normalization that resets on video ID or version change.WelcomeVideoGatecomponent shows a YouTube nocookie embed on first launch; state is persisted per-machine inglobalState.tsand is reset whenADE_WELCOME_VIDEO_VERSIONbumps. A custom DOM event (ade:welcome-video:replay) lets the Help menu trigger a replay without re-querying IPC.DidYouKnowgains 20+ new product-area hints and no longer depends ononboardingEnabled(it now gates only ondidYouKnowEnabled);TabNavwraps each item inSmartTooltipwith per-tab descriptions and doc links;HelpChipglossary tracking becomes fully fire-and-forget.onboardingStoreis removed; IPC channels drop from 15 onboarding channels to 2; the CSPframe-srcis extended to include YouTube embed hosts.Confidence Score: 5/5
Safe to merge — the main change is a large deletion of the old tour/wizard system with a clean, well-tested replacement; the new IPC endpoints, normalization logic, and state schema are straightforward
All new code paths (welcome video gate, IPC handlers, state normalization) are covered by tests; the normalization correctly resets state on version bump; the fire-and-forget markWelcomeVideoSeen call is an acceptable tradeoff for perceived responsiveness on a one-time action; the only finding is that the YouTube fullscreen button won't work due to a missing allow-fullscreen in the sandbox, which is a minor cosmetic limitation rather than a functional regression
No files require special attention beyond the single iframe sandbox fix in WelcomeVideoGate.tsx
Important Files Changed
allow-fullscreenso the YouTube fullscreen button won't workSequence Diagram
%%{init: {'theme': 'neutral'}}%% sequenceDiagram participant R as Renderer (WelcomeVideoGate) participant P as Preload participant M as Main (registerIpc) participant G as globalState.json R->>P: getWelcomeVideoState() P->>M: IPC appGetWelcomeVideoState M->>G: readGlobalState() G-->>M: "GlobalState { welcomeVideo? }" M-->>P: normalizeWelcomeVideoState(welcomeVideo) P-->>R: AppWelcomeVideoState alt "completedAt == null and dismissedAt == null" R->>R: setVisible(true) → show dialog + YouTube iframe R->>P: markWelcomeVideoSeen(reason) P->>M: "IPC appMarkWelcomeVideoSeen { reason }" M->>G: "writeGlobalState({ welcomeVideo: next })" M-->>P: updated AppWelcomeVideoState P-->>R: fire-and-forget R->>R: setVisible(false) else already seen R->>R: setVisible(false) → skip dialog end note over R: ADE_WELCOME_VIDEO_REPLAY_EVENT R->>R: window.dispatchEvent(replay) → setVisible(true)%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant R as Renderer (WelcomeVideoGate) participant P as Preload participant M as Main (registerIpc) participant G as globalState.json R->>P: getWelcomeVideoState() P->>M: IPC appGetWelcomeVideoState M->>G: readGlobalState() G-->>M: "GlobalState { welcomeVideo? }" M-->>P: normalizeWelcomeVideoState(welcomeVideo) P-->>R: AppWelcomeVideoState alt "completedAt == null and dismissedAt == null" R->>R: setVisible(true) → show dialog + YouTube iframe R->>P: markWelcomeVideoSeen(reason) P->>M: "IPC appMarkWelcomeVideoSeen { reason }" M->>G: "writeGlobalState({ welcomeVideo: next })" M-->>P: updated AppWelcomeVideoState P-->>R: fire-and-forget R->>R: setVisible(false) else already seen R->>R: setVisible(false) → skip dialog end note over R: ADE_WELCOME_VIDEO_REPLAY_EVENT R->>R: window.dispatchEvent(replay) → setVisible(true)Comments Outside Diff (1)
apps/desktop/src/main/rendererCsp.ts, line 9 (link)https://www.youtube.cominframe-srcbroader than neededThe welcome video iframe uses
https://www.youtube-nocookie.com/embed/...exclusively — the privacy-enhanced embed domain does not load sub-frames back fromwww.youtube.com. Including it inframe-srcpermits the main YouTube site to be framed in the renderer, which is more permissive than required and expands the CSP surface unnecessarily. Removinghttps://www.youtube.comwhile keepinghttps://www.youtube-nocookie.comwould be sufficient for the embed to work.Prompt To Fix With AI
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Reviews (2): Last reviewed commit: "ship: iteration 1 - fix desktop shard 2" | Re-trigger Greptile