- new emotion package: rule-based sentiment (positive/negative lexicon) drives mood transitions (开心/平静/难过) with 30min inactivity decay; affection 0-100 grows with positive interaction, with 初识→熟悉→信赖→ 羁绊 tiers - pipeline records each user message and injects a mood line into the system prompt so the persona's tone follows her mood - mood changes broadcast over WS; frontend shows a mood badge with affection tooltip; also handles the 'reminder' message type from the reminder scheduler - tests: sentiment scoring, mood shift, affection bounds, prompt line, onChange callback
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { create } from 'zustand'
|
|
import type { Message, IotDevice } from '../types/chat'
|
|
|
|
interface MoodState {
|
|
mood: string
|
|
intensity: number
|
|
affection: number
|
|
}
|
|
|
|
interface ChatState {
|
|
messages: Message[]
|
|
isStreaming: boolean
|
|
currentSessionId: string | null
|
|
iotDevices: IotDevice[]
|
|
inputText: string
|
|
mood: MoodState | null
|
|
|
|
setInput: (text: string) => void
|
|
setSessionId: (id: string) => void
|
|
setMessages: (msgs: Message[]) => void
|
|
setMood: (m: MoodState) => void
|
|
addMessage: (msg: Message) => void
|
|
appendToLast: (content: string) => void
|
|
setStreaming: (v: boolean) => void
|
|
setIotDevices: (d: IotDevice[]) => void
|
|
clearMessages: () => void
|
|
}
|
|
|
|
export const useChatStore = create<ChatState>((set, get) => ({
|
|
messages: [],
|
|
isStreaming: false,
|
|
currentSessionId: null,
|
|
iotDevices: [],
|
|
inputText: '',
|
|
mood: null,
|
|
|
|
setInput: (text) => set({ inputText: text }),
|
|
setSessionId: (id) => set({ currentSessionId: id }),
|
|
setMessages: (msgs) => set({ messages: msgs }),
|
|
setMood: (m) => set({ mood: m }),
|
|
setStreaming: (v) => set({ isStreaming: v }),
|
|
setIotDevices: (d) => set({ iotDevices: d }),
|
|
|
|
addMessage: (msg) => set((s) => ({ messages: [...s.messages, msg] })),
|
|
appendToLast: (content) => {
|
|
const msgs = [...get().messages]
|
|
if (msgs.length > 0) {
|
|
msgs[msgs.length - 1] = { ...msgs[msgs.length - 1], content: msgs[msgs.length - 1].content + content }
|
|
}
|
|
set({ messages: msgs })
|
|
},
|
|
clearMessages: () => set({ messages: [] }),
|
|
}))
|