feat(web): 前端收敛为「共享消息流 + 按消息 mode 渲染」,并补全 emoji→MD3 图标
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

架构变更(主人要求,design/07 §1/§2 已改定稿):把「9 个行为模式 = 9 个独立页面」改为
「一个共享页面 + 每条消息绑 mode,消息框按对应 mode 渲染」。
- ChatMessage 增 mode?(types.ts);useAppStore addUserMessage/beginAssistant 带 mode;
  useSendChat.send(text, mode) / chatStream body 带 mode(通知后端按 mode 回复)。
- MessageBubble 按 message.mode 分发到 components/messages/ 各形态渲染器
  (chat 气泡 / code 等宽代码块 / home 设备卡 / docs 文档卡 / work 任务卡 / vision 视觉卡)。
- ChatInput 顶部加「行为模式」chip 切换下一条消息的 mode(默认 chat);输入框上方显示当前模式。
- ModeRouter 收敛为只渲染 ChatShell;删除 9 个旧独立 mode 页面;Nav/TopBar 的 mode 改为
  「输入模式」语义;settings 归管理面板(design/10)。

同时补全上一轮 emoji→MD3 图标(约 23 文件):新增 Icon.tsx(MD3 SVG、IconName、零依赖、
离线优先),全部界面 emoji 替换为 <Icon name=... />;正文说明箭头保留。

npm run build 绿(tsc 0 错,79→71 模块,JS 284KB/gzip 86KB)。
This commit is contained in:
Aska committed 2026-09-06 13:32:44 +08:00
1 parent 265b207699
commit 4aab0f501a
28 files changed
+539 -950

No files matched your search

+7 -4
View File
@@ -5,6 +5,7 @@ import type {
BackthinkItem,
ChatMessage,
FlowGraph,
Mode,
ToolUsed,
WsStatus,
} from "../lib/types";
@@ -32,8 +33,8 @@ export interface AppStore {
setContext: (patch: Partial<ChatContext>) => void;
setMood: (mood: string | null) => void;
addUserMessage: (text: string) => void;
beginAssistant: () => string;
addUserMessage: (text: string, mode?: Mode) => void;
beginAssistant: (mode?: Mode) => string;
appendChunk: (delta: string) => void;
endStream: () => void;
setThinking: (text: string) => void;
@@ -76,7 +77,7 @@ export const useAppStore = create<AppStore>()(
set((s) => ({ context: { ...s.context, ...patch } })),
setMood: (mood) => set({ mood }),
addUserMessage: (text) =>
addUserMessage: (text, mode) =>
set((s) => ({
messages: [
...s.messages,
@@ -84,12 +85,13 @@ export const useAppStore = create<AppStore>()(
id: uid(),
role: "user",
content: text,
mode,
createdAt: now(),
},
],
})),
beginAssistant: () => {
beginAssistant: (mode) => {
const id = uid();
set((s) => ({
messages: [
@@ -98,6 +100,7 @@ export const useAppStore = create<AppStore>()(
id,
role: "assistant",
content: "",
mode,
streaming: true,
tools: [],
createdAt: now(),