khronoz commited on
Commit
f687f22
·
1 Parent(s): 46f8ac0

Update Header to be Mobile Responsive

Browse files
backend/poetry.lock CHANGED
@@ -109,20 +109,6 @@ files = [
109
  [package.dependencies]
110
  frozenlist = ">=1.1.0"
111
 
112
- [[package]]
113
- name = "aiostream"
114
- version = "0.5.2"
115
- description = "Generator-based operators for asynchronous iteration"
116
- optional = false
117
- python-versions = ">=3.8"
118
- files = [
119
- {file = "aiostream-0.5.2-py3-none-any.whl", hash = "sha256:054660370be9d37f6fe3ece3851009240416bd082e469fd90cc8673d3818cf71"},
120
- {file = "aiostream-0.5.2.tar.gz", hash = "sha256:b71b519a2d66c38f0872403ab86417955b77352f08d9ad02ad46fc3926b389f4"},
121
- ]
122
-
123
- [package.dependencies]
124
- typing-extensions = "*"
125
-
126
  [[package]]
127
  name = "annotated-types"
128
  version = "0.6.0"
@@ -799,20 +785,19 @@ test = ["httpx (>=0.24.1)", "pytest (>=7.4.0)"]
799
 
800
  [[package]]
801
  name = "llama-index"
802
- version = "0.9.4"
803
  description = "Interface between LLMs and your data"
804
  optional = false
805
- python-versions = ">=3.8.1,<3.12"
806
  files = [
807
- {file = "llama_index-0.9.4-py3-none-any.whl", hash = "sha256:c3250dd15f23e24b61db046c762b6f86420164a7d02f28dd693eea828e3f9786"},
808
- {file = "llama_index-0.9.4.tar.gz", hash = "sha256:79823e99d6a874019670ad057da1428ac620a4ce45b58b234aa483f40c537d10"},
809
  ]
810
 
811
  [package.dependencies]
812
  aiohttp = ">=3.8.6,<4.0.0"
813
- aiostream = ">=0.5.2,<0.6.0"
814
  beautifulsoup4 = ">=4.12.2,<5.0.0"
815
- dataclasses-json = ">=0.5.7,<0.6.0"
816
  deprecated = ">=1.2.9.3"
817
  fsspec = ">=2023.5.0"
818
  httpx = "*"
@@ -820,19 +805,20 @@ nest-asyncio = ">=1.5.8,<2.0.0"
820
  nltk = ">=3.8.1,<4.0.0"
821
  numpy = "*"
822
  openai = ">=1.1.0"
823
- pandas = {version = "*", extras = ["jinja2"]}
 
824
  SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]}
825
  tenacity = ">=8.2.0,<9.0.0"
826
  tiktoken = ">=0.3.3"
827
  typing-extensions = ">=4.5.0"
828
  typing-inspect = ">=0.8.0"
829
- urllib3 = "<2"
830
 
831
  [package.extras]
 
832
  langchain = ["langchain (>=0.0.303)"]
833
  local-models = ["optimum[onnxruntime] (>=1.13.2,<2.0.0)", "sentencepiece (>=0.1.99,<0.2.0)", "transformers[torch] (>=4.34.0,<5.0.0)"]
834
  postgres = ["asyncpg (>=0.28.0,<0.29.0)", "pgvector (>=0.1.0,<0.2.0)", "psycopg-binary (>=3.1.12,<4.0.0)"]
835
- query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "lm-format-enforcer (>=0.4.3,<0.5.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "scikit-learn (<1.3.0)", "spacy (>=3.7.1,<4.0.0)"]
836
 
837
  [[package]]
838
  name = "markupsafe"
@@ -2794,4 +2780,4 @@ multidict = ">=4.0"
2794
  [metadata]
2795
  lock-version = "2.0"
2796
  python-versions = "^3.11,<3.12"
2797
- content-hash = "70e9e6888a129526bdc06eca1afbb2be0a2f48687efa8a841445e650c316e922"
 
109
  [package.dependencies]
110
  frozenlist = ">=1.1.0"
111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  [[package]]
113
  name = "annotated-types"
114
  version = "0.6.0"
 
785
 
786
  [[package]]
787
  name = "llama-index"
788
+ version = "0.9.22"
789
  description = "Interface between LLMs and your data"
790
  optional = false
791
+ python-versions = ">=3.8.1,<4.0"
792
  files = [
793
+ {file = "llama_index-0.9.22-py3-none-any.whl", hash = "sha256:8731b2137decfae9f56a2837f3791d8e4ce434a9ec9d6d74d6dafb2d736f05f7"},
794
+ {file = "llama_index-0.9.22.tar.gz", hash = "sha256:7eecb62106398f9c5b1c04e79fee82a1004c26387055335c23a8f33833c8afff"},
795
  ]
796
 
797
  [package.dependencies]
798
  aiohttp = ">=3.8.6,<4.0.0"
 
799
  beautifulsoup4 = ">=4.12.2,<5.0.0"
800
+ dataclasses-json = "*"
801
  deprecated = ">=1.2.9.3"
