From 91a6a8ad4e58eb4db38236834fa1a30e177440db Mon Sep 17 00:00:00 2001 From: zaidmukaddam Date: Thu, 22 Aug 2024 14:55:24 +0530 Subject: [PATCH] feat: Improve retrieval tool and enhance UI for retrieval and web search tool --- app/api/chat/route.ts | 67 ++++++---------- app/page.tsx | 146 +++++++++++++++++++++++++++++++++ package.json | 2 +- pnpm-lock.yaml | 182 +++++++++++++++++++++++++++++------------- 4 files changed, 297 insertions(+), 100 deletions(-) diff --git a/app/api/chat/route.ts b/app/api/chat/route.ts index 78b34da..99602d5 100644 --- a/app/api/chat/route.ts +++ b/app/api/chat/route.ts @@ -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({ @@ -327,10 +308,10 @@ Just run the tool and provide the answer.`, execute: async ({ input, inputtype }: { input: string; inputtype: "textquery" | "phonenumber" }) => { const apiKey = process.env.GOOGLE_MAPS_API_KEY; const url = `https://maps.googleapis.com/maps/api/place/findplacefromtext/json?fields=formatted_address,name,rating,opening_hours,geometry&input=${encodeURIComponent(input)}&inputtype=${inputtype}&key=${apiKey}`; - + const response = await fetch(url); const data = await response.json(); - + return data; }, }), @@ -344,17 +325,17 @@ Just run the tool and provide the answer.`, execute: async ({ query, location, radius }: { query: string; location?: string; radius?: number }) => { const apiKey = process.env.GOOGLE_MAPS_API_KEY; let url = `https://maps.googleapis.com/maps/api/place/textsearch/json?query=${encodeURIComponent(query)}&key=${apiKey}`; - + if (location) { url += `&location=${encodeURIComponent(location)}`; } if (radius) { url += `&radius=${radius}`; } - + const response = await fetch(url); const data = await response.json(); - + return data; }, }), diff --git a/app/page.tsx b/app/page.tsx index de07b46..708a368 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -841,6 +841,152 @@ export default function Home() { ); } + if (toolInvocation.toolName === 'web_search') { + return ( +
+ {!result ? ( +
+
+ + Running a search... +
+
+ {[0, 1, 2].map((index) => ( + + ))} +
+
+ ) : ( + + + +
+
+ +

Sources Found

+
+ {result && ( + {result.results.length} results + )} +
+
+ + {args?.query && ( + + + {args.query} + + )} + {result && ( +
+ {result.results.map((item: any, itemIndex: number) => ( +
+
+ Favicon +
+

{item.title}

+

{item.content}

+
+
+ + {item.url} + +
+ ))} +
+ )} +
+
+
+ )} +
+ ); + } + + if (toolInvocation.toolName === 'retrieve') { + if (!result) { + return ( +
+
+ + Retrieving content... +
+
+ {[0, 1, 2].map((index) => ( + + ))} +
+
+ ); + } + + return ( +
+
+ +

Retrieved Content

+
+
+

{result.results[0].title}

+

{result.results[0].description}

+
+ {result.results[0].language || 'Unknown language'} + + Source + +
+
+ + + View Content + +
+ + {result.results[0].content} + +
+
+
+
+
+ ); + } + return (
{!result ? ( diff --git a/package.json b/package.json index 178fb34..ee6801b 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6dc124b..5ad62b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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