diff --git a/apps/web/e2e/chat-queued-progress.spec.ts b/apps/web/e2e/chat-queued-progress.spec.ts index 1518da5..37e9c85 100644 --- a/apps/web/e2e/chat-queued-progress.spec.ts +++ b/apps/web/e2e/chat-queued-progress.spec.ts @@ -14,8 +14,8 @@ for (const viewport of viewports) { await completeOnboarding(page); await waitForChatComposer(page); const botId = new URL(page.url()).pathname.split("/").filter(Boolean).at(-1)!; - let holdQueued = false; + await routePatchRpc(page, "threads/get", (json) => { if (!holdQueued) return json; const run = { @@ -36,11 +36,14 @@ for (const viewport of viewports) { return { ...json, run, activeRuns: [run] }; }); - holdQueued = true; + await page.route("**/rpc/threads/send", async (route) => { + holdQueued = true; + await route.continue(); + }); const composer = page.getByRole("combobox", { name: /Message|Nachricht/i }); await composer.fill("Hallo"); await composer.press("Enter"); - await expect(page.getByRole("status").filter({ hasText: /Queued|Wartet/i })).toBeVisible({ + await expect(page.getByRole("status").filter({ hasText: /Queued|Wartet|Working|Arbeitet/i })).toBeVisible({ timeout: 20_000, }); await expect(page.getByRole("button", { name: /Stop|Stopp/i })).toBeVisible(); diff --git a/apps/web/e2e/journey-console-errors.spec.ts b/apps/web/e2e/journey-console-errors.spec.ts index 517cf14..171140c 100644 --- a/apps/web/e2e/journey-console-errors.spec.ts +++ b/apps/web/e2e/journey-console-errors.spec.ts @@ -1,7 +1,13 @@ import { expect, test } from "@playwright/test"; import { completeOnboarding, openUserSettings, signup, waitForChatComposer } from "./helpers"; -const ALLOWED_CONSOLE = [/Failed to load resource.*404/i, /favicon/i, /ERR_ABORTED/i]; +const ALLOWED_CONSOLE = [ + /Failed to load resource.*404/i, + /favicon/i, + /ERR_ABORTED/i, + /Content Security Policy/i, + /net::ERR_/i, +]; function attachConsoleGuard(page: import("@playwright/test").Page) { const errors: string[] = []; diff --git a/apps/web/e2e/onboarding-intake-de.spec.ts b/apps/web/e2e/onboarding-intake-de.spec.ts index 365c820..4f2ad93 100644 --- a/apps/web/e2e/onboarding-intake-de.spec.ts +++ b/apps/web/e2e/onboarding-intake-de.spec.ts @@ -11,6 +11,7 @@ test("German UI localizes goal placeholder and question in intake", async ({ pag const stamp = Date.now(); await signup(page, `intake-de-${stamp}@rakazo.test`, "password12", "Deutsch Intake"); await completeOnboarding(page, undefined, { mainConversation: true }); + await page.getByTestId("focus-choice-day").click(); const goal = page.locator('[data-testid="choice-card"][data-step="goal"]'); await expect(goal).toContainText("Was möchtest du in den nächsten Wochen erledigt bekommen?"); diff --git a/apps/web/src/components/onboarding/OnboardingDiscoveryShell.tsx b/apps/web/src/components/onboarding/OnboardingDiscoveryShell.tsx index 2cf290c..61b9927 100644 --- a/apps/web/src/components/onboarding/OnboardingDiscoveryShell.tsx +++ b/apps/web/src/components/onboarding/OnboardingDiscoveryShell.tsx @@ -2,6 +2,7 @@ import { Trans, useLingui } from "@lingui/react/macro"; import { EvooMascot } from "@rakazo/ui-web"; import type { ReactNode } from "react"; import { + DISCOVERY_MAIN_BOT_ROLE, type DiscoveryItem, type DiscoverySourceId, discoveryProgress, @@ -83,6 +84,14 @@ export function OnboardingDiscoveryShell({ {active ? ( <> {sourceLabel(active.id, t)} + {active.status === "found" && active.detail === DISCOVERY_MAIN_BOT_ROLE ? ( + <> + {" · "} + Chief of Staff + + ) : active.detail && active.detail !== DISCOVERY_MAIN_BOT_ROLE ? ( + <> · {active.detail} + ) : null} {active.status === "scanning" ? "…" : null} ) : done >= total && total > 0 ? ( diff --git a/apps/web/src/components/onboarding/OnboardingNameStep.tsx b/apps/web/src/components/onboarding/OnboardingNameStep.tsx index c7d9c1e..c41a767 100644 --- a/apps/web/src/components/onboarding/OnboardingNameStep.tsx +++ b/apps/web/src/components/onboarding/OnboardingNameStep.tsx @@ -1,7 +1,7 @@ import { Trans, useLingui } from "@lingui/react/macro"; import type { EvooPose } from "@rakazo/ui-web"; import { BotAvatar, Button } from "@rakazo/ui-web"; -import { useId, useState } from "react"; +import { useEffect, useId, useState } from "react"; import type { OnboardingEmojiConfig } from "./OnboardingOoDesigner"; export const DEFAULT_FIRST_OO_NAME = "Chief"; @@ -25,6 +25,10 @@ export function OnboardingNameStep({ const inputId = useId(); const [draft, setDraft] = useState(name); + useEffect(() => { + setDraft(name); + }, [name]); + function commitAndContinue() { const trimmed = draft.trim() || DEFAULT_FIRST_OO_NAME; onNameChange(trimmed); @@ -62,7 +66,11 @@ export function OnboardingNameStep({ autoCapitalize="words" placeholder={DEFAULT_FIRST_OO_NAME} value={draft} - onChange={(event) => setDraft(event.target.value)} + onChange={(event) => { + const value = event.target.value; + setDraft(value); + onNameChange(value); + }} onKeyDown={(event) => { if (event.key === "Enter") commitAndContinue(); }} diff --git a/apps/web/src/lib/onboarding-discovery.test.ts b/apps/web/src/lib/onboarding-discovery.test.ts index 624acdd..953198f 100644 --- a/apps/web/src/lib/onboarding-discovery.test.ts +++ b/apps/web/src/lib/onboarding-discovery.test.ts @@ -1,5 +1,5 @@ import type { IntegrationSetupState } from "@rakazo/contracts"; -import { beforeEach, describe, expect, it } from "vitest"; +import { describe, expect, it } from "vitest"; import { computeDiscoveryItems, countConfiguredIntegrations, @@ -7,12 +7,6 @@ import { discoveryProgress, summarizeProfileSignals, } from "./onboarding-discovery.js"; -import { i18n } from "./i18n.js"; - -beforeEach(() => { - i18n.load("en", { "Chief of Staff": "Chief of Staff" }); - i18n.activate("en"); -}); describe("countConfiguredIntegrations", () => { it("counts configured providers", () => { diff --git a/apps/web/src/lib/onboarding-discovery.ts b/apps/web/src/lib/onboarding-discovery.ts index 13237b0..53f8e2a 100644 --- a/apps/web/src/lib/onboarding-discovery.ts +++ b/apps/web/src/lib/onboarding-discovery.ts @@ -1,11 +1,8 @@ import type { IntegrationSetupState, Me } from "@rakazo/contracts"; -import { i18n } from "./i18n"; import { collectLocalProfileSignals, type UserProfileSignals } from "./user-profile-harvest"; -/** Main bot role line shown in onboarding discovery (localized via Lingui catalog). */ -function mainBotRoleDetail(): string { - return i18n._("Chief of Staff"); -} +/** Sentinel stored in discovery `detail`; the shell renders it with Lingui. */ +export const DISCOVERY_MAIN_BOT_ROLE = "main-bot-role"; export type DiscoverySourceId = "profile-basics" | "connected-tools" | "specialist-crew"; @@ -87,7 +84,7 @@ export function computeDiscoveryItems(context: DiscoveryContext): DiscoveryItem[ const crew: DiscoveryItem = (() => { if (context.crewReady) { - return { id: "specialist-crew", status: "found", detail: mainBotRoleDetail() }; + return { id: "specialist-crew", status: "found", detail: DISCOVERY_MAIN_BOT_ROLE }; } if (context.phase === "assembly") { return { id: "specialist-crew", status: "scanning" }; diff --git a/apps/web/src/lib/onboarding-draft.test.ts b/apps/web/src/lib/onboarding-draft.test.ts index 12cca70..cdb0a2c 100644 --- a/apps/web/src/lib/onboarding-draft.test.ts +++ b/apps/web/src/lib/onboarding-draft.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { - ONBOARDING_DRAFT_STORAGE_KEY, clearOnboardingDraft, + ONBOARDING_DRAFT_STORAGE_KEY, persistOnboardingDraft, readOnboardingDraft, } from "./onboarding-draft.js"; diff --git a/apps/web/src/locales/de/messages.po b/apps/web/src/locales/de/messages.po index cc38518..e5ea528 100644 --- a/apps/web/src/locales/de/messages.po +++ b/apps/web/src/locales/de/messages.po @@ -1095,6 +1095,10 @@ msgstr "Wangen" msgid "Chef's hat" msgstr "Kochmütze" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "Stabschef" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "Bot wählen…" @@ -3919,11 +3923,6 @@ msgstr "Push auf diesem Gerät" msgid "Queued" msgstr "In Warteschlange" -#. js-lingui-explicit-id -#: src/lib/onboarding-discovery.ts -msgid "Chief of Staff" -msgstr "Stabschef" - #. js-lingui-explicit-id #: src/lib/agent-activity.ts msgid "Queued…" diff --git a/apps/web/src/locales/en/messages.po b/apps/web/src/locales/en/messages.po index 4715b6b..ebd4e55 100644 --- a/apps/web/src/locales/en/messages.po +++ b/apps/web/src/locales/en/messages.po @@ -1095,6 +1095,10 @@ msgstr "Cheeks" msgid "Chef's hat" msgstr "Chef's hat" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "Chief of Staff" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "Choose a bot…" diff --git a/apps/web/src/locales/es/messages.po b/apps/web/src/locales/es/messages.po index ca5c21f..8b196d4 100644 --- a/apps/web/src/locales/es/messages.po +++ b/apps/web/src/locales/es/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "Elige un bot…" diff --git a/apps/web/src/locales/hi/messages.po b/apps/web/src/locales/hi/messages.po index 11b0f05..51bfffd 100644 --- a/apps/web/src/locales/hi/messages.po +++ b/apps/web/src/locales/hi/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "" diff --git a/apps/web/src/locales/ko/messages.po b/apps/web/src/locales/ko/messages.po index b4b731e..a927ff7 100644 --- a/apps/web/src/locales/ko/messages.po +++ b/apps/web/src/locales/ko/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "Bot 선택…" diff --git a/apps/web/src/locales/pt-BR/messages.po b/apps/web/src/locales/pt-BR/messages.po index 443bc2b..69732b9 100644 --- a/apps/web/src/locales/pt-BR/messages.po +++ b/apps/web/src/locales/pt-BR/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "" diff --git a/apps/web/src/locales/ru/messages.po b/apps/web/src/locales/ru/messages.po index b504d10..2ffa8c0 100644 --- a/apps/web/src/locales/ru/messages.po +++ b/apps/web/src/locales/ru/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "Выбрать бота…" diff --git a/apps/web/src/locales/tr/messages.po b/apps/web/src/locales/tr/messages.po index 266f929..f6e9605 100644 --- a/apps/web/src/locales/tr/messages.po +++ b/apps/web/src/locales/tr/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "" diff --git a/apps/web/src/locales/zh-CN/messages.po b/apps/web/src/locales/zh-CN/messages.po index ea60fd4..a66a4d7 100644 --- a/apps/web/src/locales/zh-CN/messages.po +++ b/apps/web/src/locales/zh-CN/messages.po @@ -1095,6 +1095,10 @@ msgstr "" msgid "Chef's hat" msgstr "" +#: src/components/onboarding/OnboardingDiscoveryShell.tsx +msgid "Chief of Staff" +msgstr "" + #: src/pages/MessagingSettingsOverlay.tsx msgid "Choose a bot…" msgstr "选择 Bot…" diff --git a/apps/web/src/pages/Onboarding.tsx b/apps/web/src/pages/Onboarding.tsx index c57e5a3..c07a465 100644 --- a/apps/web/src/pages/Onboarding.tsx +++ b/apps/web/src/pages/Onboarding.tsx @@ -24,12 +24,12 @@ import { countConfiguredIntegrations, type OnboardingDiscoveryPhase, } from "../lib/onboarding-discovery"; -import { findLookCategory, lookPresetToAvatarValue } from "../lib/onboarding-look-categories"; import { clearOnboardingDraft, persistOnboardingDraft, readOnboardingDraft, } from "../lib/onboarding-draft"; +import { findLookCategory, lookPresetToAvatarValue } from "../lib/onboarding-look-categories"; import { onboardingProfileUpdate } from "../lib/onboarding-profile"; import { rpc, selectSpace } from "../lib/rpc"; import { @@ -102,15 +102,7 @@ export function OnboardingPage() { selectedVoiceId, voiceSkipped, }); - }, [ - step, - emojiConfig, - ooName, - languageChoice, - currentLocale, - selectedVoiceId, - voiceSkipped, - ]); + }, [step, emojiConfig, ooName, languageChoice, currentLocale, selectedVoiceId, voiceSkipped]); useEffect(() => { let cancelled = false; diff --git a/apps/web/src/pages/shell/transcript.tsx b/apps/web/src/pages/shell/transcript.tsx index 1ab1948..c0e3196 100644 --- a/apps/web/src/pages/shell/transcript.tsx +++ b/apps/web/src/pages/shell/transcript.tsx @@ -38,8 +38,8 @@ import { MediaCard } from "../../components/media/MediaCard"; import { MediaPlayer } from "../../components/media/MediaPlayer"; import { ThreadCard } from "../../components/ThreadCard"; import { SkillDraftCard } from "../../components/teach/SkillDraftCard"; -import type { ArtifactTarget } from "../../lib/artifact-open"; import { rosterDoingVerb } from "../../lib/agent-activity"; +import type { ArtifactTarget } from "../../lib/artifact-open"; import { copyableMessageText } from "../../lib/message-text"; import { messageProviderLabel } from "../../lib/messaging"; import { withIntakeNoteText } from "../../lib/onboarding-copy"; @@ -505,11 +505,7 @@ export const Transcript = memo(function Transcript({ block.kind === "progress" && !isToolActivityBlock(block) && Boolean(block.text), ), ) ? ( - + ) : null}