802
  fsspec = ">=2023.5.0"
803
  httpx = "*"
 
805
  nltk = ">=3.8.1,<4.0.0"
806
  numpy = "*"
807
  openai = ">=1.1.0"
808
+ pandas = "*"
809
+ requests = ">=2.31.0"
810
  SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]}
811
  tenacity = ">=8.2.0,<9.0.0"
812
  tiktoken = ">=0.3.3"
813
  typing-extensions = ">=4.5.0"
814
  typing-inspect = ">=0.8.0"
 
815
 
816
  [package.extras]
817
+ gradientai = ["gradientai (>=1.4.0)"]
818
  langchain = ["langchain (>=0.0.303)"]
819
  local-models = ["optimum[onnxruntime] (>=1.13.2,<2.0.0)", "sentencepiece (>=0.1.99,<0.2.0)", "transformers[torch] (>=4.34.0,<5.0.0)"]
820
  postgres = ["asyncpg (>=0.28.0,<0.29.0)", "pgvector (>=0.1.0,<0.2.0)", "psycopg-binary (>=3.1.12,<4.0.0)"]
821
+ query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "lm-format-enforcer (>=0.4.3,<0.5.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "scikit-learn", "spacy (>=3.7.1,<4.0.0)"]
822
 
823
  [[package]]
824
  name = "markupsafe"
 
2780
  [metadata]
2781
  lock-version = "2.0"
2782
  python-versions = "^3.11,<3.12"
2783
+ content-hash = "5d6afd898b5a1c9f177f523fecff666723292db0858f92516d0346a43f01890d"
backend/pyproject.toml CHANGED
@@ -10,13 +10,13 @@ packages = [{include = "backend"}]
10
  python = "^3.11,<3.12"
11
  fastapi = "^0.104.1"
12
  uvicorn = { extras = ["standard"], version = "^0.23.2" }
13
- llama-index = "^0.9.4"
14
  pypdf = "^3.17.0"
15
  python-dotenv = "^1.0.0"
16
  llama-cpp-python = "^0.2.18"
17
  transformers = "^4.35.2"
