fix(onboarding): update walkthrough targets (#3944)

This commit is contained in:
Steven Enamakel
2026-06-22 17:36:22 -07:00
committed by GitHub
parent 2d71eb3ab1
commit b6a6202d46
22 changed files with 653 additions and 80 deletions
@@ -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<boolean>(() => 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.
@@ -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.
@@ -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 } =
@@ -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="<selector>"]` appears in the
* DOM, then resolves. Rejects after `timeout` ms (default 3000).
@@ -43,7 +45,7 @@ export function waitForTarget(selector: string, timeout = 3000): Promise<void> {
}
/**
* 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<void> {
* All targets follow the `[data-walkthrough="<name>"]` 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 () => {
+36
View File
@@ -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': 'تخطّي الجولة',
+38
View File
@@ -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': 'ট্যুর এড়িয়ে যান',
+39
View File
@@ -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',
+39
View File
@@ -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',
+39
View File
@@ -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',
+39
View File
@@ -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 souvrent 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':
'Cest 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 longlet 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 lassistant.',
'walkthrough.steps.brainTab.title': 'Ouvrez votre Brain',
'walkthrough.steps.brainTab.content':
'Brain est le graphe de mémoire : lendroit où vérifier ce quOpenHuman 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',
+38
View File
@@ -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': 'टूर छोड़ें',
+39
View File
@@ -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',
+38
View File
@@ -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 allassistente.',
'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',
+37
View File
@@ -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': '투어 건너뛰기',
+38
View File
@@ -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',
+38
View File
@@ -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',
+39
View File
@@ -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': 'Пропустить тур',
+33
View File
@@ -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': '跳过引导',
+2 -2
View File
@@ -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
@@ -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<void>;
}
@@ -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 `<Outlet />`.
* navigate to /chat). Individual steps render through `<Outlet />`.
*/
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(
@@ -143,7 +143,7 @@ async function setupLayout(onboardingTasks: unknown = null) {
<Route path="/onboarding" element={<OnboardingLayout />}>
<Route index element={<TriggerComplete />} />
</Route>
<Route path="/home" element={<div data-testid="home-page" />} />
<Route path="/chat" element={<div data-testid="chat-page" />} />
</Routes>
</MemoryRouter>
</Provider>
@@ -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();
});