diff --git a/frontend/src/app/components/Onboarding/OnboardingRoot.tsx b/frontend/src/app/components/Onboarding/OnboardingRoot.tsx index e4b71fef..300334dc 100644 --- a/frontend/src/app/components/Onboarding/OnboardingRoot.tsx +++ b/frontend/src/app/components/Onboarding/OnboardingRoot.tsx @@ -65,8 +65,8 @@ const OnboardingRoot: React.FC = () => { !(s.onboardingProgress.completedSteps ?? []).includes('launch_agent') && Object.keys(s.agents?.sessions ?? {}).length === 0, ); - // Onboarding v3 owns the window on a fresh install; the v2 cursor tour stays dormant until the flow resolves. - const v3Owns = useAppSelector((s) => s.onboardingV3.flowActive); + // Onboarding v3 owns the window on a fresh install; the v2 cursor tour + panel stay dormant while the flow runs AND forever after it resolves (a v3'd user has already onboarded, so the v2 "connect your model / Show me" tour on top of the v3 reveal is contradictory clutter). + const v3Owns = useAppSelector((s) => s.onboardingV3.flowActive || !!s.settings.data.onboarding_v3); const welcomeFiredRef = useRef(false); const welcomeTimerRef = useRef(null); useEffect(() => { diff --git a/frontend/src/app/components/nudges/PrepKeepToast.tsx b/frontend/src/app/components/nudges/PrepKeepToast.tsx index 95bb1560..5b9a9358 100644 --- a/frontend/src/app/components/nudges/PrepKeepToast.tsx +++ b/frontend/src/app/components/nudges/PrepKeepToast.tsx @@ -58,15 +58,15 @@ const PrepKeepToast: React.FC = () => { action={ <> } > - {`I started ${names} while you set up. Keep going?`} + {`These are ${names}, which I started for you during setup. Keep them, or stop and remove them?`} ); diff --git a/frontend/src/app/pages/Dashboard/hooks/lifecycle/useOnboardingRevealSeed.ts b/frontend/src/app/pages/Dashboard/hooks/lifecycle/useOnboardingRevealSeed.ts index 09e7ee6c..fb4c3dab 100644 --- a/frontend/src/app/pages/Dashboard/hooks/lifecycle/useOnboardingRevealSeed.ts +++ b/frontend/src/app/pages/Dashboard/hooks/lifecycle/useOnboardingRevealSeed.ts @@ -34,11 +34,14 @@ export function useOnboardingRevealSeed({ isActive, dashboardId, expandedSession const cy = (vr.height / 2 - cs.panY) / cs.zoom; const audit = prepped.find((j) => j.kind === 'audit'); const app = prepped.find((j) => j.kind === 'app'); - const lines: string[] = ['While you were setting up, I got started.']; - if (scanSummary) lines.push(`Spotted on this Mac: ${scanSummary}.`); - if (audit) lines.push(`Already running: ${audit.title}.`); - if (app) lines.push(`Already building: ${app.title}.`); - if (starters.length > 0) lines.push(`Ready to run:\n${starters.slice(audit ? 1 : 0).map((s) => `- ${s.title}`).join('\n')}`); + const lines: string[] = ['Here is what I set up for you.']; + if (scanSummary) lines.push(`Looked around: ${scanSummary}.`); + const cards: string[] = []; + if (audit) cards.push(`- ${audit.title} (running now, on the left)`); + if (app) cards.push(`- ${app.title} (building now)`); + if (cards.length > 0) lines.push(`Working on:\n${cards.join('\n')}`); + if (starters.length > 0) lines.push(`Ready when you are:\n${starters.slice(audit ? 1 : 0).map((s) => `- ${s.title}`).join('\n')}`); + lines.push('Nothing is saved or deleted without you. Keep or discard anytime.'); dispatch(addNote({ x: cx + DEFAULT_CARD_W / 2 + 48, y: cy - 140, color: 'yellow', content: lines.join('\n\n') })); prepped.forEach((job, i) => { dispatch(placeCard({