18
- # torch = "^2.1.1" # For CPU version both Windows and Linux
19
- torch = { url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp311-cp311-win_amd64.whl"} # For Windows with Cuda 12.1
20
  # torch = { url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp311-cp311-linux_x86_64.whl"} # For Linux with Cuda 12.1
21
  docx2txt = "^0.8"
22
 
 
10
  python = "^3.11,<3.12"
11
  fastapi = "^0.104.1"
12
  uvicorn = { extras = ["standard"], version = "^0.23.2" }
13
+ llama-index = "^0.9.22"
14
  pypdf = "^3.17.0"
15
  python-dotenv = "^1.0.0"
16
  llama-cpp-python = "^0.2.18"
17
  transformers = "^4.35.2"
18
+ torch = "^2.1.1" # For CPU version both Windows and Linux
19
+ # torch = { url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp311-cp311-win_amd64.whl"} # For Windows with Cuda 12.1
20
  # torch = { url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp311-cp311-linux_x86_64.whl"} # For Linux with Cuda 12.1
21
  docx2txt = "^0.8"
22
 
frontend/app/components/header.tsx CHANGED
@@ -2,28 +2,127 @@
2
 
3
  import Link from 'next/link';
4
  import Image from 'next/image';
5
- import { Home, InfoIcon, MessageCircle, Search } from 'lucide-react';
6
  import { usePathname } from 'next/navigation';
7
  import { useTheme } from "next-themes";
8
- import { useEffect, useState } from "react";
 
9
  import logo from '../../public/smart-retrieval-logo.webp'
10
 
11
  interface NavLinkProps {
12
  href: string;
13
  children: React.ReactNode;
 
14
  }
15
 
16
- const NavLink: React.FC<NavLinkProps> = ({ href, children }) => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  // Use the useRouter hook to get information about the current route
18
  const pathname = usePathname();
19
 
20
  // Determine if the current tab is active
21
  const isActive = pathname === href;
22
 
 
 
 
 
 
 
23
  return (
24
  <Link href={href} passHref>
25
  {/* Add a class to highlight the active tab */}
26
- <div className={`flex items-center font-bold ${isActive ? 'text-blue-500' : ''}`}>
27
  {children}
28
  </div>
29
  </Link>
@@ -31,6 +130,7 @@ const NavLink: React.FC<NavLinkProps> = ({ href, children }) => {
31
  };
32
 
33
  export default function Header() {
 
34
  const [mounted, setMounted] = useState(false);
35
  const { theme, setTheme } = useTheme();
36
 
@@ -38,6 +138,19 @@ export default function Header() {
38
  setMounted(true);
39
  }, []);
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  if (!mounted) return null;
42
 
43
  return (
@@ -45,24 +158,40 @@ export default function Header() {
45
  {/* Navigation Bar */}
46
  <nav className="fixed left-0 top-0 w-full bg-gradient-to-b from-zinc-200 pb-2 pt-2 backdrop-blur-2xl dark:border-neutral-700 dark:bg-zinc-700/30 dark:from-inherit lg:static lg:w-auto lg:rounded-xl lg:border lg:bg-gray-100 lg:p-4 lg:dark:bg-zinc-800/30 shadow-xl">
47
  <div className="flex items-center flex-wrap lg:flex-nowrap px-4">
48
- <div className="flex items-center" style={{ width: '6%', height: 'auto' }}>
49
- <Image
50
- className='rounded-full max-w-full'
51
- src={logo}
52
- alt="Logo"
53
- style={{
54
- width: 'auto',
55
- height: 'auto',
56
- }}
57
- priority
58
- sizes="100vw, 50vw, 33vw"
59
- />
60
- </div>
 
 
61
  <div className="flex items-center pr-2 pl-2 gap-2">
62
  <span className="hidden lg:inline lg:text-lg font-nunito font-bold">Smart Retrieval</span>
63
  <span className="hidden lg:inline lg:text-lg font-nunito">|</span>
64
  </div>
65
- <div className="flex items-center gap-4">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  <NavLink href="/">
67
  <div className="flex items-center transition duration-300 ease-in-out transform hover:scale-125">
68
  <Home className="mr-1 h-4 w-4" />
@@ -81,6 +210,12 @@ export default function Header() {
81
  Chat
82
  </div>
83
  </NavLink>
 
 
 
 
 
 
84
  <NavLink href="/search">
85
  <div className="flex items-center transition duration-300 ease-in-out transform hover:scale-125">
86
  <Search className="mr-1 h-4 w-4" />
 
2
 
3
  import Link from 'next/link';
4
  import Image from 'next/image';
5
+ import { Home, InfoIcon, MessageCircle, Search, FileQuestion, Menu } from 'lucide-react';
6
  import { usePathname } from 'next/navigation';
7
  import { useTheme } from "next-themes";
8
+ import { useEffect, useState, useRef } from "react";
9
+ import { useMedia } from 'react-use';
10
  import logo from '../../public/smart-retrieval-logo.webp'
11
 
12
  interface NavLinkProps {
13
  href: string;
14
  children: React.ReactNode;
15
+ onClick?: () => void; // Include onClick as an optional prop
16
  }
17
 
18
+ interface MobileMenuProps {
19
+ isOpen: boolean;
20
+ onClose: () => void;
21
+ }
22
+
23
+ const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose }) => {
24
+ const isLargeScreen = useMedia('(min-width: 1024px)');
25
+ const menuRef = useRef<HTMLDivElement | null>(null);
26
+
27
+ useEffect(() => {
28
+ const handleOutsideClick = (event: MouseEvent | TouchEvent) => {
29
+ if (
30
+ !isLargeScreen &&
31
+ isOpen &&
32
+ !menuRef.current?.contains(event.target as Node) &&
33
+ !((event.target as HTMLElement).closest('.toggle-button')) // Exclude the toggle button
34
+ ) {
35
+ onClose(); // Close the menu
36
+ }
37
+ };
38
+
39
+ if (!isLargeScreen && isOpen) {
40
+ // Add event listeners for both mouse and touch events
41
+ document.addEventListener('mousedown', handleOutsideClick);
42
+ }
43
+
44
+ return () => {
45
+ // Remove the event listener when the component unmounts
46
+ document.removeEventListener('mousedown', handleOutsideClick);
47
+ };
48
+ }, [isLargeScreen, isOpen, onClose]);
49
+
50
+ useEffect(() => {
51
+ if (isLargeScreen && isOpen) {
52
+ onClose();
53
+ }
54
+ }, [isLargeScreen, isOpen, onClose]);
55
+ return (
56
+ <div ref={menuRef} className={`w-full h-full p-2 bg-opacity-80 ${isOpen ? 'flex' : 'hidden'}`}>
57
+ <div className="flex items-center justify-center mt-2" style={{ width: '9%', height: '9%' }}>
58
+ <Image
59
+ className='rounded-full max-w-full'
60
+ src={logo}
61
+ alt="Logo"
62
+ style={{
63
+ width: 'auto',
64
+ height: 'auto',
65
+ }}
66
+ priority
67
+ sizes="100vw, 50vw, 33vw"
68
+ />
69
+ </div>
70
+ <div className="flex items-center justify-center h-full">
71
+ {/* Mobile menu content */}
72
+ <div className="w-64 p-4 rounded-r-md">
73
+ <NavLink href="/" onClick={onClose}>
74
+ <div className="flex items-center mb-4">
75
+ <Home className="mr-2 h-5 w-5" />
76
+ Home
77
+ </div>
78
+ </NavLink>
79
+ <NavLink href="/about" onClick={onClose}>
80
+ <div className="flex items-center mb-4">
81
+ <InfoIcon className="mr-2 h-5 w-5" />
82
+ About
83
+ </div>
84
+ </NavLink>
85
+ <NavLink href="/chat" onClick={onClose}>
86
+ <div className="flex items-center mb-4">
87
+ <MessageCircle className="mr-2 h-5 w-5" />
88
+ Chat
89
+ </div>
90
+ </NavLink>
91
+ <NavLink href="/query" onClick={onClose}>
92
+ <div className="flex items-center mb-4">
93
+ <FileQuestion className="mr-2 h-5 w-5" />
94
+ Query
95
+ </div>
96
+ </NavLink>
97
+ <NavLink href="/search" onClick={onClose}>
98
+ <div className="flex items-center">
99
+ <Search className="mr-2 h-5 w-5" />
100
+ Search
101
+ </div>
102
+ </NavLink>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ );
107
+ };
108
+
109
+ const NavLink: React.FC<NavLinkProps> = ({ href, children, onClick }) => {
110
  // Use the useRouter hook to get information about the current route
111
  const pathname = usePathname();
112
 
113
  // Determine if the current tab is active
114
  const isActive = pathname === href;
115
 
116
+ const handleClick = () => {
117
+ if (onClick) {
118
+ onClick(); // Call the onClick handler if provided
119
+ }
120
+ };
121
+
122
  return (
123
  <Link href={href} passHref>
124
  {/* Add a class to highlight the active tab */}
125
+ <div className={`flex items-center font-bold ${isActive ? 'text-blue-500' : ''}`} onClick={handleClick}>
126
  {children}
127
  </div>
128
  </Link>
 
130
  };
131
 
132
  export default function Header() {
133
+ const isLargeScreen = useMedia('(min-width: 1024px)');
134
  const [mounted, setMounted] = useState(false);
135
  const { theme, setTheme } = useTheme();
136
 
 
138
  setMounted(true);
139
  }, []);
140
 
141
+ const [isMobileMenuOpen, setMobileMenuOpen] = useState(false);
142
+
143
+ const toggleMobileMenu = () => {
144
+ // Handle the toggle click here
145
+ if (isMobileMenuOpen) {
146
+ // If the menu is open, close it
147
+ setMobileMenuOpen(false);
148
+ } else {
149
+ // If the menu is closed, open it
150
+ setMobileMenuOpen(true);
151
+ }
152
+ };
153
+
154
  if (!mounted) return null;
155
 
156
  return (
 
158
  {/* Navigation Bar */}
159
  <nav className="fixed left-0 top-0 w-full bg-gradient-to-b from-zinc-200 pb-2 pt-2 backdrop-blur-2xl dark:border-neutral-700 dark:bg-zinc-700/30 dark:from-inherit lg:static lg:w-auto lg:rounded-xl lg:border lg:bg-gray-100 lg:p-4 lg:dark:bg-zinc-800/30 shadow-xl">
160
  <div className="flex items-center flex-wrap lg:flex-nowrap px-4">
161
+ {isLargeScreen && (
162
+ <div className="flex items-center" style={{ width: '6%', height: 'auto' }}>
163
+ <Image
164
+ className='rounded-full max-w-full'
165
+ src={logo}
166
+ alt="Logo"
167
+ style={{
168
+ width: 'auto',
169
+ height: 'auto',
170
+ }}
171
+ priority
172
+ sizes="100vw, 50vw, 33vw"
173
+ />
174
+ </div>
175
+ )}
176
  <div className="flex items-center pr-2 pl-2 gap-2">
177
  <span className="hidden lg:inline lg:text-lg font-nunito font-bold">Smart Retrieval</span>
178
  <span className="hidden lg:inline lg:text-lg font-nunito">|</span>
179
  </div>
180
+ <div className="flex items-center gap-4 lg:hidden">
181
+ {/* Toggle button for mobile menu */}
182
+ <button
183
+ className="flex items-center text-xl transition duration-300 ease-in-out transform hover:scale-125 toggle-button"
184
+ title="Toggle mobile menu"
185
+ onClick={toggleMobileMenu}
186
+ >
187
+ <span role="img" aria-label="menu icon">
188
+ <Menu />
189
+ </span>
190
+ </button>
191
+ </div>
192
+ {/* Mobile menu component */}
193
+ <MobileMenu isOpen={isMobileMenuOpen} onClose={() => setMobileMenuOpen(false)} />
194
+ <div className={`hidden items-center gap-4 lg:flex`}>
195
  <NavLink href="/">
196
  <div className="flex items-center transition duration-300 ease-in-out transform hover:scale-125">
197
  <Home className="mr-1 h-4 w-4" />
 
210
  Chat
211
  </div>
212
  </NavLink>
213
+ <NavLink href="/query">
214
+ <div className="flex items-center transition duration-300 ease-in-out transform hover:scale-125">
215
+ <FileQuestion className="mr-1 h-4 w-4" />
216
+ Query
217
+ </div>
218
+ </NavLink>
219
  <NavLink href="/search">
220
  <div className="flex items-center transition duration-300 ease-in-out transform hover:scale-125">
221
  <Search className="mr-1 h-4 w-4" />
frontend/package-lock.json CHANGED
@@ -14,7 +14,7 @@
14
  "axios": "^1.6.2",
15
  "class-variance-authority": "^0.7",
16
  "llamaindex": "0.0.35",
17
- "lucide-react": "^0.291",
18
  "next": "^13",
19
  "next-auth": "^4.24.5",
20
  "next-themes": "^0.2.1",
@@ -23,6 +23,7 @@
23
  "react-dom": "^18",
24
  "react-markdown": "^8.0.7",
25
  "react-syntax-highlighter": "^15.5.0",
 
26
  "remark": "^14.0.3",
27
  "remark-code-import": "^1.2.0",
28
  "remark-gfm": "^3.0.1",
@@ -2785,6 +2786,11 @@
2785
  "@types/unist": "^2"
2786
  }
2787
  },
 
 
 
 
 
2788
  "node_modules/@types/katex": {
2789
  "version": "0.16.6",
2790
  "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.6.tgz",
@@ -3036,6 +3042,11 @@
3036
  "node": ">=10.0.0"
3037
  }
3038
  },
 
 
 
 
 
3039
  "node_modules/abort-controller": {
3040
  "version": "3.0.0",
3041
  "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -3604,6 +3615,14 @@
3604
  "node": ">= 0.6"
3605
  }
3606
  },
 
 
 
 
 
 
 
 
