From b6a6202d4646bcd57eae6efedc7a7c81a832d4f4 Mon Sep 17 00:00:00 2001 From: Steven Enamakel <31011319+senamakel@users.noreply.github.com> Date: Mon, 22 Jun 2026 17:36:22 -0700 Subject: [PATCH] fix(onboarding): update walkthrough targets (#3944) --- .../components/walkthrough/AppWalkthrough.tsx | 8 +- .../walkthrough/WalkthroughTooltip.tsx | 6 +- .../__tests__/AppWalkthrough.test.tsx | 46 +++++-- .../walkthrough/walkthroughSteps.ts | 117 +++++++++++------- app/src/lib/i18n/ar.ts | 36 ++++++ app/src/lib/i18n/bn.ts | 38 ++++++ app/src/lib/i18n/de.ts | 39 ++++++ app/src/lib/i18n/en.ts | 39 ++++++ app/src/lib/i18n/es.ts | 39 ++++++ app/src/lib/i18n/fr.ts | 39 ++++++ app/src/lib/i18n/hi.ts | 38 ++++++ app/src/lib/i18n/id.ts | 39 ++++++ app/src/lib/i18n/it.ts | 38 ++++++ app/src/lib/i18n/ko.ts | 37 ++++++ app/src/lib/i18n/pl.ts | 38 ++++++ app/src/lib/i18n/pt.ts | 38 ++++++ app/src/lib/i18n/ru.ts | 39 ++++++ app/src/lib/i18n/zh-CN.ts | 33 +++++ app/src/pages/onboarding/Onboarding.tsx | 4 +- .../pages/onboarding/OnboardingContext.tsx | 2 +- app/src/pages/onboarding/OnboardingLayout.tsx | 8 +- .../__tests__/OnboardingLayout.test.tsx | 12 +- 22 files changed, 653 insertions(+), 80 deletions(-) diff --git a/app/src/components/walkthrough/AppWalkthrough.tsx b/app/src/components/walkthrough/AppWalkthrough.tsx index db533d1cc..148c9a195 100644 --- a/app/src/components/walkthrough/AppWalkthrough.tsx +++ b/app/src/components/walkthrough/AppWalkthrough.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import { type EventData, EVENTS, Joyride, STATUS } from 'react-joyride'; import { useNavigate } from 'react-router-dom'; +import { useT } from '../../lib/i18n/I18nContext'; import { createWalkthroughSteps } from './walkthroughSteps'; import WalkthroughTooltip from './WalkthroughTooltip'; @@ -32,7 +33,7 @@ export function isWalkthroughPending(userIsOnboarded = false): boolean { /** * Flags the walkthrough as pending. Called by OnboardingLayout when the user - * completes the wizard and is about to navigate to /home. + * completes the wizard and is about to navigate to /chat. * * Best-effort: if localStorage is unavailable (SecurityError / quota) the * error is logged and the call is silently swallowed so navigation always @@ -65,7 +66,7 @@ export function markWalkthroughComplete(): void { } /** - * Resets the walkthrough so it will play again on next visit to /home. + * Resets the walkthrough so it will play again on the current app shell. * * - Removes the completed flag from localStorage. * - Sets the pending flag so `isWalkthroughPending()` returns true. @@ -98,13 +99,14 @@ export function resetWalkthrough(): void { */ const AppWalkthrough = ({ onboarded = false }: { onboarded?: boolean }) => { const navigate = useNavigate(); + const { t } = useT(); // Only start running if the walkthrough is pending on first render. // Using a lazy initializer keeps this stable across re-renders. const [run, setRun] = useState(() => isWalkthroughPending(onboarded)); // Memoize steps so they are only recreated when `navigate` identity changes. - const steps = useMemo(() => createWalkthroughSteps(navigate), [navigate]); + const steps = useMemo(() => createWalkthroughSteps(navigate, t), [navigate, t]); // Listen for the `walkthrough:restart` custom event (dispatched by // `resetWalkthrough()`) and restart the tour immediately. diff --git a/app/src/components/walkthrough/WalkthroughTooltip.tsx b/app/src/components/walkthrough/WalkthroughTooltip.tsx index ef0e957ec..51139aab6 100644 --- a/app/src/components/walkthrough/WalkthroughTooltip.tsx +++ b/app/src/components/walkthrough/WalkthroughTooltip.tsx @@ -2,10 +2,8 @@ import type { TooltipRenderProps } from 'react-joyride'; import { useT } from '../../lib/i18n/I18nContext'; -/** Emoji accents per step — adds visual personality to each tooltip. - * 10 entries map to: home-card, home-cta, chat, integrations, channels, - * intelligence, settings, quick-access tabs, notifications, final. */ -const STEP_ICONS = ['🏠', '💬', '🗨️', '🧩', '📱', '🧠', '⚙️', '⚡', '🔔', '🎉']; +/** Emoji accents per walkthrough step. */ +const STEP_ICONS = ['💬', '👋', '🗨️', '🧩', '📱', '⚙️', '💬', '👤', '🧠', '🌐', '🔌', '✉️', '🎉']; /** * Premium tooltip for the post-onboarding Joyride walkthrough. diff --git a/app/src/components/walkthrough/__tests__/AppWalkthrough.test.tsx b/app/src/components/walkthrough/__tests__/AppWalkthrough.test.tsx index ab32256ff..1f28a87ab 100644 --- a/app/src/components/walkthrough/__tests__/AppWalkthrough.test.tsx +++ b/app/src/components/walkthrough/__tests__/AppWalkthrough.test.tsx @@ -9,7 +9,7 @@ * - AppWalkthrough does not render when already completed * - AppWalkthrough restarts when walkthrough:restart event fires * - Completing/skipping the tour calls markWalkthroughComplete (localStorage set) - * - createWalkthroughSteps: 9 steps, cross-page steps have before functions + * - createWalkthroughSteps: current targets, cross-page steps have before functions * - waitForTarget: resolves when element added, rejects on timeout * - WalkthroughTooltip renders step title, content, and navigation buttons */ @@ -519,10 +519,10 @@ describe('WalkthroughTooltip', () => { // ── createWalkthroughSteps tests ────────────────────────────────────────── describe('createWalkthroughSteps', () => { - it('returns 10 steps', () => { + it('returns 13 steps', () => { const navigate = vi.fn(); const steps = createWalkthroughSteps(navigate); - expect(steps).toHaveLength(10); + expect(steps).toHaveLength(13); }); it('first step targets home-card', () => { @@ -551,19 +551,18 @@ describe('createWalkthroughSteps', () => { const navigate = vi.fn(); const steps = createWalkthroughSteps(navigate); - // Steps: 2=chat, 3=integrations, 4=channels, 5=activity, 6=settings, 7=home-return, 9=chat-welcome - const crossPageIndices = [2, 3, 4, 5, 6, 7, 9]; + // Steps: 2=chat, 3=integrations, 4=channels, 5=settings, 6=chat-tab, 12=chat-welcome + const crossPageIndices = [2, 3, 4, 5, 6, 12]; for (const idx of crossPageIndices) { expect(typeof steps[idx].before, `step[${idx}] should have a before fn`).toBe('function'); } }); - it('home-only steps do not have before functions', () => { + it('same-shell steps do not have before functions', () => { const navigate = vi.fn(); const steps = createWalkthroughSteps(navigate); - // Steps: 0=home-card, 1=home-cta, 8=tab-notifications (step 9 now has a before hook) - const homeOnlyIndices = [0, 1, 8]; + const homeOnlyIndices = [0, 1, 7, 8, 9, 10, 11]; for (const idx of homeOnlyIndices) { expect(steps[idx].before, `step[${idx}] should not have a before fn`).toBeUndefined(); } @@ -573,10 +572,9 @@ describe('createWalkthroughSteps', () => { { idx: 2, route: '/chat', target: 'chat-agent-panel' }, { idx: 3, route: '/connections', target: 'skills-grid' }, { idx: 4, route: null, target: 'skills-channels' }, - { idx: 5, route: '/activity', target: 'intelligence-header' }, - { idx: 6, route: '/settings', target: 'settings-menu' }, - { idx: 7, route: '/home', target: 'tab-chat' }, - { idx: 9, route: '/chat', target: 'chat-agent-panel' }, + { idx: 5, route: '/settings', target: 'settings-menu' }, + { idx: 6, route: '/chat', target: 'tab-chat' }, + { idx: 12, route: '/chat', target: 'chat-agent-panel' }, ])('before hook for step $idx calls navigate("$route")', async ({ idx, route, target }) => { const navigate = vi.fn(); @@ -595,6 +593,30 @@ describe('createWalkthroughSteps', () => { } }); + it('targets only current walkthrough anchors', () => { + const navigate = vi.fn(); + const steps = createWalkthroughSteps(navigate); + const targets = steps.map(step => step.target); + + expect(targets).toEqual([ + '[data-walkthrough="home-card"]', + '[data-walkthrough="home-cta"]', + '[data-walkthrough="chat-agent-panel"]', + '[data-walkthrough="skills-grid"]', + '[data-walkthrough="skills-channels"]', + '[data-walkthrough="settings-menu"]', + '[data-walkthrough="tab-chat"]', + '[data-walkthrough="tab-human"]', + '[data-walkthrough="tab-brain"]', + '[data-walkthrough="tab-agent-world"]', + '[data-walkthrough="tab-connections"]', + '[data-walkthrough="tab-feedback"]', + '[data-walkthrough="chat-agent-panel"]', + ]); + expect(targets).not.toContain('[data-walkthrough="tab-activity"]'); + expect(targets).not.toContain('[data-walkthrough="intelligence-header"]'); + }); + it('final step before hook creates thread and seeds welcome message', async () => { const { store } = await import('../../../store'); const { createNewThread, addMessageLocal, setSelectedThread } = diff --git a/app/src/components/walkthrough/walkthroughSteps.ts b/app/src/components/walkthrough/walkthroughSteps.ts index 405cdd3f2..3aeb40453 100644 --- a/app/src/components/walkthrough/walkthroughSteps.ts +++ b/app/src/components/walkthrough/walkthroughSteps.ts @@ -6,6 +6,8 @@ import { store } from '../../store'; import { addMessageLocal, createNewThread, setSelectedThread } from '../../store/threadSlice'; import type { ThreadMessage } from '../../types/thread'; +type Translator = (key: string, fallback?: string) => string; + /** * Polls via setTimeout until `[data-walkthrough=""]` appears in the * DOM, then resolves. Rejects after `timeout` ms (default 3000). @@ -43,7 +45,7 @@ export function waitForTarget(selector: string, timeout = 3000): Promise { } /** - * Factory that produces the 10-step walkthrough sequence. + * Factory that produces the post-onboarding walkthrough sequence. * * Steps that navigate to a different page receive a `before` async hook that * calls `navigate(path)` and then waits for the target element to appear in @@ -52,23 +54,25 @@ export function waitForTarget(selector: string, timeout = 3000): Promise { * All targets follow the `[data-walkthrough=""]` convention — add the * attribute to the corresponding DOM element in the page/component. */ -export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { +export function createWalkthroughSteps( + navigate: NavigateFunction, + t: Translator = (_key, fallback) => fallback ?? _key +): Step[] { return [ - // ── Step 1 — /home ──────────────────────────────────────────────────── + // ── Step 1 — /chat empty state ──────────────────────────────────────── { target: '[data-walkthrough="home-card"]', - title: 'Your command center', - content: - "This is your home base — a quick snapshot of what's happening and what needs your attention.", + title: t('walkthrough.steps.startChat.title'), + content: t('walkthrough.steps.startChat.content'), placement: 'bottom', skipBeacon: true, }, - // ── Step 2 — /home ──────────────────────────────────────────────────── + // ── Step 2 — /chat empty state ──────────────────────────────────────── { target: '[data-walkthrough="home-cta"]', - title: 'Say hello', - content: 'Tap here to start a conversation with your AI assistant anytime.', + title: t('walkthrough.steps.sayHello.title'), + content: t('walkthrough.steps.sayHello.content'), placement: 'bottom', skipBeacon: true, }, @@ -76,9 +80,8 @@ export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { // ── Step 3 — /chat ──────────────────────────────────────────────────── { target: '[data-walkthrough="chat-agent-panel"]', - title: 'Meet your AI', - content: - 'This is where conversations happen. Ask questions, get summaries, or brainstorm. Everything stays searchable.', + title: t('walkthrough.steps.meetAi.title'), + content: t('walkthrough.steps.meetAi.content'), placement: 'bottom', skipBeacon: true, before: async () => { @@ -87,12 +90,11 @@ export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { }, }, - // ── Step 4 — /connections (Apps tab) ───────────────────────────────── + // ── Step 4 — /connections (Apps tab) ────────────────────────────────── { target: '[data-walkthrough="skills-grid"]', - title: 'Connect your world', - content: - 'Gmail, Slack, WhatsApp, and more — each connection gives your assistant superpowers.', + title: t('walkthrough.steps.connectWorld.title'), + content: t('walkthrough.steps.connectWorld.content'), placement: 'top', skipBeacon: true, before: async () => { @@ -104,9 +106,8 @@ export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { // ── Step 5 — /connections (Messaging tab) ──────────────────────────── { target: '[data-walkthrough="skills-channels"]', - title: 'Chat where you already are', - content: - 'WhatsApp, Telegram, Slack, Discord — connect your messaging apps so your assistant can reach you anywhere.', + title: t('walkthrough.steps.messagingApps.title'), + content: t('walkthrough.steps.messagingApps.content'), placement: 'bottom', skipBeacon: true, before: async () => { @@ -114,26 +115,11 @@ export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { }, }, - // ── Step 6 — /activity (Activity) ──────────────────────────────────── - { - target: '[data-walkthrough="intelligence-header"]', - title: 'Your activity hub', - content: - 'This is where your assistant learns and remembers. It gets smarter the more you use it.', - placement: 'bottom', - skipBeacon: true, - before: async () => { - navigate('/activity'); - await waitForTarget('intelligence-header'); - }, - }, - // ── Step 6 — /settings ──────────────────────────────────────────────── { target: '[data-walkthrough="settings-menu"]', - title: 'Make it yours', - content: - 'Preferences, privacy, notifications — everything is here. You can restart this tour anytime from this page.', + title: t('walkthrough.steps.settings.title'), + content: t('walkthrough.steps.settings.content'), placement: 'top', skipBeacon: true, before: async () => { @@ -142,34 +128,69 @@ export function createWalkthroughSteps(navigate: NavigateFunction): Step[] { }, }, - // ── Step 7 — /home ──────────────────────────────────────────────────── + // ── Step 7 — primary nav: Chat ──────────────────────────────────────── { target: '[data-walkthrough="tab-chat"]', - title: 'Quick access', - content: 'These tabs are your shortcuts — always one tap away.', + title: t('walkthrough.steps.chatTab.title'), + content: t('walkthrough.steps.chatTab.content'), placement: 'top', skipBeacon: true, before: async () => { - navigate('/home'); + navigate('/chat'); await waitForTarget('tab-chat'); }, }, - // ── Step 8 — /home (already there) ─────────────────────────────────── + // ── Step 8 — primary nav: Human ─────────────────────────────────────── { - target: '[data-walkthrough="tab-activity"]', - title: 'Stay in the loop', - content: 'Alerts and automations live here — briefings, notifications, background activity.', + target: '[data-walkthrough="tab-human"]', + title: t('walkthrough.steps.humanTab.title'), + content: t('walkthrough.steps.humanTab.content'), placement: 'top', skipBeacon: true, }, - // ── Step 9 — /chat (pre-seeded welcome message) ─────────────────────── + // ── Step 9 — primary nav: Brain ─────────────────────────────────────── + { + target: '[data-walkthrough="tab-brain"]', + title: t('walkthrough.steps.brainTab.title'), + content: t('walkthrough.steps.brainTab.content'), + placement: 'top', + skipBeacon: true, + }, + + // ── Step 10 — primary nav: Agent World ──────────────────────────────── + { + target: '[data-walkthrough="tab-agent-world"]', + title: t('walkthrough.steps.agentWorldTab.title'), + content: t('walkthrough.steps.agentWorldTab.content'), + placement: 'top', + skipBeacon: true, + }, + + // ── Step 11 — primary nav: Connections ──────────────────────────────── + { + target: '[data-walkthrough="tab-connections"]', + title: t('walkthrough.steps.connectionsTab.title'), + content: t('walkthrough.steps.connectionsTab.content'), + placement: 'top', + skipBeacon: true, + }, + + // ── Step 12 — primary nav: Feedback ─────────────────────────────────── + { + target: '[data-walkthrough="tab-feedback"]', + title: t('walkthrough.steps.feedbackTab.title'), + content: t('walkthrough.steps.feedbackTab.content'), + placement: 'top', + skipBeacon: true, + }, + + // ── Step 13 — /chat (pre-seeded welcome message) ────────────────────── { target: '[data-walkthrough="chat-agent-panel"]', - title: "You're all set!", - content: - 'Your assistant left you a welcome note — this is your space to chat, ask questions, or brainstorm. Have fun!', + title: t('walkthrough.steps.allSet.title'), + content: t('walkthrough.steps.allSet.content'), placement: 'bottom', skipBeacon: true, before: async () => { diff --git a/app/src/lib/i18n/ar.ts b/app/src/lib/i18n/ar.ts index 8a2f7c8a7..c96592bde 100644 --- a/app/src/lib/i18n/ar.ts +++ b/app/src/lib/i18n/ar.ts @@ -4917,6 +4917,42 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'يُعاد التعيين {time}.', 'upsell.usageLimit.upgradePlan': 'ترقية الخطة', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'ابدأ من الدردشة', + 'walkthrough.steps.startChat.content': + 'الدردشة هي نقطة البداية. تفتح النوافذ الجديدة بالترحيب نفسه والإجراءات السريعة التي رأيتها بعد الإعداد.', + 'walkthrough.steps.sayHello.title': 'قل مرحباً', + 'walkthrough.steps.sayHello.content': 'اضغط هنا لبدء محادثة مع مساعد الذكاء الاصطناعي في أي وقت.', + 'walkthrough.steps.meetAi.title': 'تعرّف إلى الذكاء الاصطناعي', + 'walkthrough.steps.meetAi.content': + 'هنا تجري المحادثات. اطرح الأسئلة، واحصل على الملخصات، أو طوّر الأفكار. يبقى كل شيء قابلاً للبحث.', + 'walkthrough.steps.connectWorld.title': 'صِل عالمك', + 'walkthrough.steps.connectWorld.content': + 'Gmail وSlack وWhatsApp والمزيد: كل اتصال يمنح مساعدك قدرات جديدة.', + 'walkthrough.steps.messagingApps.title': 'تحدث حيث أنت بالفعل', + 'walkthrough.steps.messagingApps.content': + 'اربط WhatsApp وTelegram وSlack وDiscord حتى يتمكن مساعدك من الوصول إليك في أي مكان.', + 'walkthrough.steps.settings.title': 'اجعله مناسباً لك', + 'walkthrough.steps.settings.content': + 'التفضيلات والخصوصية والإشعارات كلها هنا. يمكنك إعادة تشغيل هذه الجولة من هذه الصفحة في أي وقت.', + 'walkthrough.steps.chatTab.title': 'ارجع إلى الدردشة', + 'walkthrough.steps.chatTab.content': 'استخدم تبويب Chat عندما تريد الرجوع إلى محادثاتك.', + 'walkthrough.steps.humanTab.title': 'تعرّف إلى ملف Human', + 'walkthrough.steps.humanTab.content': 'يجمع Human سياقك الشخصي وهويتك والملف الذي يراه المساعد.', + 'walkthrough.steps.brainTab.title': 'افتح Brain', + 'walkthrough.steps.brainTab.content': + 'Brain هو مخطط الذاكرة: المكان الذي تفحص فيه ما يعرفه OpenHuman وكيف ترتبط الأفكار.', + 'walkthrough.steps.agentWorldTab.title': 'استكشف Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World هو مكان الوكلاء القابلين لإعادة الاستخدام والأتمتة المشتركة.', + 'walkthrough.steps.connectionsTab.title': 'إدارة الاتصالات', + 'walkthrough.steps.connectionsTab.content': + 'Connections متاح دائماً في التنقل الرئيسي عندما تريد إضافة الخدمات أو تعديلها.', + 'walkthrough.steps.feedbackTab.title': 'إرسال ملاحظات', + 'walkthrough.steps.feedbackTab.content': + 'يوفر Feedback مكاناً مباشراً للإبلاغ عن المشاكل أو طلب التحسينات.', + 'walkthrough.steps.allSet.title': 'كل شيء جاهز!', + 'walkthrough.steps.allSet.content': + 'ترك لك المساعد رسالة ترحيب: هذه مساحتك للدردشة وطرح الأسئلة وتطوير الأفكار. استمتع!', 'walkthrough.tooltip.letsGo': 'هيا بنا!', 'walkthrough.tooltip.next': 'التالي →', 'walkthrough.tooltip.skip': 'تخطّي الجولة', diff --git a/app/src/lib/i18n/bn.ts b/app/src/lib/i18n/bn.ts index 7e2b2465e..b87d27496 100644 --- a/app/src/lib/i18n/bn.ts +++ b/app/src/lib/i18n/bn.ts @@ -5014,6 +5014,44 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'এটি {time} রিসেট হবে।', 'upsell.usageLimit.upgradePlan': 'প্ল্যান আপগ্রেড করুন', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'চ্যাট থেকে শুরু করুন', + 'walkthrough.steps.startChat.content': + 'চ্যাটই আপনার শুরু করার জায়গা। নতুন উইন্ডো সেটআপের পর দেখা একই শুভেচ্ছা ও দ্রুত কাজ নিয়ে খুলবে।', + 'walkthrough.steps.sayHello.title': 'শুভেচ্ছা জানান', + 'walkthrough.steps.sayHello.content': + 'যেকোনো সময় আপনার AI সহকারীর সঙ্গে কথা শুরু করতে এখানে চাপুন।', + 'walkthrough.steps.meetAi.title': 'আপনার AI-কে জানুন', + 'walkthrough.steps.meetAi.content': + 'কথোপকথন এখানেই হয়। প্রশ্ন করুন, সারাংশ নিন বা ভাবনা গুছান। সবকিছু খুঁজে পাওয়া যায়।', + 'walkthrough.steps.connectWorld.title': 'আপনার জগৎ যুক্ত করুন', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp এবং আরও অনেক কিছু: প্রতিটি সংযোগ আপনার সহকারীকে নতুন ক্ষমতা দেয়।', + 'walkthrough.steps.messagingApps.title': 'যেখানে আছেন সেখানেই চ্যাট করুন', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord যুক্ত করুন, যাতে সহকারী আপনাকে যেকোনো জায়গায় পৌঁছাতে পারে।', + 'walkthrough.steps.settings.title': 'নিজের মতো সাজান', + 'walkthrough.steps.settings.content': + 'পছন্দ, গোপনীয়তা ও নোটিফিকেশন এখানে আছে। এই পেজ থেকে যেকোনো সময় ট্যুরটি আবার শুরু করতে পারেন।', + 'walkthrough.steps.chatTab.title': 'চ্যাটে ফিরে যান', + 'walkthrough.steps.chatTab.content': 'কথোপকথনে ফিরতে চাইলে Chat ট্যাব ব্যবহার করুন।', + 'walkthrough.steps.humanTab.title': 'আপনার Human প্রোফাইল দেখুন', + 'walkthrough.steps.humanTab.content': + 'Human আপনার ব্যক্তিগত প্রসঙ্গ, পরিচয় এবং সহকারীর দেখা প্রোফাইল একত্র করে।', + 'walkthrough.steps.brainTab.title': 'আপনার Brain খুলুন', + 'walkthrough.steps.brainTab.content': + 'Brain হলো মেমোরি গ্রাফ: OpenHuman কী জানে এবং ধারণাগুলো কীভাবে যুক্ত তা দেখার জায়গা।', + 'walkthrough.steps.agentWorldTab.title': 'Agent World ঘুরে দেখুন', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World-এ পুনরায় ব্যবহারযোগ্য এজেন্ট ও শেয়ার করা অটোমেশন থাকে।', + 'walkthrough.steps.connectionsTab.title': 'সংযোগ পরিচালনা করুন', + 'walkthrough.steps.connectionsTab.content': + 'সেবা যোগ বা বদলাতে চাইলে Connections সবসময় প্রধান নেভিগেশনে থাকে।', + 'walkthrough.steps.feedbackTab.title': 'মতামত পাঠান', + 'walkthrough.steps.feedbackTab.content': + 'Feedback সমস্যা জানানো বা উন্নতির অনুরোধ করার সরাসরি জায়গা।', + 'walkthrough.steps.allSet.title': 'সব প্রস্তুত!', + 'walkthrough.steps.allSet.content': + 'আপনার সহকারী একটি স্বাগত নোট রেখে গেছে: এখানে আপনি চ্যাট করতে, প্রশ্ন করতে বা ধারণা গুছাতে পারেন। উপভোগ করুন!', 'walkthrough.tooltip.letsGo': 'চলুন শুরু করি!', 'walkthrough.tooltip.next': 'পরবর্তী →', 'walkthrough.tooltip.skip': 'ট্যুর এড়িয়ে যান', diff --git a/app/src/lib/i18n/de.ts b/app/src/lib/i18n/de.ts index 85e6da7dd..c7934a87c 100644 --- a/app/src/lib/i18n/de.ts +++ b/app/src/lib/i18n/de.ts @@ -5145,6 +5145,45 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Es setzt {time} zurück.', 'upsell.usageLimit.upgradePlan': 'Upgrade-Plan', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Im Chat starten', + 'walkthrough.steps.startChat.content': + 'Der Chat ist dein Startpunkt. Neue Fenster öffnen mit derselben Begrüßung und den Schnellaktionen aus der Einrichtung.', + 'walkthrough.steps.sayHello.title': 'Sag Hallo', + 'walkthrough.steps.sayHello.content': + 'Tippe hier, um jederzeit ein Gespräch mit deinem KI-Assistenten zu starten.', + 'walkthrough.steps.meetAi.title': 'Lerne deine KI kennen', + 'walkthrough.steps.meetAi.content': + 'Hier finden Unterhaltungen statt. Stelle Fragen, lass dir Zusammenfassungen geben oder sammle Ideen. Alles bleibt durchsuchbar.', + 'walkthrough.steps.connectWorld.title': 'Verbinde deine Welt', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp und mehr: Jede Verbindung gibt deinem Assistenten neue Fähigkeiten.', + 'walkthrough.steps.messagingApps.title': 'Chatte dort, wo du schon bist', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: Verbinde deine Messenger, damit dein Assistent dich überall erreichen kann.', + 'walkthrough.steps.settings.title': 'Passe alles an', + 'walkthrough.steps.settings.content': + 'Einstellungen, Datenschutz und Benachrichtigungen sind hier. Du kannst diese Tour jederzeit von dieser Seite neu starten.', + 'walkthrough.steps.chatTab.title': 'Zurück zum Chat', + 'walkthrough.steps.chatTab.content': + 'Nutze den Chat-Tab, wenn du zu deinen Unterhaltungen zurückkehren möchtest.', + 'walkthrough.steps.humanTab.title': 'Dein Human-Profil', + 'walkthrough.steps.humanTab.content': + 'Human bündelt deinen persönlichen Kontext, deine Identität und dein Assistentenprofil.', + 'walkthrough.steps.brainTab.title': 'Öffne dein Brain', + 'walkthrough.steps.brainTab.content': + 'Brain ist der Wissensgraph: Hier prüfst du, was OpenHuman weiß und wie Ideen verbunden sind.', + 'walkthrough.steps.agentWorldTab.title': 'Agent World erkunden', + 'walkthrough.steps.agentWorldTab.content': + 'In Agent World findest du wiederverwendbare Agenten und gemeinsame Automatisierungen.', + 'walkthrough.steps.connectionsTab.title': 'Verbindungen verwalten', + 'walkthrough.steps.connectionsTab.content': + 'Connections ist immer in der Hauptnavigation verfügbar, wenn du Dienste hinzufügen oder anpassen möchtest.', + 'walkthrough.steps.feedbackTab.title': 'Feedback senden', + 'walkthrough.steps.feedbackTab.content': + 'Feedback ist der direkte Ort, um Probleme zu melden oder Verbesserungen vorzuschlagen.', + 'walkthrough.steps.allSet.title': 'Alles bereit!', + 'walkthrough.steps.allSet.content': + 'Dein Assistent hat dir eine Willkommensnotiz hinterlassen: Hier kannst du chatten, fragen oder Ideen sammeln. Viel Spaß!', 'walkthrough.tooltip.letsGo': 'Lass uns gehen!', 'walkthrough.tooltip.next': 'Weiter →', 'walkthrough.tooltip.skip': 'Tour überspringen', diff --git a/app/src/lib/i18n/en.ts b/app/src/lib/i18n/en.ts index efd1d32f7..ee88877a1 100644 --- a/app/src/lib/i18n/en.ts +++ b/app/src/lib/i18n/en.ts @@ -5627,6 +5627,45 @@ const en: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Resets in {time}', 'upsell.usageLimit.upgradePlan': 'Upgrade plan', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Start in chat', + 'walkthrough.steps.startChat.content': + 'Chat is your starting point. New windows open with the same greeting and quick actions you saw after setup.', + 'walkthrough.steps.sayHello.title': 'Say hello', + 'walkthrough.steps.sayHello.content': + 'Tap here to start a conversation with your AI assistant anytime.', + 'walkthrough.steps.meetAi.title': 'Meet your AI', + 'walkthrough.steps.meetAi.content': + 'This is where conversations happen. Ask questions, get summaries, or brainstorm. Everything stays searchable.', + 'walkthrough.steps.connectWorld.title': 'Connect your world', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp, and more - each connection gives your assistant superpowers.', + 'walkthrough.steps.messagingApps.title': 'Chat where you already are', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord - connect your messaging apps so your assistant can reach you anywhere.', + 'walkthrough.steps.settings.title': 'Make it yours', + 'walkthrough.steps.settings.content': + 'Preferences, privacy, notifications - everything is here. You can restart this tour anytime from this page.', + 'walkthrough.steps.chatTab.title': 'Jump back to chat', + 'walkthrough.steps.chatTab.content': + 'Use the Chat tab whenever you want to return to conversations.', + 'walkthrough.steps.humanTab.title': 'Meet your human profile', + 'walkthrough.steps.humanTab.content': + 'Human is where your personal context, identity, and assistant-facing profile come together.', + 'walkthrough.steps.brainTab.title': 'Open your Brain', + 'walkthrough.steps.brainTab.content': + 'Brain is the memory graph: the place to inspect what OpenHuman knows and how ideas connect.', + 'walkthrough.steps.agentWorldTab.title': 'Explore Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World is where reusable agents and shared automations live.', + 'walkthrough.steps.connectionsTab.title': 'Manage connections', + 'walkthrough.steps.connectionsTab.content': + 'Connections is always available from the main nav when you want to add or adjust services.', + 'walkthrough.steps.feedbackTab.title': 'Send feedback', + 'walkthrough.steps.feedbackTab.content': + 'Feedback gives you a direct place to report rough edges or ask for improvements.', + 'walkthrough.steps.allSet.title': "You're all set!", + 'walkthrough.steps.allSet.content': + 'Your assistant left you a welcome note - this is your space to chat, ask questions, or brainstorm. Have fun!', 'walkthrough.tooltip.letsGo': "Let's go!", 'walkthrough.tooltip.next': 'Next →', 'walkthrough.tooltip.skip': 'Skip tour', diff --git a/app/src/lib/i18n/es.ts b/app/src/lib/i18n/es.ts index a45f51cc9..b0b5eeb83 100644 --- a/app/src/lib/i18n/es.ts +++ b/app/src/lib/i18n/es.ts @@ -5107,6 +5107,45 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Se restablece {time}.', 'upsell.usageLimit.upgradePlan': 'Mejorar plan', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Empieza en el chat', + 'walkthrough.steps.startChat.content': + 'El chat es tu punto de partida. Las ventanas nuevas se abren con el mismo saludo y las acciones rápidas que viste después de la configuración.', + 'walkthrough.steps.sayHello.title': 'Saluda', + 'walkthrough.steps.sayHello.content': + 'Toca aquí para iniciar una conversación con tu asistente de IA cuando quieras.', + 'walkthrough.steps.meetAi.title': 'Conoce tu IA', + 'walkthrough.steps.meetAi.content': + 'Aquí ocurren las conversaciones. Haz preguntas, pide resúmenes o explora ideas. Todo queda disponible para buscar.', + 'walkthrough.steps.connectWorld.title': 'Conecta tu mundo', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp y más: cada conexión le da más capacidades a tu asistente.', + 'walkthrough.steps.messagingApps.title': 'Chatea donde ya estás', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: conecta tus apps de mensajes para que tu asistente pueda encontrarte en cualquier lugar.', + 'walkthrough.steps.settings.title': 'Hazlo tuyo', + 'walkthrough.steps.settings.content': + 'Preferencias, privacidad y notificaciones están aquí. Puedes reiniciar este recorrido desde esta página cuando quieras.', + 'walkthrough.steps.chatTab.title': 'Vuelve al chat', + 'walkthrough.steps.chatTab.content': + 'Usa la pestaña Chat cuando quieras volver a tus conversaciones.', + 'walkthrough.steps.humanTab.title': 'Conoce tu perfil humano', + 'walkthrough.steps.humanTab.content': + 'Human reúne tu contexto personal, identidad y perfil visible para el asistente.', + 'walkthrough.steps.brainTab.title': 'Abre tu Brain', + 'walkthrough.steps.brainTab.content': + 'Brain es el grafo de memoria: el lugar para revisar qué sabe OpenHuman y cómo se conectan las ideas.', + 'walkthrough.steps.agentWorldTab.title': 'Explora Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World es donde viven agentes reutilizables y automatizaciones compartidas.', + 'walkthrough.steps.connectionsTab.title': 'Gestiona conexiones', + 'walkthrough.steps.connectionsTab.content': + 'Connections siempre está disponible en la navegación principal para agregar o ajustar servicios.', + 'walkthrough.steps.feedbackTab.title': 'Enviar comentarios', + 'walkthrough.steps.feedbackTab.content': + 'Feedback te da un lugar directo para reportar problemas o pedir mejoras.', + 'walkthrough.steps.allSet.title': '¡Todo listo!', + 'walkthrough.steps.allSet.content': + 'Tu asistente te dejó una nota de bienvenida: este es tu espacio para chatear, preguntar o explorar ideas. ¡Diviértete!', 'walkthrough.tooltip.letsGo': '¡Vamos!', 'walkthrough.tooltip.next': 'Siguiente →', 'walkthrough.tooltip.skip': 'Omitir tour', diff --git a/app/src/lib/i18n/fr.ts b/app/src/lib/i18n/fr.ts index a7b44072b..a1b7f08f1 100644 --- a/app/src/lib/i18n/fr.ts +++ b/app/src/lib/i18n/fr.ts @@ -5127,6 +5127,45 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Réinitialisation {time}.', 'upsell.usageLimit.upgradePlan': 'Mettre à niveau le plan', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Commencez dans le chat', + 'walkthrough.steps.startChat.content': + 'Le chat est votre point de départ. Les nouvelles fenêtres s’ouvrent avec le même accueil et les actions rapides vues pendant la configuration.', + 'walkthrough.steps.sayHello.title': 'Dites bonjour', + 'walkthrough.steps.sayHello.content': + 'Appuyez ici pour lancer une conversation avec votre assistant IA à tout moment.', + 'walkthrough.steps.meetAi.title': 'Rencontrez votre IA', + 'walkthrough.steps.meetAi.content': + 'C’est ici que les conversations ont lieu. Posez des questions, demandez des résumés ou explorez des idées. Tout reste consultable.', + 'walkthrough.steps.connectWorld.title': 'Connectez votre monde', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp et plus encore : chaque connexion donne de nouveaux pouvoirs à votre assistant.', + 'walkthrough.steps.messagingApps.title': 'Discutez là où vous êtes déjà', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord : connectez vos messageries pour que votre assistant puisse vous joindre partout.', + 'walkthrough.steps.settings.title': 'Personnalisez-le', + 'walkthrough.steps.settings.content': + 'Préférences, confidentialité et notifications sont ici. Vous pouvez relancer cette visite depuis cette page à tout moment.', + 'walkthrough.steps.chatTab.title': 'Retour au chat', + 'walkthrough.steps.chatTab.content': + 'Utilisez l’onglet Chat dès que vous voulez revenir à vos conversations.', + 'walkthrough.steps.humanTab.title': 'Votre profil humain', + 'walkthrough.steps.humanTab.content': + 'Human réunit votre contexte personnel, votre identité et le profil visible par l’assistant.', + 'walkthrough.steps.brainTab.title': 'Ouvrez votre Brain', + 'walkthrough.steps.brainTab.content': + 'Brain est le graphe de mémoire : l’endroit où vérifier ce qu’OpenHuman sait et comment les idées se relient.', + 'walkthrough.steps.agentWorldTab.title': 'Explorez Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World regroupe les agents réutilisables et les automatisations partagées.', + 'walkthrough.steps.connectionsTab.title': 'Gérer les connexions', + 'walkthrough.steps.connectionsTab.content': + 'Connections reste disponible dans la navigation principale pour ajouter ou ajuster des services.', + 'walkthrough.steps.feedbackTab.title': 'Envoyer un retour', + 'walkthrough.steps.feedbackTab.content': + 'Feedback vous donne un lieu direct pour signaler les problèmes ou demander des améliorations.', + 'walkthrough.steps.allSet.title': 'Tout est prêt !', + 'walkthrough.steps.allSet.content': + 'Votre assistant vous a laissé une note de bienvenue : cet espace sert à discuter, poser des questions ou explorer des idées. Amusez-vous bien !', 'walkthrough.tooltip.letsGo': "C'est parti !", 'walkthrough.tooltip.next': 'Suivant →', 'walkthrough.tooltip.skip': 'Passer la visite', diff --git a/app/src/lib/i18n/hi.ts b/app/src/lib/i18n/hi.ts index a3035b1df..e61e84084 100644 --- a/app/src/lib/i18n/hi.ts +++ b/app/src/lib/i18n/hi.ts @@ -5017,6 +5017,44 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'यह {time} रीसेट होती है।', 'upsell.usageLimit.upgradePlan': 'प्लान अपग्रेड करें', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'चैट से शुरू करें', + 'walkthrough.steps.startChat.content': + 'चैट आपका शुरुआती स्थान है। नई विंडो उसी स्वागत संदेश और तेज़ कार्रवाइयों के साथ खुलती हैं जो आपने सेटअप के बाद देखीं।', + 'walkthrough.steps.sayHello.title': 'नमस्ते कहें', + 'walkthrough.steps.sayHello.content': + 'कभी भी अपने AI सहायक से बातचीत शुरू करने के लिए यहां टैप करें।', + 'walkthrough.steps.meetAi.title': 'अपने AI से मिलें', + 'walkthrough.steps.meetAi.content': + 'बातचीत यहीं होती है। सवाल पूछें, सारांश लें या विचार करें। सब कुछ खोजने योग्य रहता है।', + 'walkthrough.steps.connectWorld.title': 'अपनी दुनिया जोड़ें', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp और बहुत कुछ: हर कनेक्शन आपके सहायक को नई क्षमताएं देता है।', + 'walkthrough.steps.messagingApps.title': 'जहां आप पहले से हैं वहीं चैट करें', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord जोड़ें ताकि आपका सहायक आपको कहीं भी पहुंच सके।', + 'walkthrough.steps.settings.title': 'इसे अपना बनाएं', + 'walkthrough.steps.settings.content': + 'पसंद, गोपनीयता और सूचनाएं यहां हैं। आप इस पेज से यह टूर कभी भी फिर शुरू कर सकते हैं।', + 'walkthrough.steps.chatTab.title': 'चैट पर वापस जाएं', + 'walkthrough.steps.chatTab.content': 'जब भी बातचीत पर लौटना हो, Chat टैब का उपयोग करें।', + 'walkthrough.steps.humanTab.title': 'अपनी Human प्रोफ़ाइल देखें', + 'walkthrough.steps.humanTab.content': + 'Human आपका निजी संदर्भ, पहचान और सहायक को दिखने वाली प्रोफ़ाइल एक साथ रखता है।', + 'walkthrough.steps.brainTab.title': 'अपना Brain खोलें', + 'walkthrough.steps.brainTab.content': + 'Brain मेमोरी ग्राफ है: यहां देखें कि OpenHuman क्या जानता है और विचार कैसे जुड़े हैं।', + 'walkthrough.steps.agentWorldTab.title': 'Agent World देखें', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World में पुन: उपयोग योग्य एजेंट और साझा ऑटोमेशन रहते हैं।', + 'walkthrough.steps.connectionsTab.title': 'कनेक्शन प्रबंधित करें', + 'walkthrough.steps.connectionsTab.content': + 'सेवाएं जोड़ने या बदलने के लिए Connections हमेशा मुख्य नेविगेशन में उपलब्ध है।', + 'walkthrough.steps.feedbackTab.title': 'फ़ीडबैक भेजें', + 'walkthrough.steps.feedbackTab.content': + 'Feedback समस्याएं बताने या सुधार मांगने की सीधी जगह है।', + 'walkthrough.steps.allSet.title': 'सब तैयार है!', + 'walkthrough.steps.allSet.content': + 'आपके सहायक ने स्वागत नोट छोड़ा है: यहां आप चैट कर सकते हैं, सवाल पूछ सकते हैं या विचार कर सकते हैं। आनंद लें!', 'walkthrough.tooltip.letsGo': 'चलिए शुरू करें!', 'walkthrough.tooltip.next': 'अगला →', 'walkthrough.tooltip.skip': 'टूर छोड़ें', diff --git a/app/src/lib/i18n/id.ts b/app/src/lib/i18n/id.ts index 9a9c4a2b8..db08f415a 100644 --- a/app/src/lib/i18n/id.ts +++ b/app/src/lib/i18n/id.ts @@ -5029,6 +5029,45 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Akan direset {time}.', 'upsell.usageLimit.upgradePlan': 'Upgrade paket', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Mulai di chat', + 'walkthrough.steps.startChat.content': + 'Chat adalah titik awal Anda. Jendela baru terbuka dengan sapaan dan tindakan cepat yang sama seperti setelah penyiapan.', + 'walkthrough.steps.sayHello.title': 'Sapa dulu', + 'walkthrough.steps.sayHello.content': + 'Ketuk di sini untuk memulai percakapan dengan asisten AI kapan saja.', + 'walkthrough.steps.meetAi.title': 'Kenali AI Anda', + 'walkthrough.steps.meetAi.content': + 'Di sinilah percakapan berlangsung. Ajukan pertanyaan, minta ringkasan, atau susun ide. Semuanya tetap bisa dicari.', + 'walkthrough.steps.connectWorld.title': 'Hubungkan dunia Anda', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp, dan lainnya: setiap koneksi memberi asisten Anda kemampuan baru.', + 'walkthrough.steps.messagingApps.title': 'Chat di tempat Anda biasa berada', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: hubungkan aplikasi pesan agar asisten dapat menjangkau Anda di mana saja.', + 'walkthrough.steps.settings.title': 'Sesuaikan sendiri', + 'walkthrough.steps.settings.content': + 'Preferensi, privasi, dan notifikasi ada di sini. Anda dapat memulai ulang tur ini dari halaman ini kapan saja.', + 'walkthrough.steps.chatTab.title': 'Kembali ke chat', + 'walkthrough.steps.chatTab.content': + 'Gunakan tab Chat kapan pun Anda ingin kembali ke percakapan.', + 'walkthrough.steps.humanTab.title': 'Kenali profil Human Anda', + 'walkthrough.steps.humanTab.content': + 'Human menyatukan konteks pribadi, identitas, dan profil yang dilihat asisten.', + 'walkthrough.steps.brainTab.title': 'Buka Brain Anda', + 'walkthrough.steps.brainTab.content': + 'Brain adalah grafik memori: tempat melihat apa yang diketahui OpenHuman dan bagaimana ide saling terhubung.', + 'walkthrough.steps.agentWorldTab.title': 'Jelajahi Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World adalah tempat agen yang dapat digunakan ulang dan automasi bersama.', + 'walkthrough.steps.connectionsTab.title': 'Kelola koneksi', + 'walkthrough.steps.connectionsTab.content': + 'Connections selalu tersedia di navigasi utama saat Anda ingin menambah atau menyesuaikan layanan.', + 'walkthrough.steps.feedbackTab.title': 'Kirim masukan', + 'walkthrough.steps.feedbackTab.content': + 'Feedback memberi tempat langsung untuk melaporkan masalah atau meminta peningkatan.', + 'walkthrough.steps.allSet.title': 'Semua siap!', + 'walkthrough.steps.allSet.content': + 'Asisten meninggalkan catatan sambutan: ini ruang Anda untuk chat, bertanya, atau menyusun ide. Selamat mencoba!', 'walkthrough.tooltip.letsGo': 'Ayo mulai!', 'walkthrough.tooltip.next': 'Berikutnya →', 'walkthrough.tooltip.skip': 'Lewati tur', diff --git a/app/src/lib/i18n/it.ts b/app/src/lib/i18n/it.ts index 75ba80ddf..5f03a07f7 100644 --- a/app/src/lib/i18n/it.ts +++ b/app/src/lib/i18n/it.ts @@ -5096,6 +5096,44 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Si resetta {time}.', 'upsell.usageLimit.upgradePlan': 'Aggiorna piano', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Inizia dalla chat', + 'walkthrough.steps.startChat.content': + 'La chat è il tuo punto di partenza. Le nuove finestre si aprono con lo stesso saluto e le azioni rapide viste durante la configurazione.', + 'walkthrough.steps.sayHello.title': 'Saluta', + 'walkthrough.steps.sayHello.content': + 'Tocca qui per avviare una conversazione con il tuo assistente IA in qualsiasi momento.', + 'walkthrough.steps.meetAi.title': 'Conosci la tua IA', + 'walkthrough.steps.meetAi.content': + 'Qui avvengono le conversazioni. Fai domande, ottieni riassunti o sviluppa idee. Tutto resta ricercabile.', + 'walkthrough.steps.connectWorld.title': 'Connetti il tuo mondo', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp e altro: ogni connessione dà nuovi poteri al tuo assistente.', + 'walkthrough.steps.messagingApps.title': 'Chatta dove sei già', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: collega le app di messaggistica così il tuo assistente può raggiungerti ovunque.', + 'walkthrough.steps.settings.title': 'Rendilo tuo', + 'walkthrough.steps.settings.content': + 'Preferenze, privacy e notifiche sono qui. Puoi riavviare questo tour da questa pagina in qualsiasi momento.', + 'walkthrough.steps.chatTab.title': 'Torna alla chat', + 'walkthrough.steps.chatTab.content': 'Usa la scheda Chat quando vuoi tornare alle conversazioni.', + 'walkthrough.steps.humanTab.title': 'Scopri il tuo profilo umano', + 'walkthrough.steps.humanTab.content': + 'Human riunisce contesto personale, identità e profilo visibile all’assistente.', + 'walkthrough.steps.brainTab.title': 'Apri il tuo Brain', + 'walkthrough.steps.brainTab.content': + 'Brain è il grafo della memoria: il posto dove vedere cosa sa OpenHuman e come si collegano le idee.', + 'walkthrough.steps.agentWorldTab.title': 'Esplora Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World ospita agenti riutilizzabili e automazioni condivise.', + 'walkthrough.steps.connectionsTab.title': 'Gestisci connessioni', + 'walkthrough.steps.connectionsTab.content': + 'Connections è sempre nella navigazione principale quando vuoi aggiungere o modificare servizi.', + 'walkthrough.steps.feedbackTab.title': 'Invia feedback', + 'walkthrough.steps.feedbackTab.content': + 'Feedback è il luogo diretto per segnalare problemi o chiedere miglioramenti.', + 'walkthrough.steps.allSet.title': 'Tutto pronto!', + 'walkthrough.steps.allSet.content': + 'Il tuo assistente ti ha lasciato una nota di benvenuto: qui puoi chattare, fare domande o sviluppare idee. Buon divertimento!', 'walkthrough.tooltip.letsGo': 'Andiamo!', 'walkthrough.tooltip.next': 'Avanti →', 'walkthrough.tooltip.skip': 'Salta tour', diff --git a/app/src/lib/i18n/ko.ts b/app/src/lib/i18n/ko.ts index 2a7e9af1d..2154ed647 100644 --- a/app/src/lib/i18n/ko.ts +++ b/app/src/lib/i18n/ko.ts @@ -4971,6 +4971,43 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': '{time}에 초기화됩니다.', 'upsell.usageLimit.upgradePlan': '플랜 업그레이드', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': '채팅에서 시작하기', + 'walkthrough.steps.startChat.content': + '채팅이 시작점입니다. 새 창은 설정 후 보았던 같은 인사와 빠른 작업으로 열립니다.', + 'walkthrough.steps.sayHello.title': '인사하기', + 'walkthrough.steps.sayHello.content': '언제든 여기를 눌러 AI 어시스턴트와 대화를 시작하세요.', + 'walkthrough.steps.meetAi.title': 'AI 만나기', + 'walkthrough.steps.meetAi.content': + '대화가 이루어지는 곳입니다. 질문하고, 요약을 받고, 아이디어를 정리하세요. 모든 내용은 검색할 수 있습니다.', + 'walkthrough.steps.connectWorld.title': '내 세계 연결하기', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp 등 각 연결은 어시스턴트에 더 많은 기능을 더합니다.', + 'walkthrough.steps.messagingApps.title': '이미 쓰는 곳에서 채팅하기', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord를 연결하면 어시스턴트가 어디서든 연락할 수 있습니다.', + 'walkthrough.steps.settings.title': '내 방식으로 설정하기', + 'walkthrough.steps.settings.content': + '환경설정, 개인정보, 알림이 모두 여기에 있습니다. 이 페이지에서 언제든 투어를 다시 시작할 수 있습니다.', + 'walkthrough.steps.chatTab.title': '채팅으로 돌아가기', + 'walkthrough.steps.chatTab.content': '대화로 돌아가고 싶을 때 Chat 탭을 사용하세요.', + 'walkthrough.steps.humanTab.title': 'Human 프로필 보기', + 'walkthrough.steps.humanTab.content': + 'Human은 개인 맥락, 정체성, 어시스턴트가 보는 프로필을 한곳에 모읍니다.', + 'walkthrough.steps.brainTab.title': 'Brain 열기', + 'walkthrough.steps.brainTab.content': + 'Brain은 메모리 그래프입니다. OpenHuman이 무엇을 알고 아이디어가 어떻게 연결되는지 확인하는 곳입니다.', + 'walkthrough.steps.agentWorldTab.title': 'Agent World 탐색', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World에는 재사용 가능한 에이전트와 공유 자동화가 있습니다.', + 'walkthrough.steps.connectionsTab.title': '연결 관리', + 'walkthrough.steps.connectionsTab.content': + '서비스를 추가하거나 조정하고 싶을 때 Connections는 항상 기본 내비게이션에 있습니다.', + 'walkthrough.steps.feedbackTab.title': '피드백 보내기', + 'walkthrough.steps.feedbackTab.content': + 'Feedback은 문제를 보고하거나 개선을 요청하는 직접적인 공간입니다.', + 'walkthrough.steps.allSet.title': '준비 완료!', + 'walkthrough.steps.allSet.content': + '어시스턴트가 환영 메모를 남겼습니다. 이곳에서 채팅하고, 질문하고, 아이디어를 정리해 보세요. 즐겁게 사용하세요!', 'walkthrough.tooltip.letsGo': '시작해 봅시다!', 'walkthrough.tooltip.next': '다음 →', 'walkthrough.tooltip.skip': '투어 건너뛰기', diff --git a/app/src/lib/i18n/pl.ts b/app/src/lib/i18n/pl.ts index e72c20880..a193bab68 100644 --- a/app/src/lib/i18n/pl.ts +++ b/app/src/lib/i18n/pl.ts @@ -5091,6 +5091,44 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Resetuje się {time}.', 'upsell.usageLimit.upgradePlan': 'Podnieś plan', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Zacznij na czacie', + 'walkthrough.steps.startChat.content': + 'Czat jest punktem startowym. Nowe okna otwierają się z tym samym powitaniem i szybkimi akcjami z konfiguracji.', + 'walkthrough.steps.sayHello.title': 'Przywitaj się', + 'walkthrough.steps.sayHello.content': + 'Kliknij tutaj, aby w dowolnym momencie rozpocząć rozmowę z asystentem AI.', + 'walkthrough.steps.meetAi.title': 'Poznaj swoją AI', + 'walkthrough.steps.meetAi.content': + 'Tutaj odbywają się rozmowy. Zadawaj pytania, proś o podsumowania lub rozwijaj pomysły. Wszystko pozostaje wyszukiwalne.', + 'walkthrough.steps.connectWorld.title': 'Połącz swój świat', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp i więcej: każde połączenie daje asystentowi nowe możliwości.', + 'walkthrough.steps.messagingApps.title': 'Czatuj tam, gdzie już jesteś', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: połącz komunikatory, aby asystent mógł dotrzeć do Ciebie wszędzie.', + 'walkthrough.steps.settings.title': 'Dostosuj pod siebie', + 'walkthrough.steps.settings.content': + 'Preferencje, prywatność i powiadomienia są tutaj. Możesz uruchomić tę prezentację ponownie z tej strony.', + 'walkthrough.steps.chatTab.title': 'Wróć do czatu', + 'walkthrough.steps.chatTab.content': 'Użyj karty Chat, gdy chcesz wrócić do rozmów.', + 'walkthrough.steps.humanTab.title': 'Poznaj profil Human', + 'walkthrough.steps.humanTab.content': + 'Human łączy Twój kontekst osobisty, tożsamość i profil widoczny dla asystenta.', + 'walkthrough.steps.brainTab.title': 'Otwórz Brain', + 'walkthrough.steps.brainTab.content': + 'Brain to graf pamięci: miejsce, w którym sprawdzisz, co wie OpenHuman i jak łączą się idee.', + 'walkthrough.steps.agentWorldTab.title': 'Odkryj Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World to miejsce na agentów wielokrotnego użytku i wspólne automatyzacje.', + 'walkthrough.steps.connectionsTab.title': 'Zarządzaj połączeniami', + 'walkthrough.steps.connectionsTab.content': + 'Connections jest zawsze dostępne w głównej nawigacji, gdy chcesz dodać lub zmienić usługi.', + 'walkthrough.steps.feedbackTab.title': 'Wyślij opinię', + 'walkthrough.steps.feedbackTab.content': + 'Feedback daje bezpośrednie miejsce do zgłaszania problemów lub próśb o ulepszenia.', + 'walkthrough.steps.allSet.title': 'Gotowe!', + 'walkthrough.steps.allSet.content': + 'Asystent zostawił Ci wiadomość powitalną: tu możesz czatować, pytać i rozwijać pomysły. Miłej zabawy!', 'walkthrough.tooltip.letsGo': 'Zaczynamy!', 'walkthrough.tooltip.next': 'Dalej →', 'walkthrough.tooltip.skip': 'Pomiń przewodnik', diff --git a/app/src/lib/i18n/pt.ts b/app/src/lib/i18n/pt.ts index 7d7962866..9eed871a1 100644 --- a/app/src/lib/i18n/pt.ts +++ b/app/src/lib/i18n/pt.ts @@ -5098,6 +5098,44 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Será redefinido {time}.', 'upsell.usageLimit.upgradePlan': 'Fazer upgrade do plano', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Comece no chat', + 'walkthrough.steps.startChat.content': + 'O chat é seu ponto de partida. Novas janelas abrem com a mesma saudação e ações rápidas vistas na configuração.', + 'walkthrough.steps.sayHello.title': 'Diga olá', + 'walkthrough.steps.sayHello.content': + 'Toque aqui para iniciar uma conversa com seu assistente de IA quando quiser.', + 'walkthrough.steps.meetAi.title': 'Conheça sua IA', + 'walkthrough.steps.meetAi.content': + 'É aqui que as conversas acontecem. Faça perguntas, peça resumos ou desenvolva ideias. Tudo continua pesquisável.', + 'walkthrough.steps.connectWorld.title': 'Conecte seu mundo', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp e mais: cada conexão dá novos poderes ao seu assistente.', + 'walkthrough.steps.messagingApps.title': 'Converse onde você já está', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: conecte seus apps de mensagens para que seu assistente alcance você em qualquer lugar.', + 'walkthrough.steps.settings.title': 'Deixe do seu jeito', + 'walkthrough.steps.settings.content': + 'Preferências, privacidade e notificações ficam aqui. Você pode reiniciar este tour por esta página a qualquer momento.', + 'walkthrough.steps.chatTab.title': 'Volte ao chat', + 'walkthrough.steps.chatTab.content': 'Use a aba Chat sempre que quiser retornar às conversas.', + 'walkthrough.steps.humanTab.title': 'Conheça seu perfil humano', + 'walkthrough.steps.humanTab.content': + 'Human reúne seu contexto pessoal, identidade e perfil visível ao assistente.', + 'walkthrough.steps.brainTab.title': 'Abra seu Brain', + 'walkthrough.steps.brainTab.content': + 'Brain é o grafo de memória: o lugar para ver o que o OpenHuman sabe e como as ideias se conectam.', + 'walkthrough.steps.agentWorldTab.title': 'Explore o Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World é onde ficam agentes reutilizáveis e automações compartilhadas.', + 'walkthrough.steps.connectionsTab.title': 'Gerencie conexões', + 'walkthrough.steps.connectionsTab.content': + 'Connections está sempre na navegação principal quando você quiser adicionar ou ajustar serviços.', + 'walkthrough.steps.feedbackTab.title': 'Enviar feedback', + 'walkthrough.steps.feedbackTab.content': + 'Feedback oferece um lugar direto para relatar problemas ou pedir melhorias.', + 'walkthrough.steps.allSet.title': 'Tudo pronto!', + 'walkthrough.steps.allSet.content': + 'Seu assistente deixou uma nota de boas-vindas: este é seu espaço para conversar, perguntar ou explorar ideias. Divirta-se!', 'walkthrough.tooltip.letsGo': 'Vamos lá!', 'walkthrough.tooltip.next': 'Próximo →', 'walkthrough.tooltip.skip': 'Pular tour', diff --git a/app/src/lib/i18n/ru.ts b/app/src/lib/i18n/ru.ts index d816b591d..ee34c7d68 100644 --- a/app/src/lib/i18n/ru.ts +++ b/app/src/lib/i18n/ru.ts @@ -5060,6 +5060,45 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': 'Сбросится {time}.', 'upsell.usageLimit.upgradePlan': 'Улучшить план', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': 'Начните в чате', + 'walkthrough.steps.startChat.content': + 'Чат — ваша отправная точка. Новые окна открываются с тем же приветствием и быстрыми действиями, которые вы видели после настройки.', + 'walkthrough.steps.sayHello.title': 'Поздоровайтесь', + 'walkthrough.steps.sayHello.content': + 'Нажмите здесь, чтобы в любой момент начать разговор с ИИ-ассистентом.', + 'walkthrough.steps.meetAi.title': 'Познакомьтесь с ИИ', + 'walkthrough.steps.meetAi.content': + 'Здесь проходят разговоры. Задавайте вопросы, получайте сводки или обдумывайте идеи. Все остается доступным для поиска.', + 'walkthrough.steps.connectWorld.title': 'Подключите свой мир', + 'walkthrough.steps.connectWorld.content': + 'Gmail, Slack, WhatsApp и другое: каждое подключение дает ассистенту новые возможности.', + 'walkthrough.steps.messagingApps.title': 'Общайтесь там, где уже работаете', + 'walkthrough.steps.messagingApps.content': + 'WhatsApp, Telegram, Slack, Discord: подключите мессенджеры, чтобы ассистент мог связаться с вами где угодно.', + 'walkthrough.steps.settings.title': 'Настройте под себя', + 'walkthrough.steps.settings.content': + 'Предпочтения, приватность и уведомления находятся здесь. Этот тур можно перезапустить с этой страницы в любое время.', + 'walkthrough.steps.chatTab.title': 'Вернуться в чат', + 'walkthrough.steps.chatTab.content': + 'Используйте вкладку Chat, когда хотите вернуться к разговорам.', + 'walkthrough.steps.humanTab.title': 'Ваш профиль Human', + 'walkthrough.steps.humanTab.content': + 'Human объединяет личный контекст, идентичность и профиль, видимый ассистенту.', + 'walkthrough.steps.brainTab.title': 'Откройте Brain', + 'walkthrough.steps.brainTab.content': + 'Brain — это граф памяти: здесь можно увидеть, что знает OpenHuman и как связаны идеи.', + 'walkthrough.steps.agentWorldTab.title': 'Исследуйте Agent World', + 'walkthrough.steps.agentWorldTab.content': + 'Agent World — место для переиспользуемых агентов и общих автоматизаций.', + 'walkthrough.steps.connectionsTab.title': 'Управляйте подключениями', + 'walkthrough.steps.connectionsTab.content': + 'Connections всегда доступен в основной навигации, когда нужно добавить или настроить сервисы.', + 'walkthrough.steps.feedbackTab.title': 'Отправить отзыв', + 'walkthrough.steps.feedbackTab.content': + 'Feedback дает прямое место для сообщений о проблемах и просьб об улучшениях.', + 'walkthrough.steps.allSet.title': 'Все готово!', + 'walkthrough.steps.allSet.content': + 'Ассистент оставил приветственную заметку: здесь можно общаться, задавать вопросы и развивать идеи. Удачи!', 'walkthrough.tooltip.letsGo': 'Поехали!', 'walkthrough.tooltip.next': 'Далее →', 'walkthrough.tooltip.skip': 'Пропустить тур', diff --git a/app/src/lib/i18n/zh-CN.ts b/app/src/lib/i18n/zh-CN.ts index 4ea416670..92b640637 100644 --- a/app/src/lib/i18n/zh-CN.ts +++ b/app/src/lib/i18n/zh-CN.ts @@ -4774,6 +4774,39 @@ const messages: TranslationMap = { 'upsell.usageLimit.resetsIn': '重置时间', 'upsell.usageLimit.upgradePlan': '升级方案', 'upsell.usageLimit.weeklyInference': '{amount}', + 'walkthrough.steps.startChat.title': '从聊天开始', + 'walkthrough.steps.startChat.content': + '聊天是你的起点。新窗口会显示设置后看到的同一欢迎语和快捷操作。', + 'walkthrough.steps.sayHello.title': '打个招呼', + 'walkthrough.steps.sayHello.content': '随时点击这里,开始和你的 AI 助手对话。', + 'walkthrough.steps.meetAi.title': '认识你的 AI', + 'walkthrough.steps.meetAi.content': + '对话都在这里进行。你可以提问、获取摘要或整理想法,所有内容都可以搜索。', + 'walkthrough.steps.connectWorld.title': '连接你的世界', + 'walkthrough.steps.connectWorld.content': 'Gmail、Slack、WhatsApp 等连接会为助手带来更多能力。', + 'walkthrough.steps.messagingApps.title': '在常用地方聊天', + 'walkthrough.steps.messagingApps.content': + '连接 WhatsApp、Telegram、Slack、Discord,让助手能在任何地方联系你。', + 'walkthrough.steps.settings.title': '按你的方式设置', + 'walkthrough.steps.settings.content': + '偏好、隐私和通知都在这里。你可以随时从此页面重新开始本引导。', + 'walkthrough.steps.chatTab.title': '返回聊天', + 'walkthrough.steps.chatTab.content': '想回到对话时,使用 Chat 标签。', + 'walkthrough.steps.humanTab.title': '了解你的 Human 资料', + 'walkthrough.steps.humanTab.content': 'Human 汇集你的个人上下文、身份以及助手可见的资料。', + 'walkthrough.steps.brainTab.title': '打开 Brain', + 'walkthrough.steps.brainTab.content': + 'Brain 是记忆图谱,用来查看 OpenHuman 知道什么,以及想法如何相互连接。', + 'walkthrough.steps.agentWorldTab.title': '探索 Agent World', + 'walkthrough.steps.agentWorldTab.content': 'Agent World 是可复用代理和共享自动化所在的位置。', + 'walkthrough.steps.connectionsTab.title': '管理连接', + 'walkthrough.steps.connectionsTab.content': + '想添加或调整服务时,Connections 始终可从主导航进入。', + 'walkthrough.steps.feedbackTab.title': '发送反馈', + 'walkthrough.steps.feedbackTab.content': 'Feedback 提供直接入口,用来报告问题或请求改进。', + 'walkthrough.steps.allSet.title': '全部就绪!', + 'walkthrough.steps.allSet.content': + '你的助手留下了一条欢迎消息:这里就是你聊天、提问和整理想法的空间。祝你使用愉快!', 'walkthrough.tooltip.letsGo': '出发吧!', 'walkthrough.tooltip.next': '下一步 →', 'walkthrough.tooltip.skip': '跳过引导', diff --git a/app/src/pages/onboarding/Onboarding.tsx b/app/src/pages/onboarding/Onboarding.tsx index 2c4a160a8..4c15d7feb 100644 --- a/app/src/pages/onboarding/Onboarding.tsx +++ b/app/src/pages/onboarding/Onboarding.tsx @@ -15,8 +15,8 @@ import WelcomePage from './pages/WelcomePage'; * Routed onboarding flow. * * welcome → runtime-choice - * ├── cloud → /home - * └── custom → /custom/inference → voice → oauth → search → embeddings → vault → /home + * ├── cloud → /chat + * └── custom → /custom/inference → voice → oauth → search → embeddings → vault → /chat * * Each custom step asks Default (let OpenHuman manage it) vs Configure * (let me pick). Default is a one-click pick; Configure renders inline diff --git a/app/src/pages/onboarding/OnboardingContext.tsx b/app/src/pages/onboarding/OnboardingContext.tsx index db7055106..b9f557b84 100644 --- a/app/src/pages/onboarding/OnboardingContext.tsx +++ b/app/src/pages/onboarding/OnboardingContext.tsx @@ -26,7 +26,7 @@ export interface OnboardingContextValue { setDraft: (updater: (prev: OnboardingDraft) => OnboardingDraft) => void; /** * Persist `onboarding_completed=true`, notify the backend (best-effort), and - * navigate to `/home`. Called by the final step. + * navigate to `/chat`. Called by the final step. */ completeAndExit: () => Promise; } diff --git a/app/src/pages/onboarding/OnboardingLayout.tsx b/app/src/pages/onboarding/OnboardingLayout.tsx index 92b514b5b..db268c4f3 100644 --- a/app/src/pages/onboarding/OnboardingLayout.tsx +++ b/app/src/pages/onboarding/OnboardingLayout.tsx @@ -11,7 +11,7 @@ import { OnboardingContext, type OnboardingDraft } from './OnboardingContext'; /** * Full-page chrome for the onboarding flow. Hosts the shared draft + the * completion side-effects (persist `onboarding_completed`, notify backend, - * navigate to /home). Individual steps render through ``. + * navigate to /chat). Individual steps render through ``. */ const OnboardingLayout = () => { const navigate = useNavigate(); @@ -66,16 +66,16 @@ const OnboardingLayout = () => { // Fire onboarding_complete analytics event before navigation. trackEvent('onboarding_complete'); - // Flag the Joyride walkthrough as pending so it auto-starts on /home. + // Flag the Joyride walkthrough as pending so it auto-starts on the chat landing surface. // Best-effort: localStorage failures must not block navigation. try { setWalkthroughPending(); - console.debug('[onboarding:layout] walkthrough pending flag set — navigating to /home'); + console.debug('[onboarding:layout] walkthrough pending flag set — navigating to /chat'); } catch (e) { console.warn('[onboarding:layout] could not set walkthrough pending flag; continuing', e); } - navigate('/home', { replace: true }); + navigate('/chat', { replace: true }); }, [draft.connectedSources, navigate, setOnboardingCompletedFlag, setOnboardingTasks, snapshot]); const value = useMemo( diff --git a/app/src/pages/onboarding/__tests__/OnboardingLayout.test.tsx b/app/src/pages/onboarding/__tests__/OnboardingLayout.test.tsx index 6b0875e9c..a0b6e6e96 100644 --- a/app/src/pages/onboarding/__tests__/OnboardingLayout.test.tsx +++ b/app/src/pages/onboarding/__tests__/OnboardingLayout.test.tsx @@ -143,7 +143,7 @@ async function setupLayout(onboardingTasks: unknown = null) { }> } /> - } /> + } /> @@ -221,9 +221,9 @@ describe('OnboardingLayout — Joyride walkthrough integration (#1123)', () => { expect(chatSend).not.toHaveBeenCalled(); }); - // Covers the catch branch in completeAndExit (OnboardingLayout.tsx:138): - // when setWalkthroughPending throws, navigation still proceeds to /home. - it('still navigates to /home when setWalkthroughPending throws', async () => { + // Covers the catch branch in completeAndExit: + // when setWalkthroughPending throws, navigation still proceeds to /chat. + it('still navigates to /chat when setWalkthroughPending throws', async () => { // Override default impl to throw for this one test invocation mockSetWalkthroughPending.mockImplementationOnce(() => { throw new Error('storage unavailable'); @@ -235,7 +235,7 @@ describe('OnboardingLayout — Joyride walkthrough integration (#1123)', () => { }); // Navigation should still proceed even when the flag cannot be written. - expect(screen.getByTestId('home-page')).toBeInTheDocument(); + expect(screen.getByTestId('chat-page')).toBeInTheDocument(); }); it('still completes onboarding when persisting onboarding tasks fails', async () => { @@ -250,7 +250,7 @@ describe('OnboardingLayout — Joyride walkthrough integration (#1123)', () => { }); expect(mockSetOnboardingCompletedFlag).toHaveBeenCalledWith(true); - expect(screen.getByTestId('home-page')).toBeInTheDocument(); + expect(screen.getByTestId('chat-page')).toBeInTheDocument(); warnSpy.mockRestore(); });