From e023e5bc441965396732092fc3f55b710e2c7259 Mon Sep 17 00:00:00 2001 From: litongjava Date: Sun, 2 Feb 2025 15:10:15 -1000 Subject: [PATCH 1/4] change default theme to light --- ui/components/theme/Provider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/theme/Provider.tsx b/ui/components/theme/Provider.tsx index 43e2714..a02f08d 100644 --- a/ui/components/theme/Provider.tsx +++ b/ui/components/theme/Provider.tsx @@ -7,7 +7,7 @@ const ThemeProviderComponent = ({ children: React.ReactNode; }) => { return ( - + {children} ); From ee659d9e13fa193f8ec8b52ef5bccefddaef57bf Mon Sep 17 00:00:00 2001 From: litongjava Date: Sun, 2 Feb 2025 15:13:27 -1000 Subject: [PATCH 2/4] add mcId --- ui/components/ChatWindow.tsx | 63 +++++++++++++++++++++++++++--------- ui/lib/mcid.ts | 38 ++++++++++++++++++++++ 2 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 ui/lib/mcid.ts diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b26573f..f37375c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -1,17 +1,18 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; -import { Document } from '@langchain/core/documents'; +import {useEffect, useRef, useState} from 'react'; +import {Document} from '@langchain/core/documents'; import Navbar from './Navbar'; import Chat from './Chat'; import EmptyChat from './EmptyChat'; import crypto from 'crypto'; -import { toast } from 'sonner'; -import { useSearchParams } from 'next/navigation'; -import { getSuggestions } from '@/lib/actions'; -import { Settings } from 'lucide-react'; +import {toast} from 'sonner'; +import {useSearchParams} from 'next/navigation'; +import {getSuggestions} from '@/lib/actions'; +import {Settings} from 'lucide-react'; import SettingsDialog from './SettingsDialog'; import NextError from 'next/error'; +import {Mcid} from "@/lib/mcid"; export type Message = { messageId: string; @@ -140,7 +141,7 @@ const useSocket = ( if ( Object.keys(chatModelProviders).length > 0 && (((!openAIBaseURL || !openAIPIKey) && - chatModelProvider === 'custom_openai') || + chatModelProvider === 'custom_openai') || !chatModelProviders[chatModelProvider]) ) { const chatModelProvidersKeys = Object.keys(chatModelProviders); @@ -173,7 +174,7 @@ const useSocket = ( Object.keys(chatModelProviders[chatModelProvider]).length > 0 ? chatModelProvider : Object.keys(chatModelProviders)[0] - ], + ], )[0]; localStorage.setItem('chatModel', chatModel); } @@ -382,10 +383,10 @@ const loadMessages = async ( setIsMessagesLoaded(true); }; -const ChatWindow = ({ id }: { id?: string }) => { +const ChatWindow = ({id}: { id?: string }) => { const searchParams = useSearchParams(); const initialMessage = searchParams.get('q'); - + const [userId, setUserId] = useState(); const [chatId, setChatId] = useState(id); const [newChatCreated, setNewChatCreated] = useState(false); @@ -417,6 +418,36 @@ const ChatWindow = ({ id }: { id?: string }) => { const [isSettingsOpen, setIsSettingsOpen] = useState(false); + useEffect(() => { + const initializeUserId = () => { + try { + // 从 localStorage 读取现有用户 ID + const storedUserId = localStorage.getItem('userId'); + + if (storedUserId) { + setUserId(storedUserId); + console.debug('Using existing user ID:', storedUserId); + } else { + // 生成新的 MCID + const newUserId = new Mcid().generate().toString(); // 转换为字符串 + + // 存储到 localStorage + localStorage.setItem('userId', newUserId); + setUserId(newUserId); + console.debug('Generated new user ID:', newUserId); + } + } catch (error) { + console.error('Error initializing user ID:', error); + // 生成随机 ID 作为 fallback + const fallbackId = crypto.randomBytes(20).toString('hex'); + localStorage.setItem('userId', fallbackId); + setUserId(fallbackId); + } + }; + + initializeUserId(); + }, []); // 空依赖数组确保只运行一次 + useEffect(() => { if ( chatId && @@ -465,7 +496,7 @@ const ChatWindow = ({ id }: { id?: string }) => { } else { setIsReady(false); } - }, [isMessagesLoaded, isWSReady]); + }, [isMessagesLoaded, isWSReady, userId]); const sendMessage = async (message: string, messageId?: string) => { if (loading) return; @@ -556,7 +587,7 @@ const ChatWindow = ({ id }: { id?: string }) => { setMessages((prev) => prev.map((message) => { if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data }; + return {...message, content: message.content + data.data}; } return message; @@ -589,7 +620,7 @@ const ChatWindow = ({ id }: { id?: string }) => { setMessages((prev) => prev.map((msg) => { if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions }; + return {...msg, suggestions: suggestions}; } return msg; }), @@ -639,19 +670,19 @@ const ChatWindow = ({ id }: { id?: string }) => { Failed to connect to the server. Please try again later.

- + ); } return isReady ? ( notFound ? ( - + ) : (
{messages.length > 0 ? ( <> - + 255) { + throw new Error('Machine ID must be between 0 and 255'); + } + } + + generate(): number { + let now = Date.now(); + + if (now < this.lastTimestamp) { + throw new Error('Clock moved backwards'); + } + + if (now === this.lastTimestamp) { + this.sequence = (this.sequence + 1) & 0xf; + if (this.sequence === 0) { + while (now <= this.lastTimestamp) { + now = Date.now(); + } + } + } else { + this.sequence = 0; + } + + this.lastTimestamp = now; + + return ( + (now * 0x1000) + // 时间戳左移 12 位 + (this.machineId * 16) + // 机器 ID 左移 4 位 + this.sequence // 序列号 + ); + } +} From 1a8f59e92b4b0d20806e9aae3f4f8c934608ecbd Mon Sep 17 00:00:00 2001 From: litongjava Date: Sun, 2 Feb 2025 15:38:24 -1000 Subject: [PATCH 3/4] add userId --- ui/components/ChatWindow.tsx | 8 ++++++-- ui/components/EmptyChat.tsx | 6 ++++++ ui/components/EmptyChatMessageInput.tsx | 6 +++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index f37375c..2e0505c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -411,6 +411,7 @@ const ChatWindow = ({id}: { id?: string }) => { const [focusMode, setFocusMode] = useState('webSearch'); const [optimizationMode, setOptimizationMode] = useState('speed'); + const [copilotEnabled, setCopilotEnabled] = useState(true); const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); @@ -468,7 +469,7 @@ const ChatWindow = ({id}: { id?: string }) => { } else if (!chatId) { setNewChatCreated(true); setIsMessagesLoaded(true); - setChatId(crypto.randomBytes(20).toString('hex')); + setChatId(new Mcid().generate().toString()); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -512,11 +513,12 @@ const ChatWindow = ({id}: { id?: string }) => { let recievedMessage = ''; let added = false; - messageId = messageId ?? crypto.randomBytes(7).toString('hex'); + messageId = messageId ?? new Mcid().generate().toString(); ws.send( JSON.stringify({ type: 'message', + useerId:userId, message: { messageId: messageId, chatId: chatId!, @@ -699,6 +701,8 @@ const ChatWindow = ({id}: { id?: string }) => { void; focusMode: string; setFocusMode: (mode: string) => void; + copilotEnabled: boolean; + setCopilotEnabled: (enabled: boolean) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; fileIds: string[]; @@ -44,6 +48,8 @@ const EmptyChat = ({ sendMessage={sendMessage} focusMode={focusMode} setFocusMode={setFocusMode} + copilotEnabled={copilotEnabled} + setCopilotEnabled={setCopilotEnabled} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} fileIds={fileIds} diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 43d1e28..195b8d3 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -11,6 +11,8 @@ const EmptyChatMessageInput = ({ sendMessage, focusMode, setFocusMode, + copilotEnabled, + setCopilotEnabled, optimizationMode, setOptimizationMode, fileIds, @@ -23,12 +25,13 @@ const EmptyChatMessageInput = ({ setFocusMode: (mode: string) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; + copilotEnabled:boolean + setCopilotEnabled:(mode: boolean) => void; fileIds: string[]; setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; }) => { - const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const inputRef = useRef(null); @@ -94,6 +97,7 @@ const EmptyChatMessageInput = ({ />
+ Date: Sun, 2 Feb 2025 15:42:08 -1000 Subject: [PATCH 4/4] update fallbackId --- ui/components/ChatWindow.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 2e0505c..1be4ec5 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -429,25 +429,22 @@ const ChatWindow = ({id}: { id?: string }) => { setUserId(storedUserId); console.debug('Using existing user ID:', storedUserId); } else { - // 生成新的 MCID const newUserId = new Mcid().generate().toString(); // 转换为字符串 - // 存储到 localStorage localStorage.setItem('userId', newUserId); setUserId(newUserId); console.debug('Generated new user ID:', newUserId); } } catch (error) { console.error('Error initializing user ID:', error); - // 生成随机 ID 作为 fallback - const fallbackId = crypto.randomBytes(20).toString('hex'); + const fallbackId = "1234567890"; localStorage.setItem('userId', fallbackId); setUserId(fallbackId); } }; initializeUserId(); - }, []); // 空依赖数组确保只运行一次 + }, []); useEffect(() => { if (