3607
  "node_modules/core-util-is": {
3608
  "version": "1.0.3",
3609
  "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -3617,6 +3636,14 @@
3617
  "node": "*"
3618
  }
3619
  },
 
 
 
 
 
 
 
 
3620
  "node_modules/css-tree": {
3621
  "version": "2.3.1",
3622
  "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
@@ -3750,6 +3777,14 @@
3750
  "integrity": "sha512-qMa+E6yf1fNQbg3G66pHLXeJUP5CCCzNat1VPczOZOqgI2w4u+8y9sQnswMdGs5m4C1rOePq37EVBr/nsPQY7w==",
3751
  "dev": true
3752
  },
 
 
 
 
 
 
 
 
3753
  "node_modules/es6-promise": {
3754
  "version": "4.2.8",
3755
  "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
@@ -3805,6 +3840,11 @@
3805
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
3806
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
3807
  },
 
 
 
 
 
3808
  "node_modules/fast-glob": {
3809
  "version": "3.3.2",
3810
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -3831,6 +3871,21 @@
3831
  "node": ">= 6"
3832
  }
3833
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3834
  "node_modules/fastq": {
3835
  "version": "1.15.0",
3836
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -4181,6 +4236,11 @@
4181
  "ms": "^2.0.0"
4182
  }
