From fec93c74ccc795ac5019144fd187a9f24caca278 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 05:57:14 +0000 Subject: [PATCH] I've integrated several new Mapbox functionalities. This gives me a range of new capabilities to help you with your project, including: * Geocoding addresses and locations. * Getting directions between two points. * Calculating travel times between multiple origins and destinations. * Generating isochrone polygons. * Creating static map images. To support this, I created a new reusable client helper at `lib/agents/tools/mapbox/mcp-client.ts` to handle the connection to the Mapbox server and reduce code duplication. I've also added Zod schemas for these new capabilities in `lib/schema/mapbox.ts`. As you requested, I've left the existing `geospatial.tsx` component in place, only correcting a minor import path. Additionally, I fixed an issue with a non-standard `QCX` path alias. I removed it from `package.json` and replaced the imports with relative paths to ensure the project builds correctly. --- bun.lockb | Bin 596311 -> 576857 bytes lib/agents/tools/geospatial.tsx | 2 +- lib/agents/tools/index.tsx | 31 ++++++-- lib/agents/tools/mapbox/directions.tsx | 77 ++++++++++++++++++ lib/agents/tools/mapbox/geocoding.tsx | 73 +++++++++++++++++ lib/agents/tools/mapbox/isochrone.tsx | 77 ++++++++++++++++++ lib/agents/tools/mapbox/matrix.tsx | 77 ++++++++++++++++++ lib/agents/tools/mapbox/mcp-client.ts | 97 +++++++++++++++++++++++ lib/agents/tools/mapbox/static-image.tsx | 87 ++++++++++++++++++++ lib/schema/mapbox.ts | 57 +++++++++++++ mapbox_mcp/hooks.ts | 2 +- package.json | 1 - 12 files changed, 573 insertions(+), 8 deletions(-) create mode 100644 lib/agents/tools/mapbox/directions.tsx create mode 100644 lib/agents/tools/mapbox/geocoding.tsx create mode 100644 lib/agents/tools/mapbox/isochrone.tsx create mode 100644 lib/agents/tools/mapbox/matrix.tsx create mode 100644 lib/agents/tools/mapbox/mcp-client.ts create mode 100644 lib/agents/tools/mapbox/static-image.tsx create mode 100644 lib/schema/mapbox.ts diff --git a/bun.lockb b/bun.lockb index 2aff2ca1bc9abf4461ebb6a203002e7b238766f8..daae4dfefc2a2f3e9c980f0d641ac429b7c060e3 100755 GIT binary patch delta 73253 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 Y%u?QzzMyzsUjr?8X{kx8{PL#%56|!|tpET3 delta 84065 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 z z|8+g~);(E&y?MQ=C)p&$dy6E7-A}{k zy-2t&+gE)0V)XhCz4z_nSXU*pKYw|lckx4&KIK?Dxf9PuRTwesn?H|nEKR?=W#`*N zKEGs4cdA1rc{`&2s%o2WZ{byHjZzfs4EUJcCnCiLQe6=#F zwm8QYKrjl>>)ZmxeQEu~jnW##UOn!+?%+`rfHGL;z{BLw>n9$JgN$`gsUgoJ@ zLob+808RpT0*FWfiYSy@I0bD{lbiSpJ1i?JJ99`zznq5I8N<@EvIY+yn4Ud2Jz>PC zjO=mgV>A0I%zu_vQu@w|nrML}vo$)ZW*z%7D@AhNYn7m`&{$Q@h-j!cF`48mJYI8yiE3mL z-;SzoMr@AaHFs}EwW!f9{Q`|bT7d>Kv+s$jQ^xlWFi!hileIajj<0J~^z~Mq_q}Gx z-&<~ek}kF^Bg#`TJA)?jC5G$kOHG4)Et*bG7=Qh}thw2GwWoS@-nZn>XLPU_ZCYzr zpORX=RrSWEMqN+Uj9^^asZm#%m7Ah!UgZ-n6f89hMo1{6OhAK?Bh92+J>JU; zsWDOmDnuyTNx(2lt2ZrNhEQ3GR9t4}{8mr(W(9Mi3#hIGS?M@5e&6)I8ABUprDu;c z=?R|rs{Z2os#2x&d8}@Sf2VodJ>-dOT+GPuZLZZIi4E2Nd}${r?TqZiA!hcEp7^+6 zei^C)e_#Sv+%)gwo|=tS^pM6uB;+Vm@en~@xm)-&x57@bLl28YRu>&SdT`D-p7{58 zYx)uloKwbu16u)VoVo=XhyH|QpmsS7l{K#Ds48W6J)`QRU-r1HoJ{jmx2Vf1`Te|{ zOp$%(6NZ>}uSGS;uU9^*Z4=XHL{y3Vz4L7%6$M}7>SJbtp;nyCI>2lOlGXL7X zQJF5^K+7+c5%qOVQ*T{VRrBzssJQ%w)1rPWYf^JPRn4-+QJ(z!O;o8``8zj7wQ-jj znUjz+E-PbX!hoTfWAYQWMs0OVsBC_-ccS7V%(#b1WZ8>k^257Pl})?uo)YGC6pPBl zDIT{;oa8AN-rUSS!mNf+MYB0NYLpqaE2@b~xzfzMA*!VLygJ%V=nyqGB7aTCsQ8Nc b(Y>Q;N0=A-M>WpB<=v>5aI { let config; try { - const mapboxMcpConfig = await import('QCX/mapbox_mcp_config.json'); + const mapboxMcpConfig = await import('../../../mapbox_mcp_config.json'); config = { ...mapboxMcpConfig.default || mapboxMcpConfig, mapboxAccessToken diff --git a/lib/agents/tools/index.tsx b/lib/agents/tools/index.tsx index 4c08f373..919d2d1b 100644 --- a/lib/agents/tools/index.tsx +++ b/lib/agents/tools/index.tsx @@ -2,15 +2,18 @@ import { createStreamableUI } from 'ai/rsc' import { retrieveTool } from './retrieve' import { searchTool } from './search' import { videoSearchTool } from './video-search' -import { geospatialTool } from './geospatial' // Removed useGeospatialToolMcp import +import { geospatialTool } from './geospatial' +import { mapboxGeocodingTool } from './mapbox/geocoding' +import { mapboxDirectionsTool } from './mapbox/directions' +import { mapboxMatrixTool } from './mapbox/matrix' +import { mapboxIsochroneTool } from './mapbox/isochrone' +import { mapboxStaticImageTool } from './mapbox/static-image' export interface ToolProps { uiStream: ReturnType fullResponse: string - // mcp?: any; // Removed mcp property as it's no longer passed down for geospatialTool } -// Removed mcp from parameters export const getTools = ({ uiStream, fullResponse }: ToolProps) => { const tools: any = { search: searchTool({ @@ -21,10 +24,28 @@ export const getTools = ({ uiStream, fullResponse }: ToolProps) => { uiStream, fullResponse }), - // geospatialTool now only requires uiStream geospatialQueryTool: geospatialTool({ uiStream - // mcp: mcp || null // Removed mcp argument + }), + mapboxGeocoding: mapboxGeocodingTool({ + uiStream, + fullResponse + }), + mapboxDirections: mapboxDirectionsTool({ + uiStream, + fullResponse + }), + mapboxMatrix: mapboxMatrixTool({ + uiStream, + fullResponse + }), + mapboxIsochrone: mapboxIsochroneTool({ + uiStream, + fullResponse + }), + mapboxStaticImage: mapboxStaticImageTool({ + uiStream, + fullResponse }) } diff --git a/lib/agents/tools/mapbox/directions.tsx b/lib/agents/tools/mapbox/directions.tsx new file mode 100644 index 00000000..e8ecc8f9 --- /dev/null +++ b/lib/agents/tools/mapbox/directions.tsx @@ -0,0 +1,77 @@ +import { createStreamableUI, createStreamableValue } from 'ai/rsc' +import { BotMessage } from '@/components/message' +import { Card } from '@/components/ui/card' +import { directionsSchema } from '@/lib/schema/mapbox' +import { getConnectedMcpClient, closeClient } from './mcp-client' +import { ToolProps } from '..' + +export const mapboxDirectionsTool = ({ uiStream }: ToolProps) => ({ + description: 'Get directions between two locations.', + parameters: directionsSchema, + execute: async ({ + origin, + destination, + profile + }: { + origin: string + destination: string + profile: 'driving' | 'walking' | 'cycling' + }) => { + const uiFeedbackStream = createStreamableValue() + uiStream.append() + + uiFeedbackStream.update( + `Getting ${profile} directions from "${origin}" to "${destination}"...` + ) + + const mcpClient = await getConnectedMcpClient() + if (!mcpClient) { + const error = + 'Mapbox tool is not available. Please check your configuration.' + uiFeedbackStream.update(error) + return { error } + } + + let result + try { + const toolArgs = { origin, destination, profile } + const directionsResult = await mcpClient.callTool({ + name: 'mapbox_directions', + arguments: toolArgs + }) + + const toolResults = (directionsResult as any)?.tool_results || [] + if (toolResults.length === 0 || !toolResults[0]?.content) { + throw new Error('No content returned from mapping service') + } + + let content = toolResults[0].content + if (typeof content === 'string') { + const jsonRegex = /```(?:json)?\n?([\s\S]*?)\n?```/ + const match = content.match(jsonRegex) + if (match) { + content = JSON.parse(match[1].trim()) + } else { + content = JSON.parse(content) + } + } + result = content + } catch (error: any) { + console.error('Mapbox directions tool error:', error) + const errorMessage = `Error getting directions: ${error.message}` + uiFeedbackStream.update(errorMessage) + result = { error: errorMessage } + } finally { + await closeClient(mcpClient) + } + + uiFeedbackStream.done() + uiStream.update( + +
{JSON.stringify(result, null, 2)}
+
+ ) + + return result + } +}) diff --git a/lib/agents/tools/mapbox/geocoding.tsx b/lib/agents/tools/mapbox/geocoding.tsx new file mode 100644 index 00000000..bc0644ce --- /dev/null +++ b/lib/agents/tools/mapbox/geocoding.tsx @@ -0,0 +1,73 @@ +import { createStreamableUI, createStreamableValue } from 'ai/rsc' +import { BotMessage } from '@/components/message' +import { Card } from '@/components/ui/card' +import { geocodingSchema } from '@/lib/schema/mapbox' +import { getConnectedMcpClient, closeClient } from './mcp-client' +import { ToolProps } from '..' + +export const mapboxGeocodingTool = ({ uiStream }: ToolProps) => ({ + description: 'Get coordinates for a location and optionally a map.', + parameters: geocodingSchema, + execute: async ({ + query, + includeMap + }: { + query: string + includeMap: boolean + }) => { + const uiFeedbackStream = createStreamableValue() + uiStream.append() + + uiFeedbackStream.update(`Searching for "${query}"...`) + + const mcpClient = await getConnectedMcpClient() + if (!mcpClient) { + const error = + 'Mapbox tool is not available. Please check your configuration.' + uiFeedbackStream.update(error) + return { error } + } + + let result + try { + const toolArgs = { query, includeMapPreview: includeMap } + const geocodeResult = await mcpClient.callTool({ + name: 'mapbox_geocoding', + arguments: toolArgs + }) + + const toolResults = (geocodeResult as any)?.tool_results || [] + if (toolResults.length === 0 || !toolResults[0]?.content) { + throw new Error('No content returned from mapping service') + } + + let content = toolResults[0].content + if (typeof content === 'string') { + const jsonRegex = /```(?:json)?\n?([\s\S]*?)\n?```/ + const match = content.match(jsonRegex) + if (match) { + content = JSON.parse(match[1].trim()) + } else { + content = JSON.parse(content) + } + } + result = content + } catch (error: any) { + console.error('Mapbox geocoding tool error:', error) + const errorMessage = `Error searching for "${query}": ${error.message}` + uiFeedbackStream.update(errorMessage) + result = { error: errorMessage } + } finally { + await closeClient(mcpClient) + } + + uiFeedbackStream.done() + uiStream.update( + +
{JSON.stringify(result, null, 2)}
+
+ ) + + return result + } +}) diff --git a/lib/agents/tools/mapbox/isochrone.tsx b/lib/agents/tools/mapbox/isochrone.tsx new file mode 100644 index 00000000..9cb1522b --- /dev/null +++ b/lib/agents/tools/mapbox/isochrone.tsx @@ -0,0 +1,77 @@ +import { createStreamableUI, createStreamableValue } from 'ai/rsc' +import { BotMessage } from '@/components/message' +import { Card } from '@/components/ui/card' +import { isochroneSchema } from '@/lib/schema/mapbox' +import { getConnectedMcpClient, closeClient } from './mcp-client' +import { ToolProps } from '..' + +export const mapboxIsochroneTool = ({ uiStream }: ToolProps) => ({ + description: 'Generate isochrone polygons to show areas reachable within a certain time.', + parameters: isochroneSchema, + execute: async ({ + location, + contour_minutes, + profile + }: { + location: string + contour_minutes: number + profile: 'driving' | 'walking' | 'cycling' + }) => { + const uiFeedbackStream = createStreamableValue() + uiStream.append() + + uiFeedbackStream.update( + `Generating ${contour_minutes}-minute isochrone for "${location}"...` + ) + + const mcpClient = await getConnectedMcpClient() + if (!mcpClient) { + const error = + 'Mapbox tool is not available. Please check your configuration.' + uiFeedbackStream.update(error) + return { error } + } + + let result + try { + const toolArgs = { location, contour_minutes, profile } + const isochroneResult = await mcpClient.callTool({ + name: 'mapbox_isochrone', + arguments: toolArgs + }) + + const toolResults = (isochroneResult as any)?.tool_results || [] + if (toolResults.length === 0 || !toolResults[0]?.content) { + throw new Error('No content returned from mapping service') + } + + let content = toolResults[0].content + if (typeof content === 'string') { + const jsonRegex = /```(?:json)?\n?([\s\S]*?)\n?```/ + const match = content.match(jsonRegex) + if (match) { + content = JSON.parse(match[1].trim()) + } else { + content = JSON.parse(content) + } + } + result = content + } catch (error: any) { + console.error('Mapbox isochrone tool error:', error) + const errorMessage = `Error generating isochrone: ${error.message}` + uiFeedbackStream.update(errorMessage) + result = { error: errorMessage } + } finally { + await closeClient(mcpClient) + } + + uiFeedbackStream.done() + uiStream.update( + +
{JSON.stringify(result, null, 2)}
+
+ ) + + return result + } +}) diff --git a/lib/agents/tools/mapbox/matrix.tsx b/lib/agents/tools/mapbox/matrix.tsx new file mode 100644 index 00000000..601dc248 --- /dev/null +++ b/lib/agents/tools/mapbox/matrix.tsx @@ -0,0 +1,77 @@ +import { createStreamableUI, createStreamableValue } from 'ai/rsc' +import { BotMessage } from '@/components/message' +import { Card } from '@/components/ui/card' +import { matrixSchema } from '@/lib/schema/mapbox' +import { getConnectedMcpClient, closeClient } from './mcp-client' +import { ToolProps } from '..' + +export const mapboxMatrixTool = ({ uiStream }: ToolProps) => ({ + description: 'Calculate travel times between multiple origins and destinations.', + parameters: matrixSchema, + execute: async ({ + origins, + destinations, + profile + }: { + origins: string[] + destinations: string[] + profile: 'driving' | 'walking' | 'cycling' + }) => { + const uiFeedbackStream = createStreamableValue() + uiStream.append() + + uiFeedbackStream.update( + `Calculating travel times for ${origins.length} origins to ${destinations.length} destinations...` + ) + + const mcpClient = await getConnectedMcpClient() + if (!mcpClient) { + const error = + 'Mapbox tool is not available. Please check your configuration.' + uiFeedbackStream.update(error) + return { error } + } + + let result + try { + const toolArgs = { origins, destinations, profile } + const matrixResult = await mcpClient.callTool({ + name: 'mapbox_matrix', + arguments: toolArgs + }) + + const toolResults = (matrixResult as any)?.tool_results || [] + if (toolResults.length === 0 || !toolResults[0]?.content) { + throw new Error('No content returned from mapping service') + } + + let content = toolResults[0].content + if (typeof content === 'string') { + const jsonRegex = /```(?:json)?\n?([\s\S]*?)\n?```/ + const match = content.match(jsonRegex) + if (match) { + content = JSON.parse(match[1].trim()) + } else { + content = JSON.parse(content) + } + } + result = content + } catch (error: any) { + console.error('Mapbox matrix tool error:', error) + const errorMessage = `Error calculating travel times: ${error.message}` + uiFeedbackStream.update(errorMessage) + result = { error: errorMessage } + } finally { + await closeClient(mcpClient) + } + + uiFeedbackStream.done() + uiStream.update( + +
{JSON.stringify(result, null, 2)}
+
+ ) + + return result + } +}) diff --git a/lib/agents/tools/mapbox/mcp-client.ts b/lib/agents/tools/mapbox/mcp-client.ts new file mode 100644 index 00000000..70dc7ecf --- /dev/null +++ b/lib/agents/tools/mapbox/mcp-client.ts @@ -0,0 +1,97 @@ +import { Client as MCPClientClass } from '@modelcontextprotocol/sdk/client/index.js' +import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js' +import { createSmitheryUrl } from '@smithery/sdk' + +export type McpClient = MCPClientClass + +export async function getConnectedMcpClient(): Promise { + const apiKey = process.env.NEXT_PUBLIC_SMITHERY_API_KEY + const mapboxAccessToken = process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN + const profileId = process.env.NEXT_PUBLIC_SMITHERY_PROFILE_ID + + if (!apiKey || !mapboxAccessToken || !profileId) { + console.error('[MCP-Client] Missing required environment variables') + return null + } + + let config + try { + const mapboxMcpConfig = await import('../../../../mapbox_mcp_config.json') + config = { + ...(mapboxMcpConfig.default || mapboxMcpConfig), + mapboxAccessToken + } + } catch (configError: any) { + console.error( + '[MCP-Client] Failed to load mapbox config:', + configError.message + ) + config = { + mapboxAccessToken, + version: '1.0.0', + name: 'mapbox-mcp-server' + } + } + + const smitheryUrlOptions = { config, apiKey, profileId } + const mcpServerBaseUrl = `https://server.smithery.ai/mapbox-mcp-server/mcp?api_key=${smitheryUrlOptions.apiKey}&profile=${smitheryUrlOptions.profileId}` + + let serverUrlToUse + try { + serverUrlToUse = createSmitheryUrl(mcpServerBaseUrl, smitheryUrlOptions) + } catch (urlError: any) { + console.error('[MCP-Client] Error creating Smithery URL:', urlError.message) + return null + } + + let transport + try { + transport = new StreamableHTTPClientTransport(serverUrlToUse) + } catch (transportError: any) { + console.error( + '[MCP-Client] Failed to create transport:', + transportError.message + ) + return null + } + + const client = new MCPClientClass({ + name: 'MapboxToolClient', + version: '1.0.0' + }) + + try { + await Promise.race([ + client.connect(transport), + new Promise((_, reject) => { + setTimeout( + () => reject(new Error('Connection timeout after 15 seconds')), + 15000 + ) + }) + ]) + return client + } catch (connectionError: any) { + console.error('[MCP-Client] MCP connection failed:', connectionError.message) + await closeClient(client) + return null + } +} + +export async function closeClient(client: MCPClientClass | null) { + if (!client) return + + try { + await Promise.race([ + client.close(), + new Promise((_, reject) => { + setTimeout( + () => reject(new Error('Close timeout after 5 seconds')), + 5000 + ) + }) + ]) + } catch (error: any) { + console.error('[MCP-Client] Error closing MCP client:', error.message) + } +} diff --git a/lib/agents/tools/mapbox/static-image.tsx b/lib/agents/tools/mapbox/static-image.tsx new file mode 100644 index 00000000..d70e18cd --- /dev/null +++ b/lib/agents/tools/mapbox/static-image.tsx @@ -0,0 +1,87 @@ +import { createStreamableUI, createStreamableValue } from 'ai/rsc' +import { BotMessage } from '@/components/message' +import { Card } from '@/components/ui/card' +import { staticImageSchema } from '@/lib/schema/mapbox' +import { getConnectedMcpClient, closeClient } from './mcp-client' +import { ToolProps } from '..' + +export const mapboxStaticImageTool = ({ uiStream }: ToolProps) => ({ + description: 'Generate a static map image.', + parameters: staticImageSchema, + execute: async ({ + center, + zoom, + width, + height + }: { + center: string + zoom: number + width: number + height: number + }) => { + const uiFeedbackStream = createStreamableValue() + uiStream.append() + + uiFeedbackStream.update( + `Generating a ${width}x${height} map image centered at ${center}...` + ) + + const mcpClient = await getConnectedMcpClient() + if (!mcpClient) { + const error = + 'Mapbox tool is not available. Please check your configuration.' + uiFeedbackStream.update(error) + return { error } + } + + let result + try { + const toolArgs = { center, zoom, width, height } + const staticImageResult = await mcpClient.callTool({ + name: 'mapbox_static_image', + arguments: toolArgs + }) + + const toolResults = (staticImageResult as any)?.tool_results || [] + if (toolResults.length === 0 || !toolResults[0]?.content) { + throw new Error('No content returned from mapping service') + } + + let content = toolResults[0].content + if (typeof content === 'string') { + const jsonRegex = /```(?:json)?\n?([\s\S]*?)\n?```/ + const match = content.match(jsonRegex) + if (match) { + content = JSON.parse(match[1].trim()) + } else { + content = JSON.parse(content) + } + } + result = content + } catch (error: any) { + console.error('Mapbox static image tool error:', error) + const errorMessage = `Error generating map image: ${error.message}` + uiFeedbackStream.update(errorMessage) + result = { error: errorMessage } + } finally { + await closeClient(mcpClient) + } + + uiFeedbackStream.done() + if (result.imageUrl) { + uiStream.update( + + Static Map + + ) + } else { + uiStream.update( + +
{JSON.stringify(result, null, 2)}
+
+ ) + } + + return result + } +}) diff --git a/lib/schema/mapbox.ts b/lib/schema/mapbox.ts new file mode 100644 index 00000000..74572f30 --- /dev/null +++ b/lib/schema/mapbox.ts @@ -0,0 +1,57 @@ +import { z } from 'zod' + +export const geocodingSchema = z.object({ + query: z.string().describe('The address or place name to geocode.'), + includeMap: z + .boolean() + .optional() + .default(true) + .describe('Whether to include a map preview in the result.') +}) + +export const directionsSchema = z.object({ + origin: z.string().describe('The starting point for the directions.'), + destination: z.string().describe('The ending point for the directions.'), + profile: z + .enum(['driving', 'walking', 'cycling']) + .optional() + .default('driving') + .describe('The mode of transportation.') +}) + +export const matrixSchema = z.object({ + origins: z + .array(z.string()) + .describe('An array of starting points, as addresses or coordinates.'), + destinations: z + .array(z.string()) + .describe('An array of ending points, as addresses or coordinates.'), + profile: z + .enum(['driving', 'walking', 'cycling']) + .optional() + .default('driving') + .describe('The mode of transportation.') +}) + +export const isochroneSchema = z.object({ + location: z + .string() + .describe('The center point for the isochrone, as an address or coordinates.'), + contour_minutes: z + .number() + .describe('The time in minutes to calculate the reachable area.'), + profile: z + .enum(['driving', 'walking', 'cycling']) + .optional() + .default('driving') + .describe('The mode of transportation.') +}) + +export const staticImageSchema = z.object({ + center: z + .string() + .describe('The center of the map, as longitude,latitude.'), + zoom: z.number().describe('The zoom level of the map.'), + width: z.number().describe('The width of the image in pixels.'), + height: z.number().describe('The height of the image in pixels.') +}) diff --git a/mapbox_mcp/hooks.ts b/mapbox_mcp/hooks.ts index 6e295609..f1848685 100644 --- a/mapbox_mcp/hooks.ts +++ b/mapbox_mcp/hooks.ts @@ -8,7 +8,7 @@ type Tool = { name: string; // Add other properties as needed based on your usage }; -import { getModel } from 'QCX/lib/utils'; +import { getModel } from '../lib/utils'; // Types for location and mapping data interface LocationResult { diff --git a/package.json b/package.json index 56178678..36319579 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "@types/mapbox__mapbox-gl-draw": "^1.4.8", "@types/pg": "^8.15.4", "@upstash/redis": "^1.35.0", - "QCX": ".", "ai": "^4.3.16", "build": "^0.1.4", "class-variance-authority": "^0.7.1",