From f8d168159f4fa4d3e87b28396ed38e3281c46f86 Mon Sep 17 00:00:00 2001 From: Lambda Date: Wed, 8 Jul 2026 15:53:14 +0800 Subject: [PATCH] refactor(chat): drop starter prompts from chat empty state (MUL-4237) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three starter prompts (List my open tasks by priority / Summarize what I did today / Plan what to work on next) read as filler more than help, so remove them along with the now-unused returning_subtitle ("Try asking"). The empty state keeps its agent-aware header โ€” avatar + "Chat with {name}" + optional description โ€” and the composer stays the entry point. Locale keys dropped across en/zh-Hans/ja/ko (parity preserved). Based on the Chat V2 branch (parent MUL-4171, #5076), not main. --- packages/views/chat/chat-page.tsx | 7 +-- .../chat/components/chat-empty-state.tsx | 47 +++---------------- packages/views/locales/en/chat.json | 6 --- packages/views/locales/ja/chat.json | 6 --- packages/views/locales/ko/chat.json | 6 --- packages/views/locales/zh-Hans/chat.json | 6 --- 6 files changed, 8 insertions(+), 70 deletions(-) diff --git a/packages/views/chat/chat-page.tsx b/packages/views/chat/chat-page.tsx index ec89b744ed..ab496e0987 100644 --- a/packages/views/chat/chat-page.tsx +++ b/packages/views/chat/chat-page.tsx @@ -136,7 +136,7 @@ export function ChatPage() { // The conversation pane: message list / skeleton / empty above a persistent // banner + input. Identical composition to the floating window's body, so a - // brand-new chat (no active session) still shows the starter prompts + input. + // brand-new chat (no active session) shows the agent-aware empty state + input. // No compose-box agent selector โ€” the agent is fixed when the chat starts. const conversation = (
@@ -157,10 +157,7 @@ export function ChatPage() { onLoadOlderMessages={() => void c.fetchOlderMessages()} /> ) : ( - c.handleSend(text)} - /> + )} {c.noAgent ? ( diff --git a/packages/views/chat/components/chat-empty-state.tsx b/packages/views/chat/components/chat-empty-state.tsx index 0ed88ed636..0a266d3d53 100644 --- a/packages/views/chat/components/chat-empty-state.tsx +++ b/packages/views/chat/components/chat-empty-state.tsx @@ -4,32 +4,13 @@ import type { Agent } from "@multica/core/types"; import { ActorAvatar } from "../../common/actor-avatar"; import { useT } from "../../i18n"; -// Three starter prompts shown on the empty compose. Each is keyed into the -// chat namespace so labels translate per locale; the icon stays raw since -// emojis are locale-neutral. -const STARTER_KEYS: ("list_open" | "summarize_today" | "plan_next")[] = [ - "list_open", - "summarize_today", - "plan_next", -]; -const STARTER_ICONS: Record<(typeof STARTER_KEYS)[number], string> = { - list_open: "๐Ÿ“‹", - summarize_today: "๐Ÿ“", - plan_next: "๐Ÿ’ก", -}; - /** * Empty compose placeholder shown when a chat has no messages yet. Agent-aware: * it leads with the chosen agent's avatar + name + description so the user knows - * exactly who they're about to talk to, then offers starter prompts. + * exactly who they're about to talk to. The composer below is the entry point โ€” + * no starter prompts, they read as filler more than help. */ -export function EmptyState({ - agent, - onPickPrompt, -}: { - agent: Agent | null; - onPickPrompt: (text: string) => void; -}) { +export function EmptyState({ agent }: { agent: Agent | null }) { const { t } = useT("chat"); const description = agent?.description?.trim(); return ( @@ -48,25 +29,9 @@ export function EmptyState({ ? t(($) => $.empty_state.chat_with_named, { name: agent.name }) : t(($) => $.empty_state.first_time_title)} -

- {description || t(($) => $.empty_state.returning_subtitle)} -

-
-
- {STARTER_KEYS.map((key) => { - const text = t(($) => $.starter_prompts[key]); - return ( - - ); - })} + {description && ( +

{description}

+ )}
); diff --git a/packages/views/locales/en/chat.json b/packages/views/locales/en/chat.json index d1b69780ce..82735908a7 100644 --- a/packages/views/locales/en/chat.json +++ b/packages/views/locales/en/chat.json @@ -94,14 +94,8 @@ "first_time_actions": "Ask for a summary, plan your day, or hand off a quick task.", "returning_title_named": "Hi, I'm {{name}}", "returning_title_default": "Welcome to Multica", - "returning_subtitle": "Try asking", "chat_with_named": "Chat with {{name}}" }, - "starter_prompts": { - "list_open": "List my open tasks by priority", - "summarize_today": "Summarize what I did today", - "plan_next": "Plan what to work on next" - }, "no_agent_banner": "You need an agent to start chatting.", "offline_banner": { "fallback_name": "the agent", diff --git a/packages/views/locales/ja/chat.json b/packages/views/locales/ja/chat.json index cdf61f5b06..11e02aa4d8 100644 --- a/packages/views/locales/ja/chat.json +++ b/packages/views/locales/ja/chat.json @@ -91,14 +91,8 @@ "first_time_actions": "่ฆ็ด„ใ‚’้ ผใ‚“ใ ใ‚Šใ€ไปŠๆ—ฅใฎไบˆๅฎšใ‚’็ซ‹ใฆใŸใ‚Šใ€็ฐกๅ˜ใชใ‚ฟใ‚นใ‚ฏใ‚’ไปปใ›ใŸใ‚Šใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚", "returning_title_named": "ใ“ใ‚“ใซใกใฏใ€{{name}} ใงใ™", "returning_title_default": "Multica ใธใ‚ˆใ†ใ“ใ", - "returning_subtitle": "ใ“ใ†่žใ„ใฆใฟใพใ—ใ‚‡ใ†", "chat_with_named": "{{name}} ใจใƒใƒฃใƒƒใƒˆ" }, - "starter_prompts": { - "list_open": "ใ‚ชใƒผใƒ—ใƒณใชใ‚ฟใ‚นใ‚ฏใ‚’ๅ„ชๅ…ˆๅบฆ้ †ใซใพใจใ‚ใฆ", - "summarize_today": "ไปŠๆ—ฅใ‚„ใฃใŸใ“ใจใ‚’่ฆ็ด„ใ—ใฆ", - "plan_next": "ๆฌกใซๅ–ใ‚Š็ต„ใ‚€ใ“ใจใ‚’่จˆ็”ปใ—ใฆ" - }, "no_agent_banner": "ใƒใƒฃใƒƒใƒˆใ‚’ๅง‹ใ‚ใ‚‹ใซใฏใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใŒๅฟ…่ฆใงใ™ใ€‚", "offline_banner": { "fallback_name": "ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ", diff --git a/packages/views/locales/ko/chat.json b/packages/views/locales/ko/chat.json index 60fd12cffe..f8c4cc2fd4 100644 --- a/packages/views/locales/ko/chat.json +++ b/packages/views/locales/ko/chat.json @@ -91,14 +91,8 @@ "first_time_actions": "์š”์•ฝ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜, ์˜ค๋Š˜ ํ•  ์ผ์„ ๊ณ„ํšํ•˜๊ฑฐ๋‚˜, ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ๋งก๊ฒจ๋ณด์„ธ์š”.", "returning_title_named": "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” {{name}}์ž…๋‹ˆ๋‹ค", "returning_title_default": "Multica์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค", - "returning_subtitle": "์ด๋ ‡๊ฒŒ ์š”์ฒญํ•ด ๋ณด์„ธ์š”", "chat_with_named": "{{name}}์™€ ์ฑ„ํŒ…" }, - "starter_prompts": { - "list_open": "์—ด๋ฆฐ ์ž‘์—…์„ ์šฐ์„ ์ˆœ์œ„๋ณ„๋กœ ์ •๋ฆฌํ•ด ์ค˜", - "summarize_today": "์˜ค๋Š˜ ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ์š”์•ฝํ•ด ์ค˜", - "plan_next": "๋‹ค์Œ์— ํ•  ์ผ์„ ๊ณ„ํšํ•ด ์ค˜" - }, "no_agent_banner": "์ฑ„ํŒ…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.", "offline_banner": { "fallback_name": "์—์ด์ „ํŠธ", diff --git a/packages/views/locales/zh-Hans/chat.json b/packages/views/locales/zh-Hans/chat.json index 96f957a170..3c913935dd 100644 --- a/packages/views/locales/zh-Hans/chat.json +++ b/packages/views/locales/zh-Hans/chat.json @@ -91,14 +91,8 @@ "first_time_actions": "่ฎฉๅฎƒๅšไธ€ไปฝๆ€ป็ป“ใ€่ง„ๅˆ’ไฝ ็š„ไธ€ๅคฉ๏ผŒๆˆ–ไบค็ป™ๅฎƒไธ€ไธชๅฐไปปๅŠกใ€‚", "returning_title_named": "ไฝ ๅฅฝ๏ผŒๆˆ‘ๆ˜ฏ {{name}}", "returning_title_default": "ๆฌข่ฟŽไฝฟ็”จ Multica", - "returning_subtitle": "่ฏ•่ฏ•้—ฎ", "chat_with_named": "ไธŽ {{name}} ๅฏน่ฏ" }, - "starter_prompts": { - "list_open": "ๆŒ‰ไผ˜ๅ…ˆ็บงๅˆ—ๅ‡บๆˆ‘ๆœชๅฎŒๆˆ็š„ไปปๅŠก", - "summarize_today": "ๆ€ป็ป“ไธ€ไธ‹ๆˆ‘ไปŠๅคฉๅšไบ†ไป€ไนˆ", - "plan_next": "่ง„ๅˆ’ๆŽฅไธ‹ๆฅ่ฏฅๅšไป€ไนˆ" - }, "no_agent_banner": "้œ€่ฆๅ…ˆๆœ‰ไธ€ไธชๆ™บ่ƒฝไฝ“ๆ‰่ƒฝๅผ€ๅง‹ๅฏน่ฏใ€‚", "offline_banner": { "fallback_name": "ๆ™บ่ƒฝไฝ“",