4183
  },
 
 
 
 
 
4184
  "node_modules/ieee754": {
4185
  "version": "1.2.1",
4186
  "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -4224,6 +4284,15 @@
4224
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
4225
  "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
4226
  },
 
 
 
 
 
 
 
 
 
4227
  "node_modules/intl-messageformat": {
4228
  "version": "10.5.8",
4229
  "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.8.tgz",
@@ -4383,6 +4452,11 @@
4383
  "url": "https://github.com/sponsors/panva"
4384
  }
4385
  },
 
 
 
 
 
4386
  "node_modules/js-tiktoken": {
4387
  "version": "1.0.8",
4388
  "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.8.tgz",
@@ -5599,6 +5673,50 @@
5599
  "thenify-all": "^1.0.0"
5600
  }
5601
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5602
  "node_modules/nanoid": {
5603
  "version": "3.3.6",
5604
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -6459,6 +6577,40 @@
6459
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
6460
  }
6461
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6462
  "node_modules/read-cache": {
6463
  "version": "1.0.0",
6464
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -6631,6 +6783,11 @@
6631
  "yarn": ">=1.7.0"
6632
  }
6633
  },
 
 
 
 
 
6634
  "node_modules/resolve": {
6635
  "version": "1.22.8",
6636
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -6661,6 +6818,14 @@
6661
  "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
6662
  "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
6663
  },
 
 
 
 
 
 
 
 
6664
  "node_modules/run-parallel": {
6665
  "version": "1.2.0",
6666
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -6707,6 +6872,17 @@
6707
  "loose-envify": "^1.1.0"
6708
  }
6709
  },
 
 
 
 
 
 
 
 
 
 
 
6710
  "node_modules/scroll-into-view-if-needed": {
6711
  "version": "3.0.10",
6712
  "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz",
@@ -6724,6 +6900,14 @@
6724
  "node": ">=10"
6725
  }
6726
  },
 
 
 
 
 
 
 
 
6727
  "node_modules/setimmediate": {
6728
  "version": "1.0.5",
6729
  "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -6759,6 +6943,14 @@
6759
  "swr-store": "^0.10"
6760
  }
6761
  },
 
 
 
 
 
 
 
 
6762
  "node_modules/source-map-js": {
6763
  "version": "1.0.2",
6764
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -6800,6 +6992,38 @@
6800
  "svelte": "^4.0.0"
6801
  }
6802
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6803
  "node_modules/streamsearch": {
6804
  "version": "1.1.0",
6805
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -6905,6 +7129,11 @@
6905
  }
6906
  }
6907
  },
 
 
 
 
 
