feat: Improve retrieval tool and enhance UI for retrieval and web search tool

This commit is contained in:
zaidmukaddam 2024-08-22 14:55:24 +05:30
parent cf0e0fe2aa
commit 91a6a8ad4e
4 changed files with 297 additions and 100 deletions

View File

@ -1,6 +1,7 @@
import { openai } from '@ai-sdk/openai'
import { convertToCoreMessages, streamText, tool } from "ai";
import { CodeInterpreter } from "@e2b/code-interpreter";
import FirecrawlApp from '@mendable/firecrawl-js';
import { z } from "zod";
import { geolocation } from "@vercel/functions";
@ -163,52 +164,32 @@ Just run the tool and provide the answer.`,
},
}),
retrieve: tool({
description: "Retrieve the information from a URL.",
description: "Retrieve the information from a URL using Firecrawl.",
parameters: z.object({
url: z.string().describe("The URL to retrieve the information from."),
}),
execute: async ({ url }: { url: string }) => {
let hasError = false;
let results;
const app = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
try {
const response = await fetch(`https://r.jina.ai/${url}`, {
method: "GET",
headers: {
Accept: "application/json",
"X-With-Generated-Alt": "true",
},
});
const json = await response.json();
if (!json.data || json.data.length === 0) {
hasError = true;
} else {
// Limit the content to 5000 characters
if (json.data.content.length > 5000) {
json.data.content = json.data.content.slice(0, 5000);
}
results = {
results: [
{
title: json.data.title,
content: json.data.content,
url: json.data.url,
},
],
query: "",
images: [],
};
const content = await app.scrapeUrl(url);
if (!content.data) {
return { error: "Failed to retrieve content" };
}
return {
results: [
{
title: content.data.metadata.title,
content: content.data.markdown,
url: content.data.metadata.sourceURL,
description: content.data.metadata.description,
language: content.data.metadata.language,
},
],
};
} catch (error) {
hasError = true;
console.error("Retrieve API error:", error);
console.error("Firecrawl API error:", error);
return { error: "Failed to retrieve content" };
}
if (hasError || !results) {
return results;
}
return results;
},
}),
get_weather_data: tool({

View File

@ -841,6 +841,152 @@ export default function Home() {
);
}
if (toolInvocation.toolName === 'web_search') {
return (
<div>
{!result ? (
<div className="flex items-center justify-between w-full">
<div className='flex items-center gap-2'>
<Globe className="h-5 w-5 text-neutral-700 animate-spin" />
<span className="text-neutral-700 text-lg">Running a search...</span>
</div>
<div className="flex space-x-1">
{[0, 1, 2].map((index) => (
<motion.div
key={index}
className="w-2 h-2 bg-muted-foreground rounded-full"
initial={{ opacity: 0.3 }}
animate={{ opacity: 1 }}
transition={{
repeat: Infinity,
duration: 0.8,
delay: index * 0.2,
repeatType: "reverse",
}}
/>
))}
</div>
</div>
) : (
<Accordion type="single" collapsible className="w-full mt-4">
<AccordionItem value={`item-${index}`} className='border-none'>
<AccordionTrigger className="hover:no-underline py-2">
<div className="flex items-center justify-between w-full">
<div className="flex items-center gap-2">
<Newspaper className="h-5 w-5 text-primary" />
<h2 className='text-base font-semibold'>Sources Found</h2>
</div>
{result && (
<Badge variant="secondary" className='rounded-full'>{result.results.length} results</Badge>
)}
</div>
</AccordionTrigger>
<AccordionContent>
{args?.query && (
<Badge variant="secondary" className="mb-4 text-xs sm:text-sm font-light rounded-full">
<SearchIcon className="h-3 w-3 sm:h-4 sm:w-4 mr-1" />
{args.query}
</Badge>
)}
{result && (
<div className="flex flex-col sm:flex-row gap-4 overflow-x-auto pb-2">
{result.results.map((item: any, itemIndex: number) => (
<div key={itemIndex} className="flex flex-col w-full sm:w-[280px] flex-shrink-0 bg-card border rounded-lg p-3">
<div className="flex items-start gap-3 mb-2">
<Image
width={48}
height={48}
unoptimized
quality={100}
src={`https://www.google.com/s2/favicons?sz=128&domain=${new URL(item.url).hostname}`}
alt="Favicon"
className="w-8 h-8 sm:w-12 sm:h-12 flex-shrink-0 rounded-sm"
/>
<div className="flex-grow min-w-0">
<h3 className="text-sm font-semibold line-clamp-2">{item.title}</h3>
<p className="text-xs text-muted-foreground line-clamp-2 mt-1">{item.content}</p>
</div>
</div>
<a
href={item.url}
target="_blank"
rel="noopener noreferrer"
className="text-xs text-primary truncate hover:underline"
>
{item.url}
</a>
</div>
))}
</div>
)}
</AccordionContent>
</AccordionItem>
</Accordion>
)}
</div>
);
}
if (toolInvocation.toolName === 'retrieve') {
if (!result) {
return (
<div className="flex items-center justify-between w-full">
<div className="flex items-center gap-2">
<Globe className="h-5 w-5 text-neutral-700 animate-pulse" />
<span className="text-neutral-700 text-lg">Retrieving content...</span>
</div>
<div className="flex space-x-1">
{[0, 1, 2].map((index) => (
<motion.div
key={index}
className="w-2 h-2 bg-muted-foreground rounded-full"
initial={{ opacity: 0.3 }}
animate={{ opacity: 1 }}
transition={{
repeat: Infinity,
duration: 0.8,
delay: index * 0.2,
repeatType: "reverse",
}}
/>
))}
</div>
</div>
);
}
return (
<div className="w-full my-4">
<div className="flex items-center gap-2 mb-2">
<Globe className="h-5 w-5 text-primary" />
<h3 className="font-semibold">Retrieved Content</h3>
</div>
<div className="space-y-2">
<h4 className="font-medium text-sm sm:text-base">{result.results[0].title}</h4>
<p className="text-xs sm:text-sm text-muted-foreground">{result.results[0].description}</p>
<div className="flex flex-wrap items-center gap-2">
<Badge variant="secondary">{result.results[0].language || 'Unknown language'}</Badge>
<a href={result.results[0].url} target="_blank" rel="noopener noreferrer" className="text-xs sm:text-sm text-primary hover:underline">
Source
</a>
</div>
</div>
<Accordion type="single" collapsible className="w-full mt-4">
<AccordionItem value="content" className="border-b-0">
<AccordionTrigger>View Content</AccordionTrigger>
<AccordionContent>
<div className="max-h-[50vh] overflow-y-auto bg-muted p-2 sm:p-4 rounded-lg">
<ReactMarkdown className="text-xs sm:text-sm">
{result.results[0].content}
</ReactMarkdown>
</div>
</AccordionContent>
</AccordionItem>
</Accordion>
</div>
);
}
return (
<div>
{!result ? (

View File

@ -12,6 +12,7 @@
"@ai-sdk/cohere": "latest",
"@ai-sdk/openai": "latest",
"@e2b/code-interpreter": "^0.0.8",
"@mendable/firecrawl-js": "^0.0.36",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-dropdown-menu": "^2.1.1",
@ -22,7 +23,6 @@
"@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"@tailwindcss/typography": "^0.5.13",
"@types/googlemaps": "^3.43.3",
"@vercel/analytics": "^1.3.1",
"@vercel/functions": "^1.4.0",
"ai": "latest",

View File

@ -7,13 +7,16 @@ settings:
dependencies:
'@ai-sdk/cohere':
specifier: latest
version: 0.0.18(zod@3.23.8)
version: 0.0.19(zod@3.23.8)
'@ai-sdk/openai':
specifier: latest
version: 0.0.51(zod@3.23.8)
'@e2b/code-interpreter':
specifier: ^0.0.8
version: 0.0.8
'@mendable/firecrawl-js':
specifier: ^0.0.36
version: 0.0.36
'@radix-ui/react-accordion':
specifier: ^1.2.0
version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
@ -44,9 +47,6 @@ dependencies:
'@tailwindcss/typography':
specifier: ^0.5.13
version: 0.5.13(tailwindcss@3.4.7)
'@types/googlemaps':
specifier: ^3.43.3
version: 3.43.3
'@vercel/analytics':
specifier: ^1.3.1
version: 1.3.1(next@14.2.5)(react@18.3.1)
@ -55,7 +55,7 @@ dependencies:
version: 1.4.0
ai:
specifier: latest
version: 3.3.13(react@18.3.1)(svelte@4.2.18)(vue@3.4.35)(zod@3.23.8)
version: 3.3.14(react@18.3.1)(svelte@4.2.18)(vue@3.4.35)(zod@3.23.8)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
@ -139,14 +139,14 @@ devDependencies:
packages:
/@ai-sdk/cohere@0.0.18(zod@3.23.8):
resolution: {integrity: sha512-hjvFvVtbsRPbmnvF9xwW7so/FPycqMww8VKKCwmj5bqIlQGhvZGEBLjur94G28QGGuL+til35bLwJhoRjsEoSg==}
/@ai-sdk/cohere@0.0.19(zod@3.23.8):
resolution: {integrity: sha512-qiaK7RQU9EbCZvoPj7J2NvUd4Plo9UD7g/r61QTwGI/m9XLHeJyq/Vo7eucowvQdyOOdwDr5EGZrV7BlM+stkA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
dependencies:
'@ai-sdk/provider': 0.0.21
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
zod: 3.23.8
dev: false
@ -161,22 +161,6 @@ packages:
zod: 3.23.8
dev: false
/@ai-sdk/provider-utils@1.0.14(zod@3.23.8):
resolution: {integrity: sha512-6jKYgg/iitJiz9ivlTx1CDrQBx1BeSd0IlRJ/Fl5LcdGAc3gnsMVR+R1w1jxzyhjVyh6g+NqlOZenW0tctNZnA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
peerDependenciesMeta:
zod:
optional: true
dependencies:
'@ai-sdk/provider': 0.0.21
eventsource-parser: 1.1.2
nanoid: 3.3.6
secure-json-parse: 2.7.0
zod: 3.23.8
dev: false
/@ai-sdk/provider-utils@1.0.15(zod@3.23.8):
resolution: {integrity: sha512-icZqf2kpV8XdSViei4pX9ylYcVn+pk9AnVquJJGjGQGnwZ/5OgShqnFcLYrMjQfQcSVkz0PxdQVsIhZHzlT9Og==}
engines: {node: '>=18'}
@ -200,8 +184,8 @@ packages:
json-schema: 0.4.0
dev: false
/@ai-sdk/react@0.0.47(react@18.3.1)(zod@3.23.8):
resolution: {integrity: sha512-lvH5vscfiH93zbJCTR4GZoX0FuiCShEKZVYVQSaE8wod+lc/LaFp9u7sXgHeZOCQj06C68WB88h90V2l9P6cig==}
/@ai-sdk/react@0.0.48(react@18.3.1)(zod@3.23.8):
resolution: {integrity: sha512-KfW33Gj5/qDA6RWfJ42al3QsgIA2UO+x0gX1M6Kk6LY4bTFgy7+F4GLmo4eflM/9o2M7fUZrNddoOuJ15vbgZg==}
engines: {node: '>=18'}
peerDependencies:
react: ^18 || ^19
@ -212,15 +196,15 @@ packages:
zod:
optional: true
dependencies:
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.34(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.35(zod@3.23.8)
react: 18.3.1
swr: 2.2.5(react@18.3.1)
zod: 3.23.8
dev: false
/@ai-sdk/solid@0.0.37(zod@3.23.8):
resolution: {integrity: sha512-KfRHEjBNmtm78Ch1MmTjuvUb7EHOCWiZrypqZt+R0EZJ6X9SIy4fwlXpY/Mn5WuOweAK7vL+woIAlk0SIRSF0w==}
/@ai-sdk/solid@0.0.38(zod@3.23.8):
resolution: {integrity: sha512-7pMW6leig8Y05UIL8jy/1dEDTjtfA2WG9qkVMWjnKSKiucT/Z5uOO3zWNHYq8EVwdJJnv+RR8gUASXcZLTh7og==}
engines: {node: '>=18'}
peerDependencies:
solid-js: ^1.7.7
@ -228,14 +212,14 @@ packages:
solid-js:
optional: true
dependencies:
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.34(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.35(zod@3.23.8)
transitivePeerDependencies:
- zod
dev: false
/@ai-sdk/svelte@0.0.39(svelte@4.2.18)(zod@3.23.8):
resolution: {integrity: sha512-7t/DfxlsWqA+3gDNEUX9ONgdzCpPfPKzkxsE3UGtHvrRLknbLa692yNGJNi0OVB5V++vhtpPw4LViPEmj6DV2w==}
/@ai-sdk/svelte@0.0.40(svelte@4.2.18)(zod@3.23.8):
resolution: {integrity: sha512-S62aB2aT7gjrVY2uDhxwZFBg9hl4wNwu+kd31zsowByC/yyZp9MRIMXkDCkj0qQLFXvfUzaUuzk8v9gvuPOFCQ==}
engines: {node: '>=18'}
peerDependencies:
svelte: ^3.0.0 || ^4.0.0
@ -243,16 +227,16 @@ packages:
svelte:
optional: true
dependencies:
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.34(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.35(zod@3.23.8)
sswr: 2.1.0(svelte@4.2.18)
svelte: 4.2.18
transitivePeerDependencies:
- zod
dev: false
/@ai-sdk/ui-utils@0.0.34(zod@3.23.8):
resolution: {integrity: sha512-8nTBsQklLrp6r/AJyeWxD8D4pvhQhlGfrDaBAfo7OEdBLwF6bNdnh6CJFSwUMiXUtUPOBqPV5tFgY2pJmGQikg==}
/@ai-sdk/ui-utils@0.0.35(zod@3.23.8):
resolution: {integrity: sha512-JZWp5gbH9K0/qmmqv0JFrH97JNMB9dU1xtrR2a8uzRE0wYtNmd3KsM9x3KW/f9OGjxUHzAkrboMvxKv/3uz24w==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
@ -261,15 +245,15 @@ packages:
optional: true
dependencies:
'@ai-sdk/provider': 0.0.21
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
json-schema: 0.4.0
secure-json-parse: 2.7.0
zod: 3.23.8
zod-to-json-schema: 3.22.5(zod@3.23.8)
dev: false
/@ai-sdk/vue@0.0.39(vue@3.4.35)(zod@3.23.8):
resolution: {integrity: sha512-lIcDV1PieneN6yxb7LDdYmXEOearRxdvAgVvMdtAS+Fc4s8basaidh6AA6OFOPAVc16PchpfZCVREfve0r6pUw==}
/@ai-sdk/vue@0.0.40(vue@3.4.35)(zod@3.23.8):
resolution: {integrity: sha512-01LuQT+Cx2e19fYB4nlMlQhmpJ826S1HfGcB4BY30+/XOJebdHRPPOZ3WV9BytBD7kha/tnngBruiYzegGR+Ug==}
engines: {node: '>=18'}
peerDependencies:
vue: ^3.3.4
@ -277,8 +261,8 @@ packages:
vue:
optional: true
dependencies:
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.34(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.35(zod@3.23.8)
swrv: 1.0.4(vue@3.4.35)
vue: 3.4.35(typescript@5.5.4)
transitivePeerDependencies:
@ -466,6 +450,18 @@ packages:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
/@mendable/firecrawl-js@0.0.36:
resolution: {integrity: sha512-5zQMWUD49r6Q7cxj+QBthQ964Bm9fMooW4E8E4nIca3BMXCeEuQFVf5C3OEWwZf0SjJvR+5Yx2wUbXJWd1wCOA==}
dependencies:
axios: 1.7.4
dotenv: 16.4.5
uuid: 9.0.1
zod: 3.23.8
zod-to-json-schema: 3.23.2(zod@3.23.8)
transitivePeerDependencies:
- debug
dev: false
/@next/env@14.2.5:
resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==}
dev: false
@ -1354,11 +1350,6 @@ packages:
resolution: {integrity: sha512-Q8MsLE+YYIrE1H8wdN69YHHAF8h7ApvF5MiMXh/zeCpP9Ut745mV9M0F4X4eobZ2WJe9k8tW2ryYjLa87IO2Sg==}
dev: true
/@types/googlemaps@3.43.3:
resolution: {integrity: sha512-ZWNoz/O8MPEpiajvj7QiqCY8tTLFNqNZ/a+s+zTV58wFVNAvvqV4bdGfnsjTb5Cs4V6wEsLrX8XRhmnyYJ2Tdg==}
deprecated: 'Types for the Google Maps browser API have moved to @types/google.maps. Note: these types are not for the googlemaps npm package, which is a Node API.'
dev: false
/@types/hast@2.3.10:
resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
dependencies:
@ -1599,8 +1590,8 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
/ai@3.3.13(react@18.3.1)(svelte@4.2.18)(vue@3.4.35)(zod@3.23.8):
resolution: {integrity: sha512-PKbGlzlKpDFIU67rHG1xkhDE5TYqK2FIRKLQhu2bHXZhIVpB5xmTxf0lnHta6hlyLIY0Qz0jFDE/D+EFTmt1rQ==}
/ai@3.3.14(react@18.3.1)(svelte@4.2.18)(vue@3.4.35)(zod@3.23.8):
resolution: {integrity: sha512-GF3CVS1rnOtgN68OQGlT/2quhg/D3sMFwak48OGXeqv4VRcDgGJx3UqSwT7ipFa9BncRqo7TIqDHHji3Doamaw==}
engines: {node: '>=18'}
peerDependencies:
openai: ^4.42.0
@ -1621,12 +1612,12 @@ packages:
optional: true
dependencies:
'@ai-sdk/provider': 0.0.21
'@ai-sdk/provider-utils': 1.0.14(zod@3.23.8)
'@ai-sdk/react': 0.0.47(react@18.3.1)(zod@3.23.8)
'@ai-sdk/solid': 0.0.37(zod@3.23.8)
'@ai-sdk/svelte': 0.0.39(svelte@4.2.18)(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.34(zod@3.23.8)
'@ai-sdk/vue': 0.0.39(vue@3.4.35)(zod@3.23.8)
'@ai-sdk/provider-utils': 1.0.15(zod@3.23.8)
'@ai-sdk/react': 0.0.48(react@18.3.1)(zod@3.23.8)
'@ai-sdk/solid': 0.0.38(zod@3.23.8)
'@ai-sdk/svelte': 0.0.40(svelte@4.2.18)(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.35(zod@3.23.8)
'@ai-sdk/vue': 0.0.40(vue@3.4.35)(zod@3.23.8)
'@opentelemetry/api': 1.9.0
eventsource-parser: 1.1.2
json-schema: 0.4.0
@ -1803,6 +1794,10 @@ packages:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
@ -1815,6 +1810,16 @@ packages:
engines: {node: '>=4'}
dev: true
/axios@1.7.4:
resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==}
dependencies:
follow-redirects: 1.15.6
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
/axobject-query@3.1.1:
resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
dependencies:
@ -1992,6 +1997,13 @@ packages:
/color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/comma-separated-tokens@1.0.8:
resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
dev: false
@ -2216,6 +2228,11 @@ packages:
object-keys: 1.1.1
dev: true
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@ -2269,6 +2286,11 @@ packages:
csstype: 3.1.3
dev: false
/dotenv@16.4.5:
resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
engines: {node: '>=12'}
dev: false
/e2b@0.16.2:
resolution: {integrity: sha512-xKmVK4ipgVQPJ/uyyrfH9LnaawERRWt8U2UZhdhGfzdL/QU/OpBjuhoIbFCv1Uy6qXV4nIiJ6Nw4MBC4HmXf1g==}
engines: {node: '>=18'}
@ -2821,6 +2843,16 @@ packages:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
dev: true
/follow-redirects@1.15.6:
resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
@ -2834,6 +2866,15 @@ packages:
cross-spawn: 7.0.3
signal-exit: 4.1.0
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/format@0.2.2:
resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
engines: {node: '>=0.4.x'}
@ -4019,6 +4060,18 @@ packages:
braces: 3.0.3
picomatch: 2.3.1
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
@ -4447,6 +4500,10 @@ packages:
resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
dev: false
/proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@ -5368,6 +5425,11 @@ packages:
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
/uuid@9.0.1:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
dev: false
/vfile-message@4.0.2:
resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
dependencies:
@ -5538,6 +5600,14 @@ packages:
zod: 3.23.8
dev: false
/zod-to-json-schema@3.23.2(zod@3.23.8):
resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==}
peerDependencies:
zod: ^3.23.3
dependencies:
zod: 3.23.8
dev: false
/zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
dev: false