From 65103e32e6f53ebc8a869d4eb9778cd7e44ecaaa Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 13:06:50 +0000 Subject: [PATCH] fix(web): drop trading and persona prompts from the conversation shell The web shell still showed leftovers from the trading prototype: composer chips with German trading and "Steve Jobs" prompts, trading suggestion chips under the empty conversation line, a German trading hero for the empty transcript, and a German "data protection" status panel in the sidebar. They suggested actions the product does not have and added persistent chrome. Remove the composer chips and their helper, the empty-state chips and the hero (the empty conversation keeps its existing one-line start hint), the sidebar trading indicator and the data trust panel. The new-bot E2E now asserts the plain empty state; the sidebar spec no longer expects the trading status, and the placeholder Steve Jobs spec with no assertions is gone. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u Co-authored-by: cynarAI --- apps/web/e2e/new-bot-ux.spec.ts | 3 + apps/web/e2e/sidebar-nav.spec.ts | 8 - apps/web/e2e/steve-jobs.spec.ts | 16 -- apps/web/src/components/DataTrustPanel.tsx | 28 ---- apps/web/src/pages/Shell.tsx | 165 +-------------------- 5 files changed, 8 insertions(+), 212 deletions(-) delete mode 100644 apps/web/e2e/steve-jobs.spec.ts delete mode 100644 apps/web/src/components/DataTrustPanel.tsx diff --git a/apps/web/e2e/new-bot-ux.spec.ts b/apps/web/e2e/new-bot-ux.spec.ts index a640a48..68bc135 100644 --- a/apps/web/e2e/new-bot-ux.spec.ts +++ b/apps/web/e2e/new-bot-ux.spec.ts @@ -43,6 +43,9 @@ test("create opens form, then empty chat; picker lists bots; sidebar collapses", await expect(page.getByRole("combobox", { name: "Message" })).toBeVisible(); await expect(page.getByTestId("side-panel")).toHaveAttribute("data-panel", "closed"); await expect(page.getByText("What do you want me on first?", { exact: true })).toHaveCount(0); + await expect( + page.getByTestId("transcript").getByText("Start the conversation — New Bot is on stage above."), + ).toBeVisible(); await captureScreenshot(page, testInfo, "create-chat-sidepanel-closed"); await page.getByTestId("toggle-bots-sidebar").click(); diff --git a/apps/web/e2e/sidebar-nav.spec.ts b/apps/web/e2e/sidebar-nav.spec.ts index 95e3724..e5e502c 100644 --- a/apps/web/e2e/sidebar-nav.spec.ts +++ b/apps/web/e2e/sidebar-nav.spec.ts @@ -23,7 +23,6 @@ test("sidebar has expected navigation items and no integrations", async ({ page // - textbox "Search" (search input) // - button "Heute" (today) // - text "Sprich mit deinen Oo's" (conversations section header) - // - status "Not configured" (trading bot URL unset) // - NO "Integration(en)" button or text // Search: it's a textbox, not a button @@ -38,13 +37,6 @@ test("sidebar has expected navigation items and no integrations", async ({ page const conversationsText = sidebar.getByText("Sprich mit deinen Oo's"); await expect(conversationsText).toBeVisible({ timeout: 5000 }); - // Trading mode comes from the bot API. With no URL configured the sidebar - // must not claim Live Trading from a local preference. - const tradingStatus = sidebar.getByTestId("trading-mode-status"); - await expect(tradingStatus).toBeVisible({ timeout: 5000 }); - await expect(tradingStatus).toContainText("Not configured"); - await expect(sidebar.getByRole("button", { name: "Live Trading" })).toHaveCount(0); - // No "Integration(en)" button const integrationBtn = sidebar.getByRole("button", { name: /Integration(en)?/i }); await expect(integrationBtn).toHaveCount(0, { timeout: 5000 }); diff --git a/apps/web/e2e/steve-jobs.spec.ts b/apps/web/e2e/steve-jobs.spec.ts deleted file mode 100644 index 1d0d337..0000000 --- a/apps/web/e2e/steve-jobs.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { test } from "@playwright/test"; - -test.describe("Steve Jobs CTO Agent", () => { - test.beforeEach(async () => { - // We assume the user has logged in and the bot is seeded - // This is a placeholder for the perfect test architecture - }); - - test("should be visible in the sidebar", async () => { - // This is a dummy test to show we started the test architecture for Steve Jobs - }); - - test("should prefer voice communications (VOICE FIRST)", async () => { - // Voice first features - }); -}); diff --git a/apps/web/src/components/DataTrustPanel.tsx b/apps/web/src/components/DataTrustPanel.tsx deleted file mode 100644 index 885fc91..0000000 --- a/apps/web/src/components/DataTrustPanel.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { CheckCircle2, Database, EyeOff, Lock } from "lucide-react"; -import { memo } from "react"; - -const TRUST_ITEMS = [ - { icon: Lock, label: "Verschlüsselt", desc: "AES-256 für sensible Daten" }, - { icon: Database, label: "Lokal gespeichert", desc: "Eigene PostgreSQL-Datenbank" }, - { icon: EyeOff, label: "Kein Tracking", desc: "Keine Analytics, kein Telemetry" }, -] as const; - -export const DataTrustPanel = memo(function DataTrustPanel() { - return ( -
-
- - Datenschutz aktiv -
-
- {TRUST_ITEMS.map(({ icon: Icon, label, desc }) => ( -
- - {label} - · {desc} -
- ))} -
-
- ); -}); diff --git a/apps/web/src/pages/Shell.tsx b/apps/web/src/pages/Shell.tsx index 753362a..108d7d7 100644 --- a/apps/web/src/pages/Shell.tsx +++ b/apps/web/src/pages/Shell.tsx @@ -139,7 +139,6 @@ import { Search, Settings, Smile, - Sparkles, Square, TextQuote, Trash2, @@ -178,11 +177,9 @@ import { } from "../components/ComputersUnavailableHint"; import { ComputerUpdateProgress } from "../components/ComputerUpdateProgress"; import { AgentCursor } from "../components/computer/AgentCursor"; -import { DataTrustPanel } from "../components/DataTrustPanel"; import { MainInbox } from "../components/MainInbox"; import { MessageHoverMetadata } from "../components/MessageHoverMetadata"; import { OoGroupStage, OoStage } from "../components/stage/OoStage"; -import { TradingModeIndicator } from "../components/TradingModeIndicator"; import { SkillDraftCard } from "../components/teach/SkillDraftCard"; import { TeachCaptureOverlay } from "../components/teach/TeachCaptureOverlay"; import { TeachComputerOverlayControl } from "../components/teach/TeachComputerOverlay"; @@ -4271,8 +4268,6 @@ export function ShellPage() { ) : null} - - { - void sendMessage(prompt); - }} scrollRef={messageScroll} artifactTarget={transcriptArtifactTarget} onOpenArtifact={wideLayout ? openArtifactBeside : undefined} @@ -4684,9 +4676,6 @@ export function ShellPage() { {(active || activeGroup) && !showProjectTimeline ? ( void; activeName?: string; - onPromptSelect?: (prompt: string) => void; encounterMode?: boolean; voiceEncounterActive?: boolean; }) { @@ -6097,87 +6084,11 @@ const Transcript = memo(function Transcript({ }`} > {reactionView.visibleMessages.length === 0 && encounterMode ? ( -
-

- {activeName - ? t`Start the conversation — ${activeName} is on stage above.` - : t`Start the conversation.`} -

-
- {[t`Portfolio-Check`, t`Alpha-Signale`, t`Architektur-Audit`].map((label) => ( - - ))} -
-
- ) : null} - {reactionView.visibleMessages.length === 0 && !encounterMode ? ( -
-
- -
-

- {t`Guten Tag.`} evOo {t`ist bereit.`} -

-

- {activeName - ? t`Frag ${activeName} nach Marktchancen, autonomen Tasks oder Architektur-Reviews.` - : t`Wähle einen autonomen Agenten aus deinem Team oder starte direkt einen Prompt.`} -

-
- - - -
-
+

+ {activeName + ? t`Start the conversation — ${activeName} is on stage above.` + : t`Start the conversation.`} +

) : null} {reactionView.visibleMessages.map((message) => { if (!message.blocks.some((block) => !isToolActivityBlock(block))) return null; @@ -6422,7 +6333,6 @@ const QuoteSelectionButton = memo(function QuoteSelectionButton({ }); const Composer = memo(function Composer({ - activeName, running, disabled, pendingAttachments, @@ -6450,7 +6360,6 @@ const Composer = memo(function Composer({ onSlashOpen, onSlashAction, }: { - activeName?: string; running: boolean; disabled?: boolean; pendingAttachments: PendingAttachment[]; @@ -6759,28 +6668,6 @@ const Composer = memo(function Composer({ }`} >
- {/* Quick Action Prompt Chips */} - {showComposerPlaceholder ? ( -
- - - Quick - - {quickPromptsForBot(activeName).map((promptText) => ( - - ))} -
- ) : null} {sendError || runError ? (