6908
  "node_modules/sucrase": {
6909
  "version": "3.34.0",
6910
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
@@ -7109,6 +7338,14 @@
7109
  "node": ">=0.8"
7110
  }
7111
  },
 
 
 
 
 
 
 
 
7112
  "node_modules/tiny-invariant": {
7113
  "version": "1.3.1",
7114
  "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
@@ -7208,6 +7445,11 @@
7208
  "url": "https://opencollective.com/unified"
7209
  }
7210
  },
 
 
 
 
 
7211
  "node_modules/tr46": {
7212
  "version": "4.1.1",
7213
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
@@ -7237,6 +7479,11 @@
7237
  "url": "https://github.com/sponsors/wooorm"
7238
  }
7239
  },
 
 
 
 
 
7240
  "node_modules/ts-interface-checker": {
7241
  "version": "0.1.13",
7242
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
 
14
  "axios": "^1.6.2",
15
  "class-variance-authority": "^0.7",
16
  "llamaindex": "0.0.35",
17
+ "lucide-react": "^0.291.0",
18
  "next": "^13",
19
  "next-auth": "^4.24.5",
20
  "next-themes": "^0.2.1",
 
23
  "react-dom": "^18",
24
  "react-markdown": "^8.0.7",
25
  "react-syntax-highlighter": "^15.5.0",
26
+ "react-use": "^17.4.2",
27
  "remark": "^14.0.3",
28
  "remark-code-import": "^1.2.0",
29
  "remark-gfm": "^3.0.1",
 
2786
  "@types/unist": "^2"
2787
  }
2788
  },
2789
+ "node_modules/@types/js-cookie": {
2790
+ "version": "2.2.7",
2791
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
2792
+ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
2793
+ },
2794
  "node_modules/@types/katex": {
2795
  "version": "0.16.6",
2796
  "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.6.tgz",
 
3042
  "node": ">=10.0.0"
3043
  }
3044
  },
3045
+ "node_modules/@xobotyi/scrollbar-width": {
3046
+ "version": "1.9.5",
3047
+ "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
3048
+ "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
3049
+ },
3050
  "node_modules/abort-controller": {
3051
  "version": "3.0.0",
3052
  "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
 
3615
  "node": ">= 0.6"
3616
  }
3617
  },
3618
+ "node_modules/copy-to-clipboard": {
3619
+ "version": "3.3.3",
3620
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
3621
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
3622
+ "dependencies": {
3623
+ "toggle-selection": "^1.0.6"
3624
+ }
3625
+ },
3626
  "node_modules/core-util-is": {
3627
  "version": "1.0.3",
3628
  "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
 
3636
  "node": "*"
3637
  }
3638
  },
3639
+ "node_modules/css-in-js-utils": {
3640
+ "version": "3.1.0",
3641
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
3642
+ "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
3643
+ "dependencies": {
3644
+ "hyphenate-style-name": "^1.0.3"
3645
+ }
3646
+ },
3647
  "node_modules/css-tree": {
3648
  "version": "2.3.1",
3649
  "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
 
3777
  "integrity": "sha512-qMa+E6yf1fNQbg3G66pHLXeJUP5CCCzNat1VPczOZOqgI2w4u+8y9sQnswMdGs5m4C1rOePq37EVBr/nsPQY7w==",
3778
  "dev": true
3779
  },
3780
+ "node_modules/error-stack-parser": {
3781
+ "version": "2.1.4",
3782
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
3783
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
3784
+ "dependencies": {
3785
+ "stackframe": "^1.3.4"
3786
+ }
3787
+ },
3788
  "node_modules/es6-promise": {
3789
  "version": "4.2.8",
3790
  "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
 
3840
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
3841
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
3842
  },
3843
+ "node_modules/fast-deep-equal": {
3844
+ "version": "3.1.3",
3845
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
3846
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
3847
+ },
3848
  "node_modules/fast-glob": {
3849
  "version": "3.3.2",
3850
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
 
3871
  "node": ">= 6"
3872
  }
3873
  },
3874
+ "node_modules/fast-loops": {
3875
+ "version": "1.1.3",
3876
+ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
3877
+ "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
3878
+ },
3879
+ "node_modules/fast-shallow-equal": {
3880
+ "version": "1.0.0",
3881
+ "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
3882
+ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
3883
+ },
3884
+ "node_modules/fastest-stable-stringify": {
3885
+ "version": "2.0.2",
3886
+ "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
3887
+ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
3888
+ },
3889
  "node_modules/fastq": {
3890
  "version": "1.15.0",
3891
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
 
4236
  "ms": "^2.0.0"
4237
  }
4238
  },
4239
+ "node_modules/hyphenate-style-name": {
4240
+ "version": "1.0.4",
4241
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
4242
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
4243
+ },
4244
  "node_modules/ieee754": {
4245
  "version": "1.2.1",
4246
  "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
 
4284
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
4285
  "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
4286
  },
