ChenyuRabbitLove commited on
Commit
09ee276
·
1 Parent(s): f1b9d63

feat: add more examples for landing page chatbot

Browse files
app/components/{ChatBot.tsx → LandingPageChatBot.tsx} RENAMED
@@ -2,6 +2,13 @@
2
 
3
  import { useState, useRef, useEffect } from 'react'
4
  import { useChat } from 'ai/react'
 
 
 
 
 
 
 
5
 
6
  type MessageWithLoading = {
7
  content: string;
@@ -11,19 +18,29 @@ type MessageWithLoading = {
11
 
12
  const EXAMPLE_PROMPTS = [
13
  {
14
- title: "Personalized Learning",
15
- description: "Get tailored explanations",
16
- prompt: "Can you help me understand photosynthesis in a simple way?"
17
  },
18
  {
19
- title: "24/7 Availability",
20
- description: "Learn at your own pace",
21
- prompt: "I need help solving this quadratic equation: x² + 5x + 6 = 0"
22
  },
23
  {
24
- title: "Multiple Subjects",
25
- description: "From math to literature",
26
- prompt: "What are the main themes in Shakespeare's Macbeth?"
 
 
 
 
 
 
 
 
 
 
27
  }
28
  ]
29
 
@@ -31,11 +48,6 @@ export default function LandingPageChatBot() {
31
  const { messages: rawMessages, input, handleInputChange, handleSubmit, isLoading, append } = useChat({
32
  api: '/api/landing_page_chat',
33
  streamProtocol: 'data',
34
- headers: {
35
- 'Accept': 'text/event-stream',
36
- 'Cache-Control': 'no-cache',
37
- 'Connection': 'keep-alive',
38
- },
39
  onError: (error) => {
40
  console.error('Chat error:', error);
41
  },
@@ -82,16 +94,16 @@ export default function LandingPageChatBot() {
82
  }
83
 
84
  return (
85
- <section className="w-full h-[800px] bg-gradient-to-b from-background-secondary to-background-primary flex items-center justify-center px-4">
86
  <div className="w-full max-w-5xl mx-auto h-full flex items-center">
87
  {!hasInteracted && messages.length === 0 ? (
88
  <div className="text-center space-y-8 w-full">
89
  <div className="space-y-4">
90
  <h2 className="text-5xl font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent">
91
- AI Learning Assistant
92
  </h2>
93
  <p className="text-text-secondary text-xl max-w-2xl mx-auto leading-relaxed">
94
- Explore new topics, get homework help, or discover learning resources
95
  </p>
96
  </div>
97
 
@@ -101,7 +113,7 @@ export default function LandingPageChatBot() {
101
  type="text"
102
  value={input}
103
  onChange={handleInputChange}
104
- placeholder="Ask anything about learning..."
105
  className="w-full p-6 pr-36 rounded-2xl border border-border/50 bg-background-primary/50
106
  backdrop-blur-sm shadow-lg focus:outline-none focus:ring-2 focus:ring-primary/50
107
  text-lg transition-all duration-200 placeholder:text-text-secondary/50"
@@ -114,17 +126,17 @@ export default function LandingPageChatBot() {
114
  shadow-md hover:shadow-lg active:scale-95 disabled:opacity-50
115
  disabled:hover:bg-primary disabled:cursor-not-allowed"
116
  >
117
- <svg
118
- xmlns="http://www.w3.org/2000/svg"
119
- fill="none"
120
- viewBox="0 0 24 24"
121
- strokeWidth="1.5"
122
- stroke="currentColor"
123
  className={`size-6 ${isLoading ? 'animate-pulse' : ''}`}
124
  >
125
- <path
126
- strokeLinecap="round"
127
- strokeLinejoin="round"
128
  d="M6 12 3.269 3.125A59.769 59.769 0 0 1 21.485 12 59.768 59.768 0 0 1 3.27 20.875L5.999 12Zm0 0h7.5"
129
  />
130
  </svg>
@@ -133,29 +145,32 @@ export default function LandingPageChatBot() {
133
  </form>
134
 
135
  <div className="mt-12">
136
- <h3 className="text-xl font-semibold text-text-primary mb-6">Try these examples:</h3>
137
- <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
138
  {EXAMPLE_PROMPTS.map((prompt, index) => (
139
  <button
140
  key={index}
141
  onClick={() => sendMessage(prompt.prompt)}
142
- className="group p-6 rounded-2xl border border-border/50 bg-background-primary/30
143
  hover:bg-background-primary/50 backdrop-blur-sm transition-all duration-200
144
- hover:border-primary/50 hover:shadow-lg text-left"
145
  >
146
- <div className="flex items-center justify-between mb-2">
147
- <h4 className="font-semibold text-text-primary">{prompt.title}</h4>
 
 
 
 
 
148
  <svg
149
- className="w-5 h-5 text-primary opacity-0 group-hover:opacity-100 transition-opacity duration-200"
150
  fill="none"
151
  stroke="currentColor"
152
  viewBox="0 0 24 24"
 
153
  >
154
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
155
  </svg>
156
  </div>
157
- <p className="text-text-secondary text-sm mb-2">{prompt.description}</p>
158
- <p className="text-primary text-sm font-medium truncate">{prompt.prompt}</p>
159
  </button>
160
  ))}
161
  </div>
@@ -164,7 +179,7 @@ export default function LandingPageChatBot() {
164
  ) : (
165
  <div className="bg-background-primary/50 backdrop-blur-sm rounded-2xl shadow-lg border border-border/50 overflow-hidden w-full h-[700px] flex flex-col">
166
  <div className="p-6 border-b border-border/50 bg-background-secondary/30">
167
- <h2 className="text-xl font-semibold text-text-primary">AI Learning Assistant</h2>
168
  </div>
169
 
170
  <div
 
2
 
3
  import { useState, useRef, useEffect } from 'react'
4
  import { useChat } from 'ai/react'
5
+ import {
6
+ AcademicCapIcon,
7
+ ClockIcon,
8
+ BookOpenIcon,
9
+ LightBulbIcon,
10
+ BriefcaseIcon,
11
+ } from '@heroicons/react/24/outline'
12
 
13
  type MessageWithLoading = {
14
  content: string;
 
18
 
19
  const EXAMPLE_PROMPTS = [
20
  {
21
+ title: "教案規劃",
22
+ prompt: "我想規劃一堂關於數學的課程",
23
+ icon: AcademicCapIcon
24
  },
25
  {
26
+ title: "英語對話",
27
+ prompt: "我想練習英語對話",
28
+ icon: ClockIcon
29
  },
30
  {
31
+ title: "作業批改",
32
+ prompt: "我想批改學生的作文作業",
33
+ icon: BookOpenIcon
34
+ },
35
+ {
36
+ title: "數學解題",
37
+ prompt: "我想解數學題目",
38
+ icon: LightBulbIcon
39
+ },
40
+ {
41
+ title: "我想學程式",
42
+ prompt: "我想學習如何寫程式",
43
+ icon: BriefcaseIcon
44
  }
45
  ]
46
 
 
48
  const { messages: rawMessages, input, handleInputChange, handleSubmit, isLoading, append } = useChat({
49
  api: '/api/landing_page_chat',
50
  streamProtocol: 'data',
 
 
 
 
 
51
  onError: (error) => {
52
  console.error('Chat error:', error);
53
  },
 
94
  }
95
 
96
  return (
97
+ <section className="w-full h-[1000px] bg-gradient-to-b from-background-secondary to-background-primary flex items-center justify-center px-4">
98
  <div className="w-full max-w-5xl mx-auto h-full flex items-center">
99
  {!hasInteracted && messages.length === 0 ? (
100
  <div className="text-center space-y-8 w-full">
101
  <div className="space-y-4">
102
  <h2 className="text-5xl font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent">
103
+ 今天你想學什麼?
104
  </h2>
105
  <p className="text-text-secondary text-xl max-w-2xl mx-auto leading-relaxed">
106
+ 探索新主題、獲得教學協助,或發現學習資源
107
  </p>
108
  </div>
109
 
 
113
  type="text"
114
  value={input}
115
  onChange={handleInputChange}
116
+ placeholder="請問任何關於學習的問題..."
117
  className="w-full p-6 pr-36 rounded-2xl border border-border/50 bg-background-primary/50
118
  backdrop-blur-sm shadow-lg focus:outline-none focus:ring-2 focus:ring-primary/50
119
  text-lg transition-all duration-200 placeholder:text-text-secondary/50"
 
126
  shadow-md hover:shadow-lg active:scale-95 disabled:opacity-50
127
  disabled:hover:bg-primary disabled:cursor-not-allowed"
128
  >
129
+ <svg
130
+ xmlns="http://www.w3.org/2000/svg"
131
+ fill="none"
132
+ viewBox="0 0 24 24"
133
+ strokeWidth="1.5"
134
+ stroke="currentColor"
135
  className={`size-6 ${isLoading ? 'animate-pulse' : ''}`}
136
  >
137
+ <path
138
+ strokeLinecap="round"
139
+ strokeLinejoin="round"
140
  d="M6 12 3.269 3.125A59.769 59.769 0 0 1 21.485 12 59.768 59.768 0 0 1 3.27 20.875L5.999 12Zm0 0h7.5"
141
  />
142
  </svg>
 
145
  </form>
146
 
147
  <div className="mt-12">
148
+ <div className="grid grid-cols-1 md:grid-cols-5 gap-4">
 
149
  {EXAMPLE_PROMPTS.map((prompt, index) => (
150
  <button
151
  key={index}
152
  onClick={() => sendMessage(prompt.prompt)}
153
+ className="group p-4 rounded-2xl border border-border/50 bg-background-primary/30
154
  hover:bg-background-primary/50 backdrop-blur-sm transition-all duration-200
155
+ hover:border-primary/50 hover:shadow-lg text-left w-full"
156
  >
157
+ <div className="flex items-center justify-between w-full">
158
+ <div className="flex items-center gap-3">
159
+ <prompt.icon className="w-8 h-8 text-primary" />
160
+ <h4 className="font-semibold text-text-primary text-md">
161
+ {prompt.title}
162
+ </h4>
163
+ </div>
164
  <svg
165
+ className="w-6 h-6 text-primary opacity-0 group-hover:opacity-100 transition-opacity duration-200"
166
  fill="none"
167
  stroke="currentColor"
168
  viewBox="0 0 24 24"
169
+ strokeWidth={2}
170
  >
171
+ <path strokeLinecap="round" strokeLinejoin="round" d="M9 5l7 7-7 7" />
172
  </svg>
173
  </div>
 
 
174
  </button>
175
  ))}
176
  </div>
 
179
  ) : (
180
  <div className="bg-background-primary/50 backdrop-blur-sm rounded-2xl shadow-lg border border-border/50 overflow-hidden w-full h-[700px] flex flex-col">
181
  <div className="p-6 border-b border-border/50 bg-background-secondary/30">
182
+ <h2 className="text-xl font-semibold text-text-primary">PlayGO 導覽員</h2>
183
  </div>
184
 
185
  <div
app/page.tsx CHANGED
@@ -2,7 +2,7 @@
2
 
3
  import Link from "next/link"
4
  import { useTheme } from './components/ThemeProvider'
5
- import ChatBot from './components/ChatBot'
6
 
7
  export default function LandingPage() {
8
  const { theme, toggleTheme } = useTheme()
@@ -42,35 +42,11 @@ export default function LandingPage() {
42
  </div>
43
  </header>
44
 
45
- {/* Add ChatBot right after header */}
46
- <div className="pt-20">
47
- <ChatBot />
48
- </div>
49
-
50
  <main className="pt-4">
51
  {/* Hero Section */}
52
- <section className="container mx-auto px-4 py-20 text-center">
53
- <h1 className="text-6xl font-bold mb-6 bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent">
54
- Turn learning into an AI-powered adventure
55
- </h1>
56
- <p className="text-text-secondary text-xl mb-12 max-w-2xl mx-auto">
57
- PlayGo AI is the leading educational platform for building engaging AI-powered learning experiences
58
- </p>
59
- <div className="flex justify-center gap-4">
60
- <Link
61
- href="/get-started"
62
- className="px-6 py-3 rounded-lg bg-primary text-white hover:bg-primary/90 font-medium"
63
- >
64
- Get Started
65
- </Link>
66
- <Link
67
- href="/demo"
68
- className="px-6 py-3 rounded-lg border border-border hover:border-primary text-text-primary font-medium"
69
- >
70
- View Demo
71
- </Link>
72
- </div>
73
- </section>
74
 
75
  {/* Features Grid */}
76
  <section className="bg-background-secondary py-20">
 
2
 
3
  import Link from "next/link"
4
  import { useTheme } from './components/ThemeProvider'
5
+ import ChatBot from './components/LandingPageChatBot'
6
 
7
  export default function LandingPage() {
8
  const { theme, toggleTheme } = useTheme()
 
42
  </div>
43
  </header>
44
 
 
 
 
 
 
45
  <main className="pt-4">
46
  {/* Hero Section */}
47
+ <div className="">
48
+ <ChatBot />
49
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  {/* Features Grid */}
52
  <section className="bg-background-secondary py-20">
backend/main.py CHANGED
@@ -8,7 +8,6 @@ from pydantic import BaseModel
8
  import openai
9
  from dotenv import load_dotenv
10
  from typing import List
11
- import asyncio
12
 
13
  # Load environment variables
14
  load_dotenv()
@@ -74,10 +73,7 @@ async def stream_text(messages: List[Message]):
74
  async def landing_page_chat(request: ChatRequest):
75
  response = StreamingResponse(
76
  stream_text(request.messages),
77
- media_type='text/event-stream',
78
  )
79
- response.headers['Cache-Control'] = 'no-cache'
80
- response.headers['Connection'] = 'keep-alive'
81
  response.headers['x-vercel-ai-data-stream'] = 'v1'
82
  return response
83
 
 
8
  import openai
9
  from dotenv import load_dotenv
10
  from typing import List
 
11
 
12
  # Load environment variables
13
  load_dotenv()
 
73
  async def landing_page_chat(request: ChatRequest):
74
  response = StreamingResponse(
75
  stream_text(request.messages),
 
76
  )
 
 
77
  response.headers['x-vercel-ai-data-stream'] = 'v1'
78
  return response
79
 
next.config.ts CHANGED
@@ -6,14 +6,7 @@ const nextConfig: NextConfig = {
6
  return [
7
  {
8
  source: '/api/:path*',
9
- destination: 'http://localhost:8000/api/:path*',
10
- has: [
11
- {
12
- type: 'header',
13
- key: 'accept',
14
- value: 'text/event-stream',
15
- },
16
- ],
17
  }
18
  ]
19
  },
 
6
  return [
7
  {
8
  source: '/api/:path*',
9
+ destination: 'http://localhost:8000/api/:path*' // FastAPI backend
 
 
 
 
 
 
 
10
  }
11
  ]
12
  },
package-lock.json CHANGED
@@ -8,10 +8,12 @@
8
  "name": "playgo_next",
9
  "version": "0.1.0",
10
  "dependencies": {
 
11
  "ai": "^3.4.31",
12
  "next": "15.0.2",
13
  "react": "19.0.0-rc-02c0e824-20241028",
14
- "react-dom": "19.0.0-rc-02c0e824-20241028"
 
15
  },
16
  "devDependencies": {
17
  "@types/node": "^20",
@@ -211,70 +213,6 @@
211
  "url": "https://github.com/sponsors/sindresorhus"
212
  }
213
  },
214
- "node_modules/@ampproject/remapping": {
215
- "version": "2.3.0",
216
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
217
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
218
- "license": "Apache-2.0",
219
- "peer": true,
220
- "dependencies": {
221
- "@jridgewell/gen-mapping": "^0.3.5",
222
- "@jridgewell/trace-mapping": "^0.3.24"
223
- },
224
- "engines": {
225
- "node": ">=6.0.0"
226
- }
227
- },
228
- "node_modules/@babel/helper-string-parser": {
229
- "version": "7.25.9",
230
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
231
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
232
- "license": "MIT",
233
- "peer": true,
234
- "engines": {
235
- "node": ">=6.9.0"
236
- }
237
- },
238
- "node_modules/@babel/helper-validator-identifier": {
239
- "version": "7.25.9",
240
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
241
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
242
- "license": "MIT",
243
- "peer": true,
244
- "engines": {
245
- "node": ">=6.9.0"
246
- }
247
- },
248
- "node_modules/@babel/parser": {
249
- "version": "7.26.2",
250
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
251
- "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
252
- "license": "MIT",
253
- "peer": true,
254
- "dependencies": {
255
- "@babel/types": "^7.26.0"
256
- },
257
- "bin": {
258
- "parser": "bin/babel-parser.js"
259
- },
260
- "engines": {
261
- "node": ">=6.0.0"
262
- }
263
- },
264
- "node_modules/@babel/types": {
265
- "version": "7.26.0",
266
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
267
- "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
268
- "license": "MIT",
269
- "peer": true,
270
- "dependencies": {
271
- "@babel/helper-string-parser": "^7.25.9",
272
- "@babel/helper-validator-identifier": "^7.25.9"
273
- },
274
- "engines": {
275
- "node": ">=6.9.0"
276
- }
277
- },
278
  "node_modules/@emnapi/runtime": {
279
  "version": "1.3.1",
280
  "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
@@ -348,6 +286,15 @@
348
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
349
  }
350
  },
 
 
 
 
 
 
 
 
 
351
  "node_modules/@humanwhocodes/config-array": {
352
  "version": "0.13.0",
353
  "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
@@ -798,6 +745,7 @@
798
  "version": "0.3.5",
799
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
800
  "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
 
801
  "license": "MIT",
802
  "dependencies": {
803
  "@jridgewell/set-array": "^1.2.1",
@@ -812,6 +760,7 @@
812
  "version": "3.1.2",
813
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
814
  "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
 
815
  "license": "MIT",
816
  "engines": {
817
  "node": ">=6.0.0"
@@ -821,6 +770,7 @@
821
  "version": "1.2.1",
822
  "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
823
  "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
 
824
  "license": "MIT",
825
  "engines": {
826
  "node": ">=6.0.0"
@@ -830,12 +780,14 @@
830
  "version": "1.5.0",
831
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
832
  "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
 
833
  "license": "MIT"
834
  },
835
  "node_modules/@jridgewell/trace-mapping": {
836
  "version": "0.3.25",
837
  "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
838
  "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
 
839
  "license": "MIT",
840
  "dependencies": {
841
  "@jridgewell/resolve-uri": "^3.1.0",
@@ -1089,13 +1041,6 @@
1089
  "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==",
1090
  "license": "MIT"
1091
  },
1092
- "node_modules/@types/estree": {
1093
- "version": "1.0.6",
1094
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
1095
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
1096
- "license": "MIT",
1097
- "peer": true
1098
- },
1099
  "node_modules/@types/json5": {
1100
  "version": "0.0.29",
1101
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -1401,119 +1346,11 @@
1401
  "dev": true,
1402
  "license": "ISC"
1403
  },
1404
- "node_modules/@vue/compiler-core": {
1405
- "version": "3.5.12",
1406
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
1407
- "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
1408
- "license": "MIT",
1409
- "peer": true,
1410
- "dependencies": {
1411
- "@babel/parser": "^7.25.3",
1412
- "@vue/shared": "3.5.12",
1413
- "entities": "^4.5.0",
1414
- "estree-walker": "^2.0.2",
1415
- "source-map-js": "^1.2.0"
1416
- }
1417
- },
1418
- "node_modules/@vue/compiler-dom": {
1419
- "version": "3.5.12",
1420
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
1421
- "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
1422
- "license": "MIT",
1423
- "peer": true,
1424
- "dependencies": {
1425
- "@vue/compiler-core": "3.5.12",
1426
- "@vue/shared": "3.5.12"
1427
- }
1428
- },
1429
- "node_modules/@vue/compiler-sfc": {
1430
- "version": "3.5.12",
1431
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
1432
- "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
1433
- "license": "MIT",
1434
- "peer": true,
1435
- "dependencies": {
1436
- "@babel/parser": "^7.25.3",
1437
- "@vue/compiler-core": "3.5.12",
1438
- "@vue/compiler-dom": "3.5.12",
1439
- "@vue/compiler-ssr": "3.5.12",
1440
- "@vue/shared": "3.5.12",
1441
- "estree-walker": "^2.0.2",
1442
- "magic-string": "^0.30.11",
1443
- "postcss": "^8.4.47",
1444
- "source-map-js": "^1.2.0"
1445
- }
1446
- },
1447
- "node_modules/@vue/compiler-ssr": {
1448
- "version": "3.5.12",
1449
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
1450
- "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
1451
- "license": "MIT",
1452
- "peer": true,
1453
- "dependencies": {
1454
- "@vue/compiler-dom": "3.5.12",
1455
- "@vue/shared": "3.5.12"
1456
- }
1457
- },
1458
- "node_modules/@vue/reactivity": {
1459
- "version": "3.5.12",
1460
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
1461
- "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
1462
- "license": "MIT",
1463
- "peer": true,
1464
- "dependencies": {
1465
- "@vue/shared": "3.5.12"
1466
- }
1467
- },
1468
- "node_modules/@vue/runtime-core": {
1469
- "version": "3.5.12",
1470
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
1471
- "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
1472
- "license": "MIT",
1473
- "peer": true,
1474
- "dependencies": {
1475
- "@vue/reactivity": "3.5.12",
1476
- "@vue/shared": "3.5.12"
1477
- }
1478
- },
1479
- "node_modules/@vue/runtime-dom": {
1480
- "version": "3.5.12",
1481
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
1482
- "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
1483
- "license": "MIT",
1484
- "peer": true,
1485
- "dependencies": {
1486
- "@vue/reactivity": "3.5.12",
1487
- "@vue/runtime-core": "3.5.12",
1488
- "@vue/shared": "3.5.12",
1489
- "csstype": "^3.1.3"
1490
- }
1491
- },
1492
- "node_modules/@vue/server-renderer": {
1493
- "version": "3.5.12",
1494
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
1495
- "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
1496
- "license": "MIT",
1497
- "peer": true,
1498
- "dependencies": {
1499
- "@vue/compiler-ssr": "3.5.12",
1500
- "@vue/shared": "3.5.12"
1501
- },
1502
- "peerDependencies": {
1503
- "vue": "3.5.12"
1504
- }
1505
- },
1506
- "node_modules/@vue/shared": {
1507
- "version": "3.5.12",
1508
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
1509
- "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
1510
- "license": "MIT",
1511
- "peer": true
1512
- },
1513
  "node_modules/acorn": {
1514
  "version": "8.14.0",
1515
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
1516
  "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
 
1517
  "license": "MIT",
1518
  "bin": {
1519
  "acorn": "bin/acorn"
@@ -1532,16 +1369,6 @@
1532
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1533
  }
1534
  },
1535
- "node_modules/acorn-typescript": {
1536
- "version": "1.4.13",
1537
- "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz",
1538
- "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==",
1539
- "license": "MIT",
1540
- "peer": true,
1541
- "peerDependencies": {
1542
- "acorn": ">=8.9.0"
1543
- }
1544
- },
1545
  "node_modules/ai": {
1546
  "version": "3.4.31",
1547
  "resolved": "https://registry.npmjs.org/ai/-/ai-3.4.31.tgz",
@@ -1672,6 +1499,7 @@
1672
  "version": "5.3.2",
1673
  "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
1674
  "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
 
1675
  "license": "Apache-2.0",
1676
  "engines": {
1677
  "node": ">= 0.4"
@@ -1872,6 +1700,7 @@
1872
  "version": "4.1.0",
1873
  "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
1874
  "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
 
1875
  "license": "Apache-2.0",
1876
  "engines": {
1877
  "node": ">= 0.4"
@@ -2147,6 +1976,7 @@
2147
  "version": "3.1.3",
2148
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2149
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
 
2150
  "license": "MIT"
2151
  },
2152
  "node_modules/damerau-levenshtein": {
@@ -2342,19 +2172,6 @@
2342
  "node": ">=10.13.0"
2343
  }
2344
  },
2345
- "node_modules/entities": {
2346
- "version": "4.5.0",
2347
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
2348
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
2349
- "license": "BSD-2-Clause",
2350
- "peer": true,
2351
- "engines": {
2352
- "node": ">=0.12"
2353
- },
2354
- "funding": {
2355
- "url": "https://github.com/fb55/entities?sponsor=1"
2356
- }
2357
- },
2358
  "node_modules/es-abstract": {
2359
  "version": "1.23.3",
2360
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
@@ -2949,13 +2766,6 @@
2949
  "url": "https://opencollective.com/eslint"
2950
  }
2951
  },
2952
- "node_modules/esm-env": {
2953
- "version": "1.1.4",
2954
- "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.1.4.tgz",
2955
- "integrity": "sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==",
2956
- "license": "MIT",
2957
- "peer": true
2958
- },
2959
  "node_modules/espree": {
2960
  "version": "9.6.1",
2961
  "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
@@ -2987,17 +2797,6 @@
2987
  "node": ">=0.10"
2988
  }
2989
  },
2990
- "node_modules/esrap": {
2991
- "version": "1.2.2",
2992
- "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz",
2993
- "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==",
2994
- "license": "MIT",
2995
- "peer": true,
2996
- "dependencies": {
2997
- "@jridgewell/sourcemap-codec": "^1.4.15",
2998
- "@types/estree": "^1.0.1"
2999
- }
3000
- },
3001
  "node_modules/esrecurse": {
3002
  "version": "4.3.0",
3003
  "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
@@ -3021,13 +2820,6 @@
3021
  "node": ">=4.0"
3022
  }
3023
  },
3024
- "node_modules/estree-walker": {
3025
- "version": "2.0.2",
3026
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
3027
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
3028
- "license": "MIT",
3029
- "peer": true
3030
- },
3031
  "node_modules/esutils": {
3032
  "version": "2.0.3",
3033
  "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -3844,16 +3636,6 @@
3844
  "node": ">=8"
3845
  }
3846
  },
3847
- "node_modules/is-reference": {
3848
- "version": "3.0.2",
3849
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
3850
- "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
3851
- "license": "MIT",
3852
- "peer": true,
3853
- "dependencies": {
3854
- "@types/estree": "*"
3855
- }
3856
- },
3857
  "node_modules/is-regex": {
3858
  "version": "1.1.4",
3859
  "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -4214,13 +3996,6 @@
4214
  "dev": true,
4215
  "license": "MIT"
4216
  },
4217
- "node_modules/locate-character": {
4218
- "version": "3.0.0",
4219
- "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
4220
- "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
4221
- "license": "MIT",
4222
- "peer": true
4223
- },
4224
  "node_modules/locate-path": {
4225
  "version": "6.0.0",
4226
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -4264,16 +4039,6 @@
4264
  "dev": true,
4265
  "license": "ISC"
4266
  },
4267
- "node_modules/magic-string": {
4268
- "version": "0.30.12",
4269
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
4270
- "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
4271
- "license": "MIT",
4272
- "peer": true,
4273
- "dependencies": {
4274
- "@jridgewell/sourcemap-codec": "^1.5.0"
4275
- }
4276
- },
4277
  "node_modules/merge2": {
4278
  "version": "1.4.1",
4279
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4783,6 +4548,7 @@
4783
  "version": "8.4.47",
4784
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
4785
  "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
 
4786
  "funding": [
4787
  {
4788
  "type": "opencollective",
@@ -5750,31 +5516,6 @@
5750
  "url": "https://github.com/sponsors/ljharb"
5751
  }
5752
  },
5753
- "node_modules/svelte": {
5754
- "version": "5.1.9",
5755
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.9.tgz",
5756
- "integrity": "sha512-nzq+PPKGS2PoEWDjAcXSrKSbXmmmOAxd6dAz1IhRusUpVkFS6DMELWPyBPGwu6TpO/gsgtFXwX0M4+pAR5gzKw==",
5757
- "license": "MIT",
5758
- "peer": true,
5759
- "dependencies": {
5760
- "@ampproject/remapping": "^2.3.0",
5761
- "@jridgewell/sourcemap-codec": "^1.5.0",
5762
- "@types/estree": "^1.0.5",
5763
- "acorn": "^8.12.1",
5764
- "acorn-typescript": "^1.4.13",
5765
- "aria-query": "^5.3.1",
5766
- "axobject-query": "^4.1.0",
5767
- "esm-env": "^1.0.0",
5768
- "esrap": "^1.2.2",
5769
- "is-reference": "^3.0.2",
5770
- "locate-character": "^3.0.0",
5771
- "magic-string": "^0.30.11",
5772
- "zimmerframe": "^1.1.2"
5773
- },
5774
- "engines": {
5775
- "node": ">=18"
5776
- }
5777
- },
5778
  "node_modules/swrev": {
5779
  "version": "4.0.0",
5780
  "resolved": "https://registry.npmjs.org/swrev/-/swrev-4.0.0.tgz",
@@ -6039,7 +5780,7 @@
6039
  "version": "5.6.3",
6040
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
6041
  "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
6042
- "devOptional": true,
6043
  "license": "Apache-2.0",
6044
  "bin": {
6045
  "tsc": "bin/tsc",
@@ -6089,28 +5830,6 @@
6089
  "dev": true,
6090
  "license": "MIT"
6091
  },
6092
- "node_modules/vue": {
6093
- "version": "3.5.12",
6094
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz",
6095
- "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
6096
- "license": "MIT",
6097
- "peer": true,
6098
- "dependencies": {
6099
- "@vue/compiler-dom": "3.5.12",
6100
- "@vue/compiler-sfc": "3.5.12",
6101
- "@vue/runtime-dom": "3.5.12",
6102
- "@vue/server-renderer": "3.5.12",
6103
- "@vue/shared": "3.5.12"
6104
- },
6105
- "peerDependencies": {
6106
- "typescript": "*"
6107
- },
6108
- "peerDependenciesMeta": {
6109
- "typescript": {
6110
- "optional": true
6111
- }
6112
- }
6113
- },
6114
  "node_modules/which": {
6115
  "version": "2.0.2",
6116
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -6354,19 +6073,11 @@
6354
  "url": "https://github.com/sponsors/sindresorhus"
6355
  }
6356
  },
6357
- "node_modules/zimmerframe": {
6358
- "version": "1.1.2",
6359
- "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
6360
- "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
6361
- "license": "MIT",
6362
- "peer": true
6363
- },
6364
  "node_modules/zod": {
6365
  "version": "3.23.8",
6366
  "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
6367
  "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
6368
  "license": "MIT",
6369
- "peer": true,
6370
  "funding": {
6371
  "url": "https://github.com/sponsors/colinhacks"
6372
  }
 
8
  "name": "playgo_next",
9
  "version": "0.1.0",
10
  "dependencies": {
11
+ "@heroicons/react": "^2.1.5",
12
  "ai": "^3.4.31",
13
  "next": "15.0.2",
14
  "react": "19.0.0-rc-02c0e824-20241028",
15
+ "react-dom": "19.0.0-rc-02c0e824-20241028",
16
+ "zod": "^3.23.8"
17
  },
18
  "devDependencies": {
19
  "@types/node": "^20",
 
213
  "url": "https://github.com/sponsors/sindresorhus"
214
  }
215
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  "node_modules/@emnapi/runtime": {
217
  "version": "1.3.1",
218
  "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
 
286
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
287
  }
288
  },
289
+ "node_modules/@heroicons/react": {
290
+ "version": "2.1.5",
291
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.5.tgz",
292
+ "integrity": "sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==",
293
+ "license": "MIT",
294
+ "peerDependencies": {
295
+ "react": ">= 16"
296
+ }
297
+ },
298
  "node_modules/@humanwhocodes/config-array": {
299
  "version": "0.13.0",
300
  "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
 
745
  "version": "0.3.5",
746
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
747
  "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
748
+ "dev": true,
749
  "license": "MIT",
750
  "dependencies": {
751
  "@jridgewell/set-array": "^1.2.1",
 
760
  "version": "3.1.2",
761
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
762
  "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
763
+ "dev": true,
764
  "license": "MIT",
765
  "engines": {
766
  "node": ">=6.0.0"
 
770
  "version": "1.2.1",
771
  "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
772
  "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
773
+ "dev": true,
774
  "license": "MIT",
775
  "engines": {
776
  "node": ">=6.0.0"
 
780
  "version": "1.5.0",
781
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
782
  "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
783
+ "dev": true,
784
  "license": "MIT"
785
  },
786
  "node_modules/@jridgewell/trace-mapping": {
787
  "version": "0.3.25",
788
  "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
789
  "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
790
+ "dev": true,
791
  "license": "MIT",
792
  "dependencies": {
793
  "@jridgewell/resolve-uri": "^3.1.0",
 
1041
  "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==",
1042
  "license": "MIT"
1043
  },
 
 
 
 
 
 
 
1044
  "node_modules/@types/json5": {
1045
  "version": "0.0.29",
1046
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
 
1346
  "dev": true,
1347
  "license": "ISC"
1348
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1349
  "node_modules/acorn": {
1350
  "version": "8.14.0",
1351
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
1352
  "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
1353
+ "dev": true,
1354
  "license": "MIT",
1355
  "bin": {
1356
  "acorn": "bin/acorn"
 
1369
  "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1370
  }
1371
  },
 
 
 
 
 
 
 
 
 
 
1372
  "node_modules/ai": {
1373
  "version": "3.4.31",
1374
  "resolved": "https://registry.npmjs.org/ai/-/ai-3.4.31.tgz",
 
1499
  "version": "5.3.2",
1500
  "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
1501
  "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
1502
+ "dev": true,
1503
  "license": "Apache-2.0",
1504
  "engines": {
1505
  "node": ">= 0.4"
 
1700
  "version": "4.1.0",
1701
  "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
1702
  "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
1703
+ "dev": true,
1704
  "license": "Apache-2.0",
1705
  "engines": {
1706
  "node": ">= 0.4"
 
1976
  "version": "3.1.3",
1977
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1978
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1979
+ "dev": true,
1980
  "license": "MIT"
1981
  },
1982
  "node_modules/damerau-levenshtein": {
 
2172
  "node": ">=10.13.0"
2173
  }
2174
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2175
  "node_modules/es-abstract": {
2176
  "version": "1.23.3",
2177
  "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
 
2766
  "url": "https://opencollective.com/eslint"
2767
  }
2768
  },
 
 
 
 
 
 
 
2769
  "node_modules/espree": {
2770
  "version": "9.6.1",
2771
  "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
 
2797
  "node": ">=0.10"
2798
  }
2799
  },
 
 
 
 
 
 
 
 
 
 
 
2800
  "node_modules/esrecurse": {
2801
  "version": "4.3.0",
2802
  "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
 
2820
  "node": ">=4.0"
2821
  }
2822
  },
 
 
 
 
 
 
 
2823
  "node_modules/esutils": {
2824
  "version": "2.0.3",
2825
  "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
 
3636
  "node": ">=8"
3637
  }
3638
  },
 
 
 
 
 
 
 
 
 
 
3639
  "node_modules/is-regex": {
3640
  "version": "1.1.4",
3641
  "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
 
3996
  "dev": true,
3997
  "license": "MIT"
3998
  },
 
 
 
 
 
 
 
3999
  "node_modules/locate-path": {
4000
  "version": "6.0.0",
4001
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
 
4039
  "dev": true,
4040
  "license": "ISC"
4041
  },
 
 
 
 
 
 
 
 
 
 
4042
  "node_modules/merge2": {
4043
  "version": "1.4.1",
4044
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 
4548
  "version": "8.4.47",
4549
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
4550
  "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
4551
+ "dev": true,
4552
  "funding": [
4553
  {
4554
  "type": "opencollective",
 
5516
  "url": "https://github.com/sponsors/ljharb"
5517
  }
5518
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5519
  "node_modules/swrev": {
5520
  "version": "4.0.0",
5521
  "resolved": "https://registry.npmjs.org/swrev/-/swrev-4.0.0.tgz",
 
5780
  "version": "5.6.3",
5781
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
5782
  "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
5783
+ "dev": true,
5784
  "license": "Apache-2.0",
5785
  "bin": {
5786
  "tsc": "bin/tsc",
 
5830
  "dev": true,
5831
  "license": "MIT"
5832
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5833
  "node_modules/which": {
5834
  "version": "2.0.2",
5835
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
6073
  "url": "https://github.com/sponsors/sindresorhus"
6074
  }
6075
  },
 
 
 
 
 
 
 
6076
  "node_modules/zod": {
6077
  "version": "3.23.8",
6078
  "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
6079
  "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
6080
  "license": "MIT",
 
6081
  "funding": {
6082
  "url": "https://github.com/sponsors/colinhacks"
6083
  }
package.json CHANGED
@@ -9,10 +9,12 @@
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
 
12
  "ai": "^3.4.31",
13
  "next": "15.0.2",
14
  "react": "19.0.0-rc-02c0e824-20241028",
15
- "react-dom": "19.0.0-rc-02c0e824-20241028"
 
16
  },
17
  "devDependencies": {
18
  "@types/node": "^20",
 
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
12
+ "@heroicons/react": "^2.1.5",
13
  "ai": "^3.4.31",
14
  "next": "15.0.2",
15
  "react": "19.0.0-rc-02c0e824-20241028",
16
+ "react-dom": "19.0.0-rc-02c0e824-20241028",
17
+ "zod": "^3.23.8"
18
  },
19
  "devDependencies": {
20
  "@types/node": "^20",