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 5400308..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 bf25ff9..4a6c86b 100644 --- a/apps/web/src/pages/Shell.tsx +++ b/apps/web/src/pages/Shell.tsx @@ -130,7 +130,6 @@ import { Search, Settings, Smile, - Sparkles, Square, TextQuote, Trash2, @@ -166,11 +165,9 @@ import { computersAreUnavailable, } from "../components/ComputersUnavailableHint"; import { ComputerUpdateProgress } from "../components/ComputerUpdateProgress"; -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"; @@ -4246,8 +4243,6 @@ export function ShellPage() { ) : null} - - { - void sendMessage(prompt); - }} scrollRef={messageScroll} artifactTarget={transcriptArtifactTarget} messages={transcriptMessages} @@ -4647,9 +4639,6 @@ export function ShellPage() { {(active || activeGroup) && !showProjectTimeline ? ( void; activeName?: string; - onPromptSelect?: (prompt: string) => void; encounterMode?: boolean; voiceEncounterActive?: boolean; }) { @@ -6082,87 +6069,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; @@ -6393,7 +6304,6 @@ const QuoteSelectionButton = memo(function QuoteSelectionButton({ }); const Composer = memo(function Composer({ - activeName, running, disabled, pendingAttachments, @@ -6421,7 +6331,6 @@ const Composer = memo(function Composer({ onSlashOpen, onSlashAction, }: { - activeName?: string; running: boolean; disabled?: boolean; pendingAttachments: PendingAttachment[]; @@ -6730,28 +6639,6 @@ const Composer = memo(function Composer({ }`} >
- {/* Quick Action Prompt Chips */} - {showComposerPlaceholder ? ( -
- - - Quick - - {quickPromptsForBot(activeName).map((promptText) => ( - - ))} -
- ) : null} {sendError || runError ? (