4287
+ "node_modules/inline-style-prefixer": {
4288
+ "version": "7.0.0",
4289
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz",
4290
+ "integrity": "sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==",
4291
+ "dependencies": {
4292
+ "css-in-js-utils": "^3.1.0",
4293
+ "fast-loops": "^1.1.3"
4294
+ }
4295
+ },
4296
  "node_modules/intl-messageformat": {
4297
  "version": "10.5.8",
4298
  "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.8.tgz",
 
4452
  "url": "https://github.com/sponsors/panva"
4453
  }
4454
  },
4455
+ "node_modules/js-cookie": {
4456
+ "version": "2.2.1",
4457
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
4458
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
4459
+ },
4460
  "node_modules/js-tiktoken": {
4461
  "version": "1.0.8",
4462
  "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.8.tgz",
 
5673
  "thenify-all": "^1.0.0"
5674
  }
5675
  },
5676
+ "node_modules/nano-css": {
5677
+ "version": "5.6.1",
5678
+ "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.1.tgz",
5679
+ "integrity": "sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==",
5680
+ "dependencies": {
5681
+ "@jridgewell/sourcemap-codec": "^1.4.15",
5682
+ "css-tree": "^1.1.2",
5683
+ "csstype": "^3.1.2",
5684
+ "fastest-stable-stringify": "^2.0.2",
5685
+ "inline-style-prefixer": "^7.0.0",
5686
+ "rtl-css-js": "^1.16.1",
5687
+ "stacktrace-js": "^2.0.2",
5688
+ "stylis": "^4.3.0"
5689
+ },
5690
+ "peerDependencies": {
5691
+ "react": "*",
5692
+ "react-dom": "*"
5693
+ }
5694
+ },
5695
+ "node_modules/nano-css/node_modules/css-tree": {
5696
+ "version": "1.1.3",
5697
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
5698
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
5699
+ "dependencies": {
5700
+ "mdn-data": "2.0.14",
5701
+ "source-map": "^0.6.1"
5702
+ },
5703
+ "engines": {
5704
+ "node": ">=8.0.0"
5705
+ }
5706
+ },
5707
+ "node_modules/nano-css/node_modules/mdn-data": {
5708
+ "version": "2.0.14",
5709
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
5710
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
5711
+ },
5712
+ "node_modules/nano-css/node_modules/source-map": {
5713
+ "version": "0.6.1",
5714
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5715
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5716
+ "engines": {
5717
+ "node": ">=0.10.0"
5718
+ }
5719
+ },
5720
  "node_modules/nanoid": {
5721
  "version": "3.3.6",
5722
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
 
6577
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
6578
  }
6579
  },
6580
+ "node_modules/react-universal-interface": {
6581
+ "version": "0.6.2",
6582
+ "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
6583
+ "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
6584
+ "peerDependencies": {
6585
+ "react": "*",
6586
+ "tslib": "*"
6587
+ }
6588
+ },
6589
+ "node_modules/react-use": {
6590
+ "version": "17.4.2",
6591
+ "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.2.tgz",
6592
+ "integrity": "sha512-1jPtmWLD8OJJNYCdYLJEH/HM+bPDfJuyGwCYeJFgPmWY8ttwpgZnW5QnzgM55CYUByUiTjHxsGOnEpLl6yQaoQ==",
6593
+ "dependencies": {
6594
+ "@types/js-cookie": "^2.2.6",
6595
+ "@xobotyi/scrollbar-width": "^1.9.5",
6596
+ "copy-to-clipboard": "^3.3.1",
6597
+ "fast-deep-equal": "^3.1.3",
6598
+ "fast-shallow-equal": "^1.0.0",
6599
+ "js-cookie": "^2.2.1",
6600
+ "nano-css": "^5.6.1",
6601
+ "react-universal-interface": "^0.6.2",
6602
+ "resize-observer-polyfill": "^1.5.1",
6603
+ "screenfull": "^5.1.0",
6604
+ "set-harmonic-interval": "^1.0.1",
6605
+ "throttle-debounce": "^3.0.1",
6606
+ "ts-easing": "^0.2.0",
6607
+ "tslib": "^2.1.0"
6608
+ },
6609
+ "peerDependencies": {
6610
+ "react": "*",
6611
+ "react-dom": "*"
6612
+ }
6613
+ },
6614
  "node_modules/read-cache": {
6615
  "version": "1.0.0",
6616
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
 
6783
  "yarn": ">=1.7.0"
6784
  }
6785
  },
6786
+ "node_modules/resize-observer-polyfill": {
6787
+ "version": "1.5.1",
6788
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
6789
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
6790
+ },
6791
  "node_modules/resolve": {
6792
  "version": "1.22.8",
6793
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
 
6818
  "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
6819
  "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
6820
  },
6821
+ "node_modules/rtl-css-js": {
6822
+ "version": "1.16.1",
6823
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
6824
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
6825
+ "dependencies": {
6826
+ "@babel/runtime": "^7.1.2"
6827
+ }
6828
+ },
6829
  "node_modules/run-parallel": {
6830
  "version": "1.2.0",
6831
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 
6872
  "loose-envify": "^1.1.0"
6873
  }
6874
  },
6875
+ "node_modules/screenfull": {
6876
+ "version": "5.2.0",
6877
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
6878
+ "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
6879
+ "engines": {
6880
+ "node": ">=0.10.0"
6881
+ },
6882
+ "funding": {
6883
+ "url": "https://github.com/sponsors/sindresorhus"
6884
+ }
6885
+ },
6886
  "node_modules/scroll-into-view-if-needed": {
6887
  "version": "3.0.10",
6888
  "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz",
 
6900
  "node": ">=10"
6901
  }
6902
  },
6903
+ "node_modules/set-harmonic-interval": {
6904
+ "version": "1.0.1",
6905
+ "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
6906
+ "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==",
6907
+ "engines": {
6908
+ "node": ">=6.9"
6909
+ }
6910
+ },
6911
  "node_modules/setimmediate": {
6912
  "version": "1.0.5",
6913
  "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
 
6943
  "swr-store": "^0.10"
6944
  }
6945
  },
6946
+ "node_modules/source-map": {
6947
+ "version": "0.5.6",
6948
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
6949
+ "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
6950
+ "engines": {
6951
+ "node": ">=0.10.0"
6952
+ }
6953
+ },
6954
  "node_modules/source-map-js": {
6955
  "version": "1.0.2",
6956
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
 
6992
  "svelte": "^4.0.0"
6993
  }
6994
  },
6995
+ "node_modules/stack-generator": {
6996
+ "version": "2.0.10",
6997
+ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
6998
+ "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
6999
+ "dependencies": {
7000
+ "stackframe": "^1.3.4"
7001
+ }
7002
+ },
7003
+ "node_modules/stackframe": {
7004
+ "version": "1.3.4",
7005
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
7006
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
7007
+ },
7008
+ "node_modules/stacktrace-gps": {
7009
+ "version": "3.1.2",
7010
+ "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
7011
+ "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
7012
+ "dependencies": {
7013
+ "source-map": "0.5.6",
7014
+ "stackframe": "^1.3.4"
7015
+ }
7016
+ },
7017
+ "node_modules/stacktrace-js": {
7018
+ "version": "2.0.2",
7019
+ "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
7020
+ "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
7021
+ "dependencies": {
7022
+ "error-stack-parser": "^2.0.6",
7023
+ "stack-generator": "^2.0.5",
7024
+ "stacktrace-gps": "^3.0.4"
7025
+ }
7026
+ },
7027
  "node_modules/streamsearch": {
7028
  "version": "1.1.0",
7029
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 
7129
  }
7130
  }
7131
  },
7132
+ "node_modules/stylis": {
7133
+ "version": "4.3.1",
7134
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz",
7135
+ "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ=="
7136
+ },
7137
  "node_modules/sucrase": {
7138
  "version": "3.34.0",
7139
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
 
7338
  "node": ">=0.8"
7339
  }
7340
  },
7341
+ "node_modules/throttle-debounce": {
7342
+ "version": "3.0.1",
7343
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
7344
+ "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==",
7345
+ "engines": {
7346
+ "node": ">=10"
7347
+ }
7348
+ },
7349
  "node_modules/tiny-invariant": {
7350
  "version": "1.3.1",
7351
  "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
 
7445
  "url": "https://opencollective.com/unified"
7446
  }
7447
  },
7448
+ "node_modules/toggle-selection": {
7449
+ "version": "1.0.6",
7450
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
7451
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
7452
+ },
7453
  "node_modules/tr46": {
7454
  "version": "4.1.1",
7455
  "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
 
7479
  "url": "https://github.com/sponsors/wooorm"
7480
  }
7481
  },
7482
+ "node_modules/ts-easing": {
7483
+ "version": "0.2.0",
7484
+ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
7485
+ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
7486
+ },
7487
  "node_modules/ts-interface-checker": {
7488
  "version": "0.1.13",
7489
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
frontend/package.json CHANGED
@@ -14,7 +14,7 @@
14
  "axios": "^1.6.2",
15
  "class-variance-authority": "^0.7",
16
  "llamaindex": "0.0.35",
17
- "lucide-react": "^0.291",
18
  "next": "^13",
19
  "next-auth": "^4.24.5",
20
  "next-themes": "^0.2.1",
@@ -23,6 +23,7 @@
23
  "react-dom": "^18",
24
  "react-markdown": "^8.0.7",
25
  "react-syntax-highlighter": "^15.5.0",
 
26
  "remark": "^14.0.3",
27
  "remark-code-import": "^1.2.0",
28
  "remark-gfm": "^3.0.1",
 
14
  "axios": "^1.6.2",
15
  "class-variance-authority": "^0.7",
16
  "llamaindex": "0.0.35",
17
+ "lucide-react": "^0.291.0",
18
  "next": "^13",
19
  "next-auth": "^4.24.5",
20
  "next-themes": "^0.2.1",
 
23
  "react-dom": "^18",
24
  "react-markdown": "^8.0.7",
25
  "react-syntax-highlighter": "^15.5.0",
26
+ "react-use": "^17.4.2",
27
  "remark": "^14.0.3",
28
  "remark-code-import": "^1.2.0",
29
  "remark-gfm": "^3.0.1",