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}