Reubencf commited on
Commit
d2a09b6
·
1 Parent(s): 8c79bdb

fixing gemini

Browse files
app/api/gemini/chat/route.ts CHANGED
@@ -1,112 +1,85 @@
1
  import { NextRequest, NextResponse } from 'next/server'
2
-
3
- const GEMINI_API_URL = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent'
4
- const GEMINI_API_KEY = process.env.GEMINI_API_KEY
5
 
6
  export async function POST(request: NextRequest) {
7
  try {
8
- const { message, imageUrl, history, generateImage } = await request.json()
 
9
 
10
- if (!GEMINI_API_KEY) {
11
  return NextResponse.json(
12
- { error: 'Gemini API key not configured on server. Please set GEMINI_API_KEY environment variable.' },
13
  { status: 500 }
14
  )
15
  }
16
 
17
- // For image generation requests
18
- if (generateImage) {
19
- // Note: Gemini doesn't directly generate images, but we can use a prompt to describe what an image should contain
20
- // You would typically integrate with an image generation service like Stable Diffusion or DALL-E here
21
- return NextResponse.json({
22
- response: `I can describe the image for you: "${message}". For actual image generation, you would need to integrate with services like DALL-E or Stable Diffusion.`,
23
- imageDescription: message,
24
- note: 'Image generation requires integration with specialized services.'
25
- })
26
- }
27
-
28
- // Prepare the request body for Gemini API
29
- const requestBody: any = {
30
- contents: [],
31
- generationConfig: {
32
- temperature: 0.9,
33
- topK: 1,
34
- topP: 1,
35
- maxOutputTokens: 2048,
36
- }
37
- }
38
-
39
- // Add conversation history if available
40
- if (history && history.length > 0) {
41
- history.forEach((msg: any) => {
42
- requestBody.contents.push({
43
- role: msg.role === 'user' ? 'user' : 'model',
44
- parts: [{ text: msg.content }]
45
- })
46
- })
47
- }
48
 
49
- // Prepare the current message
50
- const parts: any[] = []
 
 
 
51
 
52
- if (message) {
53
- parts.push({ text: message })
54
- }
 
 
55
 
56
- if (imageUrl) {
57
- // Extract base64 data from data URL
58
- const base64Data = imageUrl.split(',')[1]
59
- parts.push({
60
- inline_data: {
61
- mime_type: imageUrl.split(':')[1].split(';')[0],
62
- data: base64Data
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  }
64
- })
65
- }
66
-
67
- requestBody.contents.push({
68
- role: 'user',
69
- parts: parts
70
  })
71
 
72
- // Make request to Gemini API
73
- const response = await fetch(`${GEMINI_API_URL}?key=${GEMINI_API_KEY}`, {
74
- method: 'POST',
75
  headers: {
76
- 'Content-Type': 'application/json',
 
 
77
  },
78
- body: JSON.stringify(requestBody)
79
- })
80
-
81
- if (!response.ok) {
82
- const errorText = await response.text()
83
- console.error('Gemini API error:', errorText)
84
- return NextResponse.json(
85
- { error: 'Failed to get response from Gemini', details: errorText },
86
- { status: response.status }
87
- )
88
- }
89
-
90
- const data = await response.json()
91
-
92
- if (!data.candidates || data.candidates.length === 0) {
93
- return NextResponse.json(
94
- { error: 'No response generated' },
95
- { status: 500 }
96
- )
97
- }
98
-
99
- const generatedText = data.candidates[0].content.parts[0].text
100
-
101
- return NextResponse.json({
102
- response: generatedText
103
  })
104
 
105
  } catch (error) {
106
  console.error('Error in Gemini chat API:', error)
107
- const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
108
  return NextResponse.json(
109
- { error: 'Failed to process request', details: errorMessage },
110
  { status: 500 }
111
  )
112
  }
 
1
  import { NextRequest, NextResponse } from 'next/server'
2
+ import { GoogleGenAI } from "@google/genai"
 
 
3
 
4
  export async function POST(request: NextRequest) {
5
  try {
6
+ const { message, history } = await request.json()
7
+ const apiKey = process.env.GEMINI_API_KEY
8
 
9
+ if (!apiKey) {
10
  return NextResponse.json(
11
+ { error: 'Gemini API key not configured' },
12
  { status: 500 }
13
  )
14
  }
15
 
16
+ const ai = new GoogleGenAI({ apiKey })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
+ // Convert history to Gemini format
19
+ const contents = history?.map((msg: any) => ({
20
+ role: msg.role === 'assistant' ? 'model' : 'user',
21
+ parts: [{ text: msg.content }]
22
+ })) || []
23
 
24
+ // Add current message
25
+ contents.push({
26
+ role: 'user',
27
+ parts: [{ text: message }]
28
+ })
29
 
30
+ const stream = new ReadableStream({
31
+ async start(controller) {
32
+ try {
33
+ const result = await ai.models.generateContentStream({
34
+ model: 'gemini-flash-latest',
35
+ contents,
36
+ config: {
37
+ thinkingConfig: {
38
+ includeThoughts: true
39
+ }
40
+ }
41
+ })
42
+
43
+ for await (const chunk of result) {
44
+ // Extract text and thoughts
45
+ const text = chunk.text
46
+
47
+ // Check for thoughts in the candidates
48
+ // Note: The SDK structure for thoughts might vary, checking parts
49
+ let thought = ''
50
+ if (chunk.candidates?.[0]?.content?.parts) {
51
+ for (const part of chunk.candidates[0].content.parts) {
52
+ // @ts-ignore - thought property might exist on part in newer models/SDKs
53
+ if (part.thought) {
54
+ // @ts-ignore
55
+ thought += part.thought
56
+ }
57
+ }
58
+ }
59
+
60
+ const data = JSON.stringify({ text, thought })
61
+ controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`))
62
+ }
63
+ controller.close()
64
+ } catch (error) {
65
+ console.error('Streaming error:', error)
66
+ controller.error(error)
67
  }
68
+ }
 
 
 
 
 
69
  })
70
 
71
+ return new NextResponse(stream, {
 
 
72
  headers: {
73
+ 'Content-Type': 'text/event-stream',
74
+ 'Cache-Control': 'no-cache',
75
+ 'Connection': 'keep-alive',
76
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  })
78
 
79
  } catch (error) {
80
  console.error('Error in Gemini chat API:', error)
 
81
  return NextResponse.json(
82
+ { error: 'Failed to process request' },
83
  { status: 500 }
84
  )
85
  }
app/components/GeminiChat.tsx CHANGED
@@ -20,6 +20,7 @@ interface Message {
20
  id: string
21
  role: 'user' | 'assistant'
22
  content: string
 
23
  timestamp: number
24
  }
25
 
@@ -97,35 +98,56 @@ export function GeminiChat({ onClose, onMinimize, onMaximize, onFocus, zIndex }:
97
  }),
98
  })
99
 
100
- const data = await response.json()
101
 
102
- if (response.ok && data.response) {
103
- const assistantMessage: Message = {
104
- id: (Date.now() + 1).toString(),
105
- role: 'assistant',
106
- content: data.response,
107
- timestamp: Date.now()
108
- }
109
- setMessages(prev => [...prev, assistantMessage])
110
- } else {
111
- // Fallback response if API fails
112
- const fallbackResponses = [
113
- "I'm here to help! What would you like to know?",
114
- "That's interesting! Tell me more about it.",
115
- "I can help with that! Let me think about the best approach.",
116
- "Great question! Here's what I think...",
117
- "I understand. Let me help you with that."
118
- ]
119
- const randomResponse = fallbackResponses[Math.floor(Math.random() * fallbackResponses.length)]
 
 
120
 
121
- const assistantMessage: Message = {
122
- id: (Date.now() + 1).toString(),
123
- role: 'assistant',
124
- content: randomResponse,
125
- timestamp: Date.now()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  }
127
- setMessages(prev => [...prev, assistantMessage])
128
  }
 
129
  } catch (error) {
130
  console.error('Error sending message:', error)
131
  const errorMessage: Message = {
@@ -162,7 +184,7 @@ export function GeminiChat({ onClose, onMinimize, onMaximize, onFocus, zIndex }:
162
  return (
163
  <Window
164
  id="gemini"
165
- title="Gemini Ultra"
166
  isOpen={true}
167
  onClose={onClose}
168
  onMinimize={onMinimize}
@@ -182,7 +204,7 @@ export function GeminiChat({ onClose, onMinimize, onMaximize, onFocus, zIndex }:
182
  <Sparkle size={18} weight="fill" className="text-white" />
183
  </div>
184
  <span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-500 to-pink-600 font-bold">
185
- Gemini Ultra
186
  </span>
187
  </div>
188
  <button
@@ -212,12 +234,20 @@ export function GeminiChat({ onClose, onMinimize, onMaximize, onFocus, zIndex }:
212
  {message.role === 'assistant' && (
213
  <p className="font-semibold text-blue-600 mb-1 text-xs">Gemini</p>
214
  )}
 
 
 
 
 
 
 
 
215
  <p className="whitespace-pre-wrap">{message.content}</p>
216
  </div>
217
  </div>
218
  ))}
219
 
220
- {isLoading && (
221
  <div className="flex justify-start">
222
  <div className="bg-gray-100 rounded-2xl rounded-tl-none px-4 py-3 text-sm">
223
  <p className="font-semibold text-blue-600 mb-1 text-xs">Gemini</p>
 
20
  id: string
21
  role: 'user' | 'assistant'
22
  content: string
23
+ thought?: string
24
  timestamp: number
25
  }
26
 
 
98
  }),
99
  })
100
 
101
+ if (!response.ok) throw new Error('Network response was not ok')
102
 
103
+ const reader = response.body?.getReader()
104
+ const decoder = new TextDecoder()
105
+
106
+ // Create a placeholder message
107
+ const assistantMessage: Message = {
108
+ id: (Date.now() + 1).toString(),
109
+ role: 'assistant',
110
+ content: '',
111
+ thought: '',
112
+ timestamp: Date.now()
113
+ }
114
+ setMessages(prev => [...prev, assistantMessage])
115
+
116
+ if (reader) {
117
+ while (true) {
118
+ const { done, value } = await reader.read()
119
+ if (done) break
120
+
121
+ const chunk = decoder.decode(value, { stream: true })
122
+ const lines = chunk.split('\n\n')
123
 
124
+ for (const line of lines) {
125
+ if (line.startsWith('data: ')) {
126
+ try {
127
+ const data = JSON.parse(line.slice(6))
128
+ setMessages(prev => {
129
+ const newMessages = [...prev]
130
+ const lastMsg = newMessages[newMessages.length - 1]
131
+ if (lastMsg.id === assistantMessage.id) {
132
+ return [
133
+ ...newMessages.slice(0, -1),
134
+ {
135
+ ...lastMsg,
136
+ content: lastMsg.content + (data.text || ''),
137
+ thought: (lastMsg.thought || '') + (data.thought || '')
138
+ }
139
+ ]
140
+ }
141
+ return newMessages
142
+ })
143
+ } catch (e) {
144
+ console.error('Error parsing chunk:', e)
145
+ }
146
+ }
147
+ }
148
  }
 
149
  }
150
+
151
  } catch (error) {
152
  console.error('Error sending message:', error)
153
  const errorMessage: Message = {
 
184
  return (
185
  <Window
186
  id="gemini"
187
+ title="Gemini"
188
  isOpen={true}
189
  onClose={onClose}
190
  onMinimize={onMinimize}
 
204
  <Sparkle size={18} weight="fill" className="text-white" />
205
  </div>
206
  <span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-500 to-pink-600 font-bold">
207
+ Gemini
208
  </span>
209
  </div>
210
  <button
 
234
  {message.role === 'assistant' && (
235
  <p className="font-semibold text-blue-600 mb-1 text-xs">Gemini</p>
236
  )}
237
+ {message.thought && (
238
+ <div className="mb-2 p-2 bg-white/50 rounded text-xs text-gray-600 border border-gray-200/50 italic">
239
+ <div className="font-semibold mb-1 not-italic flex items-center gap-1">
240
+ <Sparkle size={12} /> Thinking Process:
241
+ </div>
242
+ {message.thought}
243
+ </div>
244
+ )}
245
  <p className="whitespace-pre-wrap">{message.content}</p>
246
  </div>
247
  </div>
248
  ))}
249
 
250
+ {isLoading && messages[messages.length - 1].role === 'user' && (
251
  <div className="flex justify-start">
252
  <div className="bg-gray-100 rounded-2xl rounded-tl-none px-4 py-3 text-sm">
253
  <p className="font-semibold text-blue-600 mb-1 text-xs">Gemini</p>
package-lock.json CHANGED
@@ -9,6 +9,7 @@
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "@github/spark": "^0.41.23",
 
12
  "@modelcontextprotocol/sdk": "^1.22.0",
13
  "@monaco-editor/react": "^4.7.0",
14
  "@phosphor-icons/react": "^2.1.10",
@@ -986,6 +987,48 @@
986
  "vite": "^6.2.0"
987
  }
988
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
989
  "node_modules/@humanfs/core": {
990
  "version": "0.19.1",
991
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -1503,6 +1546,96 @@
1503
  "url": "https://opencollective.com/libvips"
1504
  }
1505
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1506
  "node_modules/@jonkemp/package-utils": {
1507
  "version": "1.0.8",
1508
  "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz",
@@ -2380,6 +2513,16 @@
2380
  "react-dom": ">= 16.8"
2381
  }
2382
  },
 
 
 
 
 
 
 
 
 
 
2383
  "node_modules/@puppeteer/browsers": {
2384
  "version": "2.10.13",
2385
  "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz",
@@ -4373,6 +4516,15 @@
4373
  "node": ">=0.6"
4374
  }
4375
  },
 
 
 
 
 
 
 
 
 
4376
  "node_modules/binary": {
4377
  "version": "0.3.0",
4378
  "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
@@ -4548,6 +4700,12 @@
4548
  "node": "*"
4549
  }
4550
  },
 
 
 
 
 
 
4551
  "node_modules/buffer-indexof-polyfill": {
4552
  "version": "1.0.2",
4553
  "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
@@ -5387,6 +5545,21 @@
5387
  "readable-stream": "^2.0.2"
5388
  }
5389
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5390
  "node_modules/ee-first": {
5391
  "version": "1.1.1",
5392
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -5404,7 +5577,6 @@
5404
  "version": "9.2.2",
5405
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
5406
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
5407
- "dev": true,
5408
  "license": "MIT"
5409
  },
5410
  "node_modules/encodeurl": {
@@ -6295,6 +6467,12 @@
6295
  "node": ">= 0.6"
6296
  }
6297
  },
 
 
 
 
 
 
6298
  "node_modules/extract-css": {
6299
  "version": "2.0.1",
6300
  "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz",
@@ -6616,6 +6794,22 @@
6616
  "url": "https://github.com/sponsors/ljharb"
6617
  }
6618
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6619
  "node_modules/form-data": {
6620
  "version": "4.0.4",
6621
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
@@ -6804,6 +6998,116 @@
6804
  "url": "https://github.com/sponsors/ljharb"
6805
  }
6806
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6807
  "node_modules/generator-function": {
6808
  "version": "2.0.1",
6809
  "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
@@ -6994,6 +7298,33 @@
6994
  "url": "https://github.com/sponsors/ljharb"
6995
  }
6996
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6997
  "node_modules/gopd": {
6998
  "version": "1.2.0",
6999
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -7019,6 +7350,19 @@
7019
  "dev": true,
7020
  "license": "MIT"
7021
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
7022
  "node_modules/handlebars": {
7023
  "version": "4.7.8",
7024
  "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
@@ -7877,6 +8221,21 @@
7877
  "node": ">= 0.4"
7878
  }
7879
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7880
  "node_modules/jiti": {
7881
  "version": "2.6.1",
7882
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
@@ -7925,6 +8284,15 @@
7925
  "node": ">=6"
7926
  }
7927
  },
 
 
 
 
 
 
 
 
 
7928
  "node_modules/json-buffer": {
7929
  "version": "3.0.1",
7930
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -7992,6 +8360,27 @@
7992
  "setimmediate": "^1.0.5"
7993
  }
7994
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7995
  "node_modules/katex": {
7996
  "version": "0.16.25",
7997
  "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz",
@@ -8785,6 +9174,15 @@
8785
  "url": "https://github.com/sponsors/ljharb"
8786
  }
8787
  },
 
 
 
 
 
 
 
 
 
8788
  "node_modules/mitt": {
8789
  "version": "3.0.1",
8790
  "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
@@ -9416,6 +9814,12 @@
9416
  "node": ">= 14"
9417
  }
9418
  },
 
 
 
 
 
 
9419
  "node_modules/pako": {
9420
  "version": "1.0.11",
9421
  "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
@@ -9478,6 +9882,28 @@
9478
  "dev": true,
9479
  "license": "MIT"
9480
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9481
  "node_modules/path-to-regexp": {
9482
  "version": "8.3.0",
9483
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
@@ -10975,6 +11401,18 @@
10975
  "url": "https://github.com/sponsors/ljharb"
10976
  }
10977
  },
 
 
 
 
 
 
 
 
 
 
 
 
10978
  "node_modules/slick": {
10979
  "version": "1.12.2",
10980
  "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz",
@@ -11146,6 +11584,27 @@
11146
  "node": ">=8"
11147
  }
11148
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11149
  "node_modules/string-width/node_modules/emoji-regex": {
11150
  "version": "8.0.0",
11151
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -11277,6 +11736,19 @@
11277
  "node": ">=8"
11278
  }
11279
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
11280
  "node_modules/strip-bom": {
11281
  "version": "3.0.0",
11282
  "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -12323,6 +12795,24 @@
12323
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
12324
  }
12325
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12326
  "node_modules/wrappy": {
12327
  "version": "1.0.2",
12328
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "@github/spark": "^0.41.23",
12
+ "@google/genai": "^1.30.0",
13
  "@modelcontextprotocol/sdk": "^1.22.0",
14
  "@monaco-editor/react": "^4.7.0",
15
  "@phosphor-icons/react": "^2.1.10",
 
987
  "vite": "^6.2.0"
988
  }
989
  },
990
+ "node_modules/@google/genai": {
991
+ "version": "1.30.0",
992
+ "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.30.0.tgz",
993
+ "integrity": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==",
994
+ "license": "Apache-2.0",
995
+ "dependencies": {
996
+ "google-auth-library": "^10.3.0",
997
+ "ws": "^8.18.0"
998
+ },
999
+ "engines": {
1000
+ "node": ">=20.0.0"
1001
+ },
1002
+ "peerDependencies": {
1003
+ "@modelcontextprotocol/sdk": "^1.20.1"
1004
+ },
1005
+ "peerDependenciesMeta": {
1006
+ "@modelcontextprotocol/sdk": {
1007
+ "optional": true
1008
+ }
1009
+ }
1010
+ },
1011
+ "node_modules/@google/genai/node_modules/ws": {
1012
+ "version": "8.18.3",
1013
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
1014
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
1015
+ "license": "MIT",
1016
+ "engines": {
1017
+ "node": ">=10.0.0"
1018
+ },
1019
+ "peerDependencies": {
1020
+ "bufferutil": "^4.0.1",
1021
+ "utf-8-validate": ">=5.0.2"
1022
+ },
1023
+ "peerDependenciesMeta": {
1024
+ "bufferutil": {
1025
+ "optional": true
1026
+ },
1027
+ "utf-8-validate": {
1028
+ "optional": true
1029
+ }
1030
+ }
1031
+ },
1032
  "node_modules/@humanfs/core": {
1033
  "version": "0.19.1",
1034
  "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
 
1546
  "url": "https://opencollective.com/libvips"
1547
  }
1548
  },
1549
+ "node_modules/@isaacs/cliui": {
1550
+ "version": "8.0.2",
1551
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1552
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1553
+ "license": "ISC",
1554
+ "dependencies": {
1555
+ "string-width": "^5.1.2",
1556
+ "string-width-cjs": "npm:string-width@^4.2.0",
1557
+ "strip-ansi": "^7.0.1",
1558
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
1559
+ "wrap-ansi": "^8.1.0",
1560
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
1561
+ },
1562
+ "engines": {
1563
+ "node": ">=12"
1564
+ }
1565
+ },
1566
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
1567
+ "version": "6.2.2",
1568
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
1569
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
1570
+ "license": "MIT",
1571
+ "engines": {
1572
+ "node": ">=12"
1573
+ },
1574
+ "funding": {
1575
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1576
+ }
1577
+ },
1578
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
1579
+ "version": "6.2.3",
1580
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
1581
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
1582
+ "license": "MIT",
1583
+ "engines": {
1584
+ "node": ">=12"
1585
+ },
1586
+ "funding": {
1587
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1588
+ }
1589
+ },
1590
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
1591
+ "version": "5.1.2",
1592
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1593
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1594
+ "license": "MIT",
1595
+ "dependencies": {
1596
+ "eastasianwidth": "^0.2.0",
1597
+ "emoji-regex": "^9.2.2",
1598
+ "strip-ansi": "^7.0.1"
1599
+ },
1600
+ "engines": {
1601
+ "node": ">=12"
1602
+ },
1603
+ "funding": {
1604
+ "url": "https://github.com/sponsors/sindresorhus"
1605
+ }
1606
+ },
1607
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
1608
+ "version": "7.1.2",
1609
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
1610
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
1611
+ "license": "MIT",
1612
+ "dependencies": {
1613
+ "ansi-regex": "^6.0.1"
1614
+ },
1615
+ "engines": {
1616
+ "node": ">=12"
1617
+ },
1618
+ "funding": {
1619
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1620
+ }
1621
+ },
1622
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
1623
+ "version": "8.1.0",
1624
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
1625
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1626
+ "license": "MIT",
1627
+ "dependencies": {
1628
+ "ansi-styles": "^6.1.0",
1629
+ "string-width": "^5.0.1",
1630
+ "strip-ansi": "^7.0.1"
1631
+ },
1632
+ "engines": {
1633
+ "node": ">=12"
1634
+ },
1635
+ "funding": {
1636
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1637
+ }
1638
+ },
1639
  "node_modules/@jonkemp/package-utils": {
1640
  "version": "1.0.8",
1641
  "resolved": "https://registry.npmjs.org/@jonkemp/package-utils/-/package-utils-1.0.8.tgz",
 
2513
  "react-dom": ">= 16.8"
2514
  }
2515
  },
2516
+ "node_modules/@pkgjs/parseargs": {
2517
+ "version": "0.11.0",
2518
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
2519
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
2520
+ "license": "MIT",
2521
+ "optional": true,
2522
+ "engines": {
2523
+ "node": ">=14"
2524
+ }
2525
+ },
2526
  "node_modules/@puppeteer/browsers": {
2527
  "version": "2.10.13",
2528
  "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz",
 
4516
  "node": ">=0.6"
4517
  }
4518
  },
4519
+ "node_modules/bignumber.js": {
4520
+ "version": "9.3.1",
4521
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
4522
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
4523
+ "license": "MIT",
4524
+ "engines": {
4525
+ "node": "*"
4526
+ }
4527
+ },
4528
  "node_modules/binary": {
4529
  "version": "0.3.0",
4530
  "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
 
4700
  "node": "*"
4701
  }
4702
  },
4703
+ "node_modules/buffer-equal-constant-time": {
4704
+ "version": "1.0.1",
4705
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
4706
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
4707
+ "license": "BSD-3-Clause"
4708
+ },
4709
  "node_modules/buffer-indexof-polyfill": {
4710
  "version": "1.0.2",
4711
  "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
 
5545
  "readable-stream": "^2.0.2"
5546
  }
5547
  },
5548
+ "node_modules/eastasianwidth": {
5549
+ "version": "0.2.0",
5550
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
5551
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
5552
+ "license": "MIT"
5553
+ },
5554
+ "node_modules/ecdsa-sig-formatter": {
5555
+ "version": "1.0.11",
5556
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
5557
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
5558
+ "license": "Apache-2.0",
5559
+ "dependencies": {
5560
+ "safe-buffer": "^5.0.1"
5561
+ }
5562
+ },
5563
  "node_modules/ee-first": {
5564
  "version": "1.1.1",
5565
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 
5577
  "version": "9.2.2",
5578
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
5579
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
 
5580
  "license": "MIT"
5581
  },
5582
  "node_modules/encodeurl": {
 
6467
  "node": ">= 0.6"
6468
  }
6469
  },
6470
+ "node_modules/extend": {
6471
+ "version": "3.0.2",
6472
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
6473
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
6474
+ "license": "MIT"
6475
+ },
6476
  "node_modules/extract-css": {
6477
  "version": "2.0.1",
6478
  "resolved": "https://registry.npmjs.org/extract-css/-/extract-css-2.0.1.tgz",
 
6794
  "url": "https://github.com/sponsors/ljharb"
6795
  }
6796
  },
6797
+ "node_modules/foreground-child": {
6798
+ "version": "3.3.1",
6799
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
6800
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
6801
+ "license": "ISC",
6802
+ "dependencies": {
6803
+ "cross-spawn": "^7.0.6",
6804
+ "signal-exit": "^4.0.1"
6805
+ },
6806
+ "engines": {
6807
+ "node": ">=14"
6808
+ },
6809
+ "funding": {
6810
+ "url": "https://github.com/sponsors/isaacs"
6811
+ }
6812
+ },
6813
  "node_modules/form-data": {
6814
  "version": "4.0.4",
6815
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
 
6998
  "url": "https://github.com/sponsors/ljharb"
6999
  }
7000
  },
7001
+ "node_modules/gaxios": {
7002
+ "version": "7.1.3",
7003
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz",
7004
+ "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==",
7005
+ "license": "Apache-2.0",
7006
+ "dependencies": {
7007
+ "extend": "^3.0.2",
7008
+ "https-proxy-agent": "^7.0.1",
7009
+ "node-fetch": "^3.3.2",
7010
+ "rimraf": "^5.0.1"
7011
+ },
7012
+ "engines": {
7013
+ "node": ">=18"
7014
+ }
7015
+ },
7016
+ "node_modules/gaxios/node_modules/agent-base": {
7017
+ "version": "7.1.4",
7018
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
7019
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
7020
+ "license": "MIT",
7021
+ "engines": {
7022
+ "node": ">= 14"
7023
+ }
7024
+ },
7025
+ "node_modules/gaxios/node_modules/brace-expansion": {
7026
+ "version": "2.0.2",
7027
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
7028
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
7029
+ "license": "MIT",
7030
+ "dependencies": {
7031
+ "balanced-match": "^1.0.0"
7032
+ }
7033
+ },
7034
+ "node_modules/gaxios/node_modules/glob": {
7035
+ "version": "10.5.0",
7036
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
7037
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
7038
+ "license": "ISC",
7039
+ "dependencies": {
7040
+ "foreground-child": "^3.1.0",
7041
+ "jackspeak": "^3.1.2",
7042
+ "minimatch": "^9.0.4",
7043
+ "minipass": "^7.1.2",
7044
+ "package-json-from-dist": "^1.0.0",
7045
+ "path-scurry": "^1.11.1"
7046
+ },
7047
+ "bin": {
7048
+ "glob": "dist/esm/bin.mjs"
7049
+ },
7050
+ "funding": {
7051
+ "url": "https://github.com/sponsors/isaacs"
7052
+ }
7053
+ },
7054
+ "node_modules/gaxios/node_modules/https-proxy-agent": {
7055
+ "version": "7.0.6",
7056
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
7057
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
7058
+ "license": "MIT",
7059
+ "dependencies": {
7060
+ "agent-base": "^7.1.2",
7061
+ "debug": "4"
7062
+ },
7063
+ "engines": {
7064
+ "node": ">= 14"
7065
+ }
7066
+ },
7067
+ "node_modules/gaxios/node_modules/minimatch": {
7068
+ "version": "9.0.5",
7069
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
7070
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
7071
+ "license": "ISC",
7072
+ "dependencies": {
7073
+ "brace-expansion": "^2.0.1"
7074
+ },
7075
+ "engines": {
7076
+ "node": ">=16 || 14 >=14.17"
7077
+ },
7078
+ "funding": {
7079
+ "url": "https://github.com/sponsors/isaacs"
7080
+ }
7081
+ },
7082
+ "node_modules/gaxios/node_modules/rimraf": {
7083
+ "version": "5.0.10",
7084
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
7085
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
7086
+ "license": "ISC",
7087
+ "dependencies": {
7088
+ "glob": "^10.3.7"
7089
+ },
7090
+ "bin": {
7091
+ "rimraf": "dist/esm/bin.mjs"
7092
+ },
7093
+ "funding": {
7094
+ "url": "https://github.com/sponsors/isaacs"
7095
+ }
7096
+ },
7097
+ "node_modules/gcp-metadata": {
7098
+ "version": "8.1.2",
7099
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
7100
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
7101
+ "license": "Apache-2.0",
7102
+ "dependencies": {
7103
+ "gaxios": "^7.0.0",
7104
+ "google-logging-utils": "^1.0.0",
7105
+ "json-bigint": "^1.0.0"
7106
+ },
7107
+ "engines": {
7108
+ "node": ">=18"
7109
+ }
7110
+ },
7111
  "node_modules/generator-function": {
7112
  "version": "2.0.1",
7113
  "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
 
7298
  "url": "https://github.com/sponsors/ljharb"
7299
  }
7300
  },
7301
+ "node_modules/google-auth-library": {
7302
+ "version": "10.5.0",
7303
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz",
7304
+ "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==",
7305
+ "license": "Apache-2.0",
7306
+ "dependencies": {
7307
+ "base64-js": "^1.3.0",
7308
+ "ecdsa-sig-formatter": "^1.0.11",
7309
+ "gaxios": "^7.0.0",
7310
+ "gcp-metadata": "^8.0.0",
7311
+ "google-logging-utils": "^1.0.0",
7312
+ "gtoken": "^8.0.0",
7313
+ "jws": "^4.0.0"
7314
+ },
7315
+ "engines": {
7316
+ "node": ">=18"
7317
+ }
7318
+ },
7319
+ "node_modules/google-logging-utils": {
7320
+ "version": "1.1.3",
7321
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
7322
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
7323
+ "license": "Apache-2.0",
7324
+ "engines": {
7325
+ "node": ">=14"
7326
+ }
7327
+ },
7328
  "node_modules/gopd": {
7329
  "version": "1.2.0",
7330
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 
7350
  "dev": true,
7351
  "license": "MIT"
7352
  },
7353
+ "node_modules/gtoken": {
7354
+ "version": "8.0.0",
7355
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
7356
+ "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==",
7357
+ "license": "MIT",
7358
+ "dependencies": {
7359
+ "gaxios": "^7.0.0",
7360
+ "jws": "^4.0.0"
7361
+ },
7362
+ "engines": {
7363
+ "node": ">=18"
7364
+ }
7365
+ },
7366
  "node_modules/handlebars": {
7367
  "version": "4.7.8",
7368
  "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
 
8221
  "node": ">= 0.4"
8222
  }
8223
  },
8224
+ "node_modules/jackspeak": {
8225
+ "version": "3.4.3",
8226
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
8227
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
8228
+ "license": "BlueOak-1.0.0",
8229
+ "dependencies": {
8230
+ "@isaacs/cliui": "^8.0.2"
8231
+ },
8232
+ "funding": {
8233
+ "url": "https://github.com/sponsors/isaacs"
8234
+ },
8235
+ "optionalDependencies": {
8236
+ "@pkgjs/parseargs": "^0.11.0"
8237
+ }
8238
+ },
8239
  "node_modules/jiti": {
8240
  "version": "2.6.1",
8241
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
 
8284
  "node": ">=6"
8285
  }
8286
  },
8287
+ "node_modules/json-bigint": {
8288
+ "version": "1.0.0",
8289
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
8290
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
8291
+ "license": "MIT",
8292
+ "dependencies": {
8293
+ "bignumber.js": "^9.0.0"
8294
+ }
8295
+ },
8296
  "node_modules/json-buffer": {
8297
  "version": "3.0.1",
8298
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
 
8360
  "setimmediate": "^1.0.5"
8361
  }
8362
  },
8363
+ "node_modules/jwa": {
8364
+ "version": "2.0.1",
8365
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
8366
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
8367
+ "license": "MIT",
8368
+ "dependencies": {
8369
+ "buffer-equal-constant-time": "^1.0.1",
8370
+ "ecdsa-sig-formatter": "1.0.11",
8371
+ "safe-buffer": "^5.0.1"
8372
+ }
8373
+ },
8374
+ "node_modules/jws": {
8375
+ "version": "4.0.0",
8376
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
8377
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
8378
+ "license": "MIT",
8379
+ "dependencies": {
8380
+ "jwa": "^2.0.0",
8381
+ "safe-buffer": "^5.0.1"
8382
+ }
8383
+ },
8384
  "node_modules/katex": {
8385
  "version": "0.16.25",
8386
  "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz",
 
9174
  "url": "https://github.com/sponsors/ljharb"
9175
  }
9176
  },
9177
+ "node_modules/minipass": {
9178
+ "version": "7.1.2",
9179
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
9180
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
9181
+ "license": "ISC",
9182
+ "engines": {
9183
+ "node": ">=16 || 14 >=14.17"
9184
+ }
9185
+ },
9186
  "node_modules/mitt": {
9187
  "version": "3.0.1",
9188
  "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
 
9814
  "node": ">= 14"
9815
  }
9816
  },
9817
+ "node_modules/package-json-from-dist": {
9818
+ "version": "1.0.1",
9819
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
9820
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
9821
+ "license": "BlueOak-1.0.0"
9822
+ },
9823
  "node_modules/pako": {
9824
  "version": "1.0.11",
9825
  "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
 
9882
  "dev": true,
9883
  "license": "MIT"
9884
  },
9885
+ "node_modules/path-scurry": {
9886
+ "version": "1.11.1",
9887
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
9888
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
9889
+ "license": "BlueOak-1.0.0",
9890
+ "dependencies": {
9891
+ "lru-cache": "^10.2.0",
9892
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
9893
+ },
9894
+ "engines": {
9895
+ "node": ">=16 || 14 >=14.18"
9896
+ },
9897
+ "funding": {
9898
+ "url": "https://github.com/sponsors/isaacs"
9899
+ }
9900
+ },
9901
+ "node_modules/path-scurry/node_modules/lru-cache": {
9902
+ "version": "10.4.3",
9903
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
9904
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
9905
+ "license": "ISC"
9906
+ },
9907
  "node_modules/path-to-regexp": {
9908
  "version": "8.3.0",
9909
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
 
11401
  "url": "https://github.com/sponsors/ljharb"
11402
  }
11403
  },
11404
+ "node_modules/signal-exit": {
11405
+ "version": "4.1.0",
11406
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
11407
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
11408
+ "license": "ISC",
11409
+ "engines": {
11410
+ "node": ">=14"
11411
+ },
11412
+ "funding": {
11413
+ "url": "https://github.com/sponsors/isaacs"
11414
+ }
11415
+ },
11416
  "node_modules/slick": {
11417
  "version": "1.12.2",
11418
  "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz",
 
11584
  "node": ">=8"
11585
  }
11586
  },
11587
+ "node_modules/string-width-cjs": {
11588
+ "name": "string-width",
11589
+ "version": "4.2.3",
11590
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
11591
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
11592
+ "license": "MIT",
11593
+ "dependencies": {
11594
+ "emoji-regex": "^8.0.0",
11595
+ "is-fullwidth-code-point": "^3.0.0",
11596
+ "strip-ansi": "^6.0.1"
11597
+ },
11598
+ "engines": {
11599
+ "node": ">=8"
11600
+ }
11601
+ },
11602
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
11603
+ "version": "8.0.0",
11604
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
11605
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
11606
+ "license": "MIT"
11607
+ },
11608
  "node_modules/string-width/node_modules/emoji-regex": {
11609
  "version": "8.0.0",
11610
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 
11736
  "node": ">=8"
11737
  }
11738
  },
11739
+ "node_modules/strip-ansi-cjs": {
11740
+ "name": "strip-ansi",
11741
+ "version": "6.0.1",
11742
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
11743
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
11744
+ "license": "MIT",
11745
+ "dependencies": {
11746
+ "ansi-regex": "^5.0.1"
11747
+ },
11748
+ "engines": {
11749
+ "node": ">=8"
11750
+ }
11751
+ },
11752
  "node_modules/strip-bom": {
11753
  "version": "3.0.0",
11754
  "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
 
12795
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
12796
  }
12797
  },
12798
+ "node_modules/wrap-ansi-cjs": {
12799
+ "name": "wrap-ansi",
12800
+ "version": "7.0.0",
12801
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
12802
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
12803
+ "license": "MIT",
12804
+ "dependencies": {
12805
+ "ansi-styles": "^4.0.0",
12806
+ "string-width": "^4.1.0",
12807
+ "strip-ansi": "^6.0.0"
12808
+ },
12809
+ "engines": {
12810
+ "node": ">=10"
12811
+ },
12812
+ "funding": {
12813
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
12814
+ }
12815
+ },
12816
  "node_modules/wrappy": {
12817
  "version": "1.0.2",
12818
  "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
package.json CHANGED
@@ -13,6 +13,7 @@
13
  },
14
  "dependencies": {
15
  "@github/spark": "^0.41.23",
 
16
  "@modelcontextprotocol/sdk": "^1.22.0",
17
  "@monaco-editor/react": "^4.7.0",
18
  "@phosphor-icons/react": "^2.1.10",
 
13
  },
14
  "dependencies": {
15
  "@github/spark": "^0.41.23",
16
+ "@google/genai": "^1.30.0",
17
  "@modelcontextprotocol/sdk": "^1.22.0",
18
  "@monaco-editor/react": "^4.7.0",
19
  "@phosphor-icons/react": "^2.1.10",