mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-11-22 13:08:14 +00:00
Compare commits
8 Commits
feat/syste
...
4b2aa0b2ad
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b2aa0b2ad | ||
|
|
78878313da | ||
|
|
203ab6215b | ||
|
|
80231c61fd | ||
|
|
f2daa4a842 | ||
|
|
258b233251 | ||
|
|
cd1b4de5e8 | ||
|
|
4d2b1c6d11 |
13
src/app.ts
13
src/app.ts
@@ -29,10 +29,17 @@ server.listen(port, () => {
|
|||||||
|
|
||||||
startWebSocketServer(server);
|
startWebSocketServer(server);
|
||||||
|
|
||||||
process.on('uncaughtException', (err, origin) => {
|
process.on('uncaughtException', (error) => {
|
||||||
logger.error(`Uncaught Exception at ${origin}: ${err}`);
|
console.error('Uncaught Exception:', error);
|
||||||
|
console.error(error.stack);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on('unhandledRejection', (reason, promise) => {
|
process.on('unhandledRejection', (reason, promise) => {
|
||||||
logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`);
|
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
||||||
|
|
||||||
|
if (reason instanceof Error) {
|
||||||
|
console.error(reason.stack);
|
||||||
|
} else {
|
||||||
|
console.error(reason);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ const Chat = ({
|
|||||||
loading,
|
loading,
|
||||||
messages,
|
messages,
|
||||||
sendMessage,
|
sendMessage,
|
||||||
|
copilotEnabled,
|
||||||
|
setCopilotEnabled,
|
||||||
messageAppeared,
|
messageAppeared,
|
||||||
rewrite,
|
rewrite,
|
||||||
fileIds,
|
fileIds,
|
||||||
@@ -18,6 +20,8 @@ const Chat = ({
|
|||||||
setFiles,
|
setFiles,
|
||||||
}: {
|
}: {
|
||||||
messages: Message[];
|
messages: Message[];
|
||||||
|
copilotEnabled: boolean;
|
||||||
|
setCopilotEnabled: (enable: boolean) => void;
|
||||||
sendMessage: (message: string) => void;
|
sendMessage: (message: string) => void;
|
||||||
loading: boolean;
|
loading: boolean;
|
||||||
messageAppeared: boolean;
|
messageAppeared: boolean;
|
||||||
@@ -89,6 +93,8 @@ const Chat = ({
|
|||||||
<MessageInput
|
<MessageInput
|
||||||
loading={loading}
|
loading={loading}
|
||||||
sendMessage={sendMessage}
|
sendMessage={sendMessage}
|
||||||
|
copilotEnabled={copilotEnabled}
|
||||||
|
setCopilotEnabled={setCopilotEnabled}
|
||||||
fileIds={fileIds}
|
fileIds={fileIds}
|
||||||
setFileIds={setFileIds}
|
setFileIds={setFileIds}
|
||||||
files={files}
|
files={files}
|
||||||
|
|||||||
@@ -256,12 +256,14 @@ const useSocket = (
|
|||||||
});
|
});
|
||||||
|
|
||||||
ws.onerror = () => {
|
ws.onerror = () => {
|
||||||
|
debugger
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
setIsWSReady(false);
|
setIsWSReady(false);
|
||||||
toast.error('WebSocket connection error.');
|
toast.error('WebSocket connection error.');
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onclose = () => {
|
ws.onclose = () => {
|
||||||
|
debugger
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
setIsWSReady(false);
|
setIsWSReady(false);
|
||||||
console.debug(new Date(), 'ws:disconnected');
|
console.debug(new Date(), 'ws:disconnected');
|
||||||
@@ -277,16 +279,19 @@ const useSocket = (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const attemptReconnect = () => {
|
const attemptReconnect = async () => {
|
||||||
retryCountRef.current += 1;
|
retryCountRef.current += 1;
|
||||||
|
|
||||||
if (retryCountRef.current > MAX_RETRIES) {
|
if (retryCountRef.current > MAX_RETRIES) {
|
||||||
console.debug(new Date(), 'ws:max_retries');
|
console.debug(new Date(), 'ws:max_retries');
|
||||||
setError(true);
|
//setError(true);
|
||||||
toast.error(
|
|
||||||
'Unable to connect to server after multiple attempts. Please refresh the page to try again.',
|
// toast.error(
|
||||||
);
|
// 'Unable to connect to server after multiple attempts. Please refresh the page to try again.',
|
||||||
return;
|
// );
|
||||||
|
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||||
|
//return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const backoffDelay = getBackoffDelay(retryCountRef.current);
|
const backoffDelay = getBackoffDelay(retryCountRef.current);
|
||||||
@@ -409,6 +414,7 @@ const ChatWindow = ({ id }: { id?: string }) => {
|
|||||||
const [fileIds, setFileIds] = useState<string[]>([]);
|
const [fileIds, setFileIds] = useState<string[]>([]);
|
||||||
|
|
||||||
const [focusMode, setFocusMode] = useState('webSearch');
|
const [focusMode, setFocusMode] = useState('webSearch');
|
||||||
|
const [copilotEnabled, setCopilotEnabled] = useState(true);
|
||||||
const [optimizationMode, setOptimizationMode] = useState('speed');
|
const [optimizationMode, setOptimizationMode] = useState('speed');
|
||||||
|
|
||||||
const [isMessagesLoaded, setIsMessagesLoaded] = useState(false);
|
const [isMessagesLoaded, setIsMessagesLoaded] = useState(false);
|
||||||
@@ -493,8 +499,9 @@ const ChatWindow = ({ id }: { id?: string }) => {
|
|||||||
},
|
},
|
||||||
files: fileIds,
|
files: fileIds,
|
||||||
focusMode: focusMode,
|
focusMode: focusMode,
|
||||||
|
copilotEnabled:copilotEnabled,
|
||||||
optimizationMode: optimizationMode,
|
optimizationMode: optimizationMode,
|
||||||
history: [...chatHistory, ['human', message]],
|
history: [...chatHistory],
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -656,6 +663,8 @@ const ChatWindow = ({ id }: { id?: string }) => {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
messages={messages}
|
messages={messages}
|
||||||
sendMessage={sendMessage}
|
sendMessage={sendMessage}
|
||||||
|
copilotEnabled={copilotEnabled}
|
||||||
|
setCopilotEnabled={setCopilotEnabled}
|
||||||
messageAppeared={messageAppeared}
|
messageAppeared={messageAppeared}
|
||||||
rewrite={rewrite}
|
rewrite={rewrite}
|
||||||
fileIds={fileIds}
|
fileIds={fileIds}
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
import { cn } from '@/lib/utils';
|
import {cn} from '@/lib/utils';
|
||||||
import { ArrowUp } from 'lucide-react';
|
import {ArrowUp} from 'lucide-react';
|
||||||
import { useEffect, useRef, useState } from 'react';
|
import {useEffect, useRef, useState} from 'react';
|
||||||
import TextareaAutosize from 'react-textarea-autosize';
|
import TextareaAutosize from 'react-textarea-autosize';
|
||||||
import Attach from './MessageInputActions/Attach';
|
|
||||||
import CopilotToggle from './MessageInputActions/Copilot';
|
import CopilotToggle from './MessageInputActions/Copilot';
|
||||||
import { File } from './ChatWindow';
|
import {File} from './ChatWindow';
|
||||||
import AttachSmall from './MessageInputActions/AttachSmall';
|
import AttachSmall from './MessageInputActions/AttachSmall';
|
||||||
|
|
||||||
const MessageInput = ({
|
const MessageInput = ({
|
||||||
sendMessage,
|
sendMessage,
|
||||||
|
copilotEnabled,
|
||||||
|
setCopilotEnabled,
|
||||||
loading,
|
loading,
|
||||||
fileIds,
|
fileIds,
|
||||||
setFileIds,
|
setFileIds,
|
||||||
@@ -16,13 +17,14 @@ const MessageInput = ({
|
|||||||
setFiles,
|
setFiles,
|
||||||
}: {
|
}: {
|
||||||
sendMessage: (message: string) => void;
|
sendMessage: (message: string) => void;
|
||||||
|
copilotEnabled: boolean;
|
||||||
|
setCopilotEnabled: (enable: boolean) => void;
|
||||||
loading: boolean;
|
loading: boolean;
|
||||||
fileIds: string[];
|
fileIds: string[];
|
||||||
setFileIds: (fileIds: string[]) => void;
|
setFileIds: (fileIds: string[]) => void;
|
||||||
files: File[];
|
files: File[];
|
||||||
setFiles: (files: File[]) => void;
|
setFiles: (files: File[]) => void;
|
||||||
}) => {
|
}) => {
|
||||||
const [copilotEnabled, setCopilotEnabled] = useState(false);
|
|
||||||
const [message, setMessage] = useState('');
|
const [message, setMessage] = useState('');
|
||||||
const [textareaRows, setTextareaRows] = useState(1);
|
const [textareaRows, setTextareaRows] = useState(1);
|
||||||
const [mode, setMode] = useState<'multi' | 'single'>('single');
|
const [mode, setMode] = useState<'multi' | 'single'>('single');
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ const focusModes = [
|
|||||||
icon: (
|
icon: (
|
||||||
<SiYoutube
|
<SiYoutube
|
||||||
className="h-5 w-auto mr-0.5"
|
className="h-5 w-auto mr-0.5"
|
||||||
onPointerEnterCapture={undefined}
|
onPointerEnter={undefined}
|
||||||
onPointerLeaveCapture={undefined}
|
onPointerLeave={undefined}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -60,8 +60,8 @@ const focusModes = [
|
|||||||
icon: (
|
icon: (
|
||||||
<SiReddit
|
<SiReddit
|
||||||
className="h-5 w-auto mr-0.5"
|
className="h-5 w-auto mr-0.5"
|
||||||
onPointerEnterCapture={undefined}
|
onPointerEnter={undefined}
|
||||||
onPointerLeaveCapture={undefined}
|
onPointerLeave={undefined}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/react": "^2.2.0",
|
"@headlessui/react": "^2.2.0",
|
||||||
"@icons-pack/react-simple-icons": "^9.4.0",
|
"@icons-pack/react-simple-icons": "^9.4.0",
|
||||||
|
"@langchain/core": "^0.3.22",
|
||||||
"@langchain/openai": "^0.0.25",
|
"@langchain/openai": "^0.0.25",
|
||||||
"@tailwindcss/typography": "^0.5.12",
|
"@tailwindcss/typography": "^0.5.12",
|
||||||
"clsx": "^2.1.0",
|
"clsx": "^2.1.0",
|
||||||
|
|||||||
4835
ui/pnpm-lock.yaml
generated
Normal file
4835
ui/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
3449
ui/yarn.lock
3449
ui/yarn.lock
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user