From ccc4f15a8b0f9b077d30120473a5bd351295fd0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lui=CC=81s=20Freitas?= Date: Fri, 28 Mar 2025 17:32:14 +0000 Subject: [PATCH 1/5] Refactor Bitte AI tools integration by introducing a new service structure for Goat and AgentKit tools. Updated index.ts to streamline service handling and added base-agentkit tools for enhanced functionality. Updated package.json to include new dependencies for Coinbase SDKs and adjusted logging for better execution tracking. --- apps/bitte-ai/index.ts | 45 ++- apps/bitte-ai/package.json | 3 + apps/bitte-ai/tools/base-agentkit/index.ts | 67 ++++ apps/bitte-ai/tools/base-agentkit/wallet.ts | 32 ++ apps/bitte-ai/tools/goat-sdk/index.ts | 56 +++- apps/bitte-ai/tools/goat-sdk/wallet.ts | 11 +- apps/bitte-ai/tools/index.ts | 13 + bun.lock | 347 +++++++++++++++++++- 8 files changed, 539 insertions(+), 35 deletions(-) create mode 100644 apps/bitte-ai/tools/base-agentkit/index.ts create mode 100644 apps/bitte-ai/tools/base-agentkit/wallet.ts create mode 100644 apps/bitte-ai/tools/index.ts diff --git a/apps/bitte-ai/index.ts b/apps/bitte-ai/index.ts index f6dc965..3b3f251 100644 --- a/apps/bitte-ai/index.ts +++ b/apps/bitte-ai/index.ts @@ -1,7 +1,7 @@ import { MCP } from '@mcp-sdk/server'; import { z } from 'zod'; import { config } from './config'; -import { tools as goatTools } from './tools/goat-sdk'; +import { services } from './tools'; // Export configuration export { config } from './config'; @@ -234,8 +234,12 @@ server.addTool({ log.info(`Executing get-existing-tools tool with params: ${JSON.stringify(args)}`); switch (args.service) { - case 'goat': + case services.goat.name: + const goatTools = await services.goat.tools(); return JSON.stringify(goatTools); + case services.agentkit.name: + const baseAgentkitTools = await services.agentkit.tools(); + return JSON.stringify(baseAgentkitTools); default: throw new Error(`Unknown service: ${args.service}`); } @@ -250,12 +254,9 @@ server.addTool({ execute: async (args, { log }) => { log.info('Executing get-available-services tool'); - // Return the list of available services - const services = ['goat']; - return JSON.stringify({ - services, - count: services.length, + services: Object.values(services).map((service) => service.name), + count: Object.keys(services).length, }); }, }); @@ -266,20 +267,44 @@ server.addTool({ description: 'Execute a tool', parameters: z.object({ tool: z.string().describe('The tool to execute'), + service: z.string().describe('The service to execute the tool from'), params: z.object({}).describe('The parameters to pass to the tool'), }), execute: async (args, { log }) => { log.info(`Executing execute-tool tool with params: ${JSON.stringify(args)}`); + console.log(`[execute-tool] Starting execution for tool: ${args.tool} from service: ${args.service} with params: ${JSON.stringify(args.params)}`); - switch (args.tool) { - case 'goat': { + switch (args.service) { + case services.goat.name: { + console.log(`[execute-tool] Fetching GOAT tools`); + const goatTools = await services.goat.tools(); + console.log(`[execute-tool] Found ${goatTools.length} GOAT tools`); const tool = goatTools.find((t) => t.name === args.tool); if (!tool) { + console.error(`[execute-tool] Tool not found: ${args.tool}`); + throw new Error(`Tool not found: ${args.tool}`); + } + console.log(`[execute-tool] Executing GOAT tool: ${args.tool} with params:`, args.params); + const result = await tool.execute(args.params); + console.log(`[execute-tool] GOAT tool execution completed`); + return result; + } + case services.agentkit.name: { + console.log(`[execute-tool] Fetching AgentKit tools`); + const baseAgentkitTools = await services.agentkit.tools(); + console.log(`[execute-tool] Found ${baseAgentkitTools.length} AgentKit tools`); + const tool = baseAgentkitTools.find((t) => t.name === args.tool); + if (!tool) { + console.error(`[execute-tool] Tool not found: ${args.tool}`); throw new Error(`Tool not found: ${args.tool}`); } - return await tool.execute(args.params); + console.log(`[execute-tool] Executing AgentKit tool: ${args.tool} with params:`, JSON.stringify(args.params)); + const result = await tool.execute(args.params); + console.log(`[execute-tool] AgentKit tool execution completed`); + return result; } default: + console.error(`[execute-tool] Unknown tool: ${args.tool}`); throw new Error(`Unknown tool: ${args.tool}`); } }, diff --git a/apps/bitte-ai/package.json b/apps/bitte-ai/package.json index 29b0c67..a14eb7d 100644 --- a/apps/bitte-ai/package.json +++ b/apps/bitte-ai/package.json @@ -21,10 +21,13 @@ "typescript": "^5.0.0" }, "dependencies": { + "@coinbase/agentkit": "^0.4.0", + "@coinbase/agentkit-vercel-ai-sdk": "^0.1.0", "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", "@goat-sdk/plugin-erc20": "^0.2.14", "@mcp-sdk/server": "0.0.7", + "viem": "^2.24.1", "zod": "^3.24.2" } } diff --git a/apps/bitte-ai/tools/base-agentkit/index.ts b/apps/bitte-ai/tools/base-agentkit/index.ts new file mode 100644 index 0000000..cb41965 --- /dev/null +++ b/apps/bitte-ai/tools/base-agentkit/index.ts @@ -0,0 +1,67 @@ +import { + AgentKit, + compoundActionProvider, + defillamaActionProvider, + erc20ActionProvider, + erc721ActionProvider, + jupiterActionProvider, + pythActionProvider, + walletActionProvider, + wethActionProvider, + wowActionProvider +} from '@coinbase/agentkit'; +import { getVercelAITools } from '@coinbase/agentkit-vercel-ai-sdk'; + +import { type ToolSet } from 'ai'; + +import { AgentKitWalletProvider } from './wallet'; + +export const getTools = async () => { + const walletProvider = new AgentKitWalletProvider(); + + const agentKit = await AgentKit.from({ + walletProvider, + actionProviders: [ + walletActionProvider(), + wowActionProvider(), + wethActionProvider(), + pythActionProvider(), + // openseaActionProvider(), // Requires API key + compoundActionProvider(), + jupiterActionProvider(), + defillamaActionProvider(), + erc20ActionProvider(), + erc721ActionProvider(), + ], + }); + + // Convert AgentKit tools to MCP-compatible format + const tools: ToolSet = await getVercelAITools(agentKit); + + // Transform tools into a consistent format with proper typing + const formattedTools = Object.entries(tools).map(([name, tool]) => ({ + name, + description: tool.description as string, + parameters: tool.parameters, + execute: async (params: Record, options?: any) => { + console.log(`Executing tool ${name} with params:`, JSON.stringify(params)); + + if (!tool.execute) { + console.log(`Tool ${name} execution not available`); + return "Tool execution not available"; + } + + try { + const result = await tool.execute(params, options); + console.log(`Tool ${name} executed successfully`); + return result; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + console.error(`Error executing tool ${name}:`, errorMessage); + return `Error executing tool ${name}: ${errorMessage}`; + } + }, + })); + + return formattedTools; +}; \ No newline at end of file diff --git a/apps/bitte-ai/tools/base-agentkit/wallet.ts b/apps/bitte-ai/tools/base-agentkit/wallet.ts new file mode 100644 index 0000000..986b62e --- /dev/null +++ b/apps/bitte-ai/tools/base-agentkit/wallet.ts @@ -0,0 +1,32 @@ +import type { Network } from "@coinbase/agentkit"; +import { WalletProvider } from "@coinbase/agentkit"; + +export class AgentKitWalletProvider extends WalletProvider { + constructor() { + super(); + } + + getAddress(): string { + return "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; + } + + getNetwork(): Network { + return { + networkId: "mainnet", + chainId: "1", + protocolFamily: "ethereum", + }; + } + + getName(): string { + return "AgentKitWalletProvider"; + } + + getBalance(): Promise { + return Promise.resolve(BigInt(0)); + } + + nativeTransfer(to: string, value: string): Promise { + return Promise.resolve("0x"); + } +} diff --git a/apps/bitte-ai/tools/goat-sdk/index.ts b/apps/bitte-ai/tools/goat-sdk/index.ts index d2ddd81..8fd137a 100644 --- a/apps/bitte-ai/tools/goat-sdk/index.ts +++ b/apps/bitte-ai/tools/goat-sdk/index.ts @@ -1,20 +1,46 @@ import { getOnChainTools } from '@goat-sdk/adapter-model-context-protocol'; -import type { ToolBase } from '@goat-sdk/core'; import { USDC, erc20 } from '@goat-sdk/plugin-erc20'; import { wallet } from './wallet'; -const onChainToolsAdapter = await getOnChainTools({ - plugins: [erc20({ tokens: [USDC] })], - wallet: wallet, -}); +// Define a type for the tool objects +type GoatTool = { + name: string; + description: string; + parameters: any; + execute: (params: Record, options?: any) => Promise; +}; -export const tools: ToolBase[] = onChainToolsAdapter.listOfTools().map((toolDef) => { - return { - name: toolDef.name, - description: toolDef.description, - parameters: toolDef.inputSchema, - execute: async (params: Record) => { - return onChainToolsAdapter.toolHandler(toolDef.name, params); - }, - } as unknown as ToolBase; -}); +export const getTools = async (): Promise => { + const onChainToolsAdapter = await getOnChainTools({ + plugins: [erc20({ tokens: [USDC] })], + wallet: wallet, + }); + + // Transform on-chain tools to the format expected by the MCP server + const formattedTools = onChainToolsAdapter.listOfTools().map((toolDef) => { + return { + name: toolDef.name, + description: toolDef.description, + parameters: toolDef.inputSchema, + execute: async (params: Record, options?: any) => { + // Log tool execution if context is provided + if (options?.log) { + options.log.info(`Executing GOAT tool: ${toolDef.name} with params: ${JSON.stringify(params)}`); + } + + try { + const result = await onChainToolsAdapter.toolHandler(toolDef.name, params); + return result; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + if (options?.log) { + options.log.error(`Error executing GOAT tool ${toolDef.name}: ${errorMessage}`); + } + return `Error executing tool ${toolDef.name}: ${errorMessage}`; + } + }, + }; + }); + + return formattedTools; +}; diff --git a/apps/bitte-ai/tools/goat-sdk/wallet.ts b/apps/bitte-ai/tools/goat-sdk/wallet.ts index 3745012..0188c00 100644 --- a/apps/bitte-ai/tools/goat-sdk/wallet.ts +++ b/apps/bitte-ai/tools/goat-sdk/wallet.ts @@ -1,11 +1,12 @@ -import { type ToolBase, WalletClientBase } from '@goat-sdk/core'; +import { type Chain, type ToolBase, WalletClientBase } from '@goat-sdk/core'; +import { mainnet } from 'viem/chains'; // Create a concrete implementation of WalletClientBase class SimpleWallet extends WalletClientBase { private address: string; - private chainId: string; + private chainId: number; - constructor(address: string, chainId: string) { + constructor(address: string, chainId: number) { super(); this.address = address; this.chainId = chainId; @@ -18,7 +19,7 @@ class SimpleWallet extends WalletClientBase { getChain() { // Use the original any type since we don't have access to the Chain type definition // and this is a mock implementation for development purposes - return { id: this.chainId } as any; + return { id: this.chainId } as Chain; } async signMessage(message: string): Promise<{ signature: string; transactionURL: string }> { @@ -51,4 +52,4 @@ class SimpleWallet extends WalletClientBase { } } -export const wallet = new SimpleWallet('0x0000000000000000000000000000000000000000', 'base'); +export const wallet = new SimpleWallet('0x0000000000000000000000000000000000000000', mainnet.id); diff --git a/apps/bitte-ai/tools/index.ts b/apps/bitte-ai/tools/index.ts new file mode 100644 index 0000000..682b454 --- /dev/null +++ b/apps/bitte-ai/tools/index.ts @@ -0,0 +1,13 @@ +import { getTools as getGoatTools } from './goat-sdk'; +import { getTools as getBaseAgentkitTools } from './base-agentkit'; + +export const services = { + "goat": { + name: "goat", + tools: getGoatTools, + }, + "agentkit": { + name: "agentkit", + tools: getBaseAgentkitTools, + }, + } \ No newline at end of file diff --git a/bun.lock b/bun.lock index c33ed60..2eb6665 100644 --- a/bun.lock +++ b/bun.lock @@ -16,10 +16,13 @@ "apps/bitte-ai": { "name": "@mcp-proxy/bitte-ai", "dependencies": { + "@coinbase/agentkit": "^0.4.0", + "@coinbase/agentkit-vercel-ai-sdk": "^0.1.0", "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", "@goat-sdk/plugin-erc20": "^0.2.14", "@mcp-sdk/server": "0.0.7", + "viem": "^2.24.1", "zod": "^3.24.2", }, "devDependencies": { @@ -34,6 +37,16 @@ "packages": { "@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.11.0", "", {}, "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg=="], + "@ai-sdk/provider": ["@ai-sdk/provider@1.1.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.1", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg=="], + + "@ai-sdk/react": ["@ai-sdk/react@1.2.3", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.1", "@ai-sdk/ui-utils": "1.2.2", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-EQ6nmmQBBAal1yg72GB/Q7QnmDXMfgYvCo9Gym2mESXUHTqwpXU0JFHtk5Kq3EEkk7CVMf1oBWlNFNvU5ckQBg=="], + + "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.2", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-6rCx2jSEPuiF6fytfMNscSOinHQZp52aFCHyPVpPPkcWnOur1jPWhol+0TFCUruDl7dCfcSIfTexQUq2ioLwaA=="], + + "@alloralabs/allora-sdk": ["@alloralabs/allora-sdk@0.1.0", "", { "dependencies": { "@types/node": "^22.10.5", "typescript": "^5.7.2" } }, "sha512-jVCIx+PXOrklDf4TU27DCuf0Nri2+s+hhDGMP/s8CHUY6eSaL8G3S0E1L1vP+sF6gIjzCdV7P68QtRB0ym5vNQ=="], + "@babel/runtime": ["@babel/runtime@7.26.10", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw=="], "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], @@ -54,6 +67,12 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + "@coinbase/agentkit": ["@coinbase/agentkit@0.4.0", "", { "dependencies": { "@alloralabs/allora-sdk": "^0.1.0", "@coinbase/coinbase-sdk": "^0.20.0", "@jup-ag/api": "^6.0.39", "@privy-io/server-auth": "^1.18.4", "@solana/spl-token": "^0.4.12", "@solana/web3.js": "^1.98.0", "md5": "^2.3.0", "opensea-js": "^7.1.18", "reflect-metadata": "^0.2.2", "twitter-api-v2": "^1.18.2", "viem": "^2.22.16", "zod": "^3.23.8" } }, "sha512-jh7hzDfBfHvhwU3cQ4CkhzA0NY4RvmZNjJ9lipk+y6k1RCCfAnqMq/w/3XDPN7fqr+La0O3Phw3KNZ0jAFadEg=="], + + "@coinbase/agentkit-vercel-ai-sdk": ["@coinbase/agentkit-vercel-ai-sdk@0.1.0", "", { "dependencies": { "zod": "^3.22.4" }, "peerDependencies": { "@coinbase/agentkit": ">=0.1.0", "ai": "^4.1.16" } }, "sha512-/3ZGzs5jec2o1P8VSWXVKlZ96WCLpoGYznYyHHkunwolnRKAxcbV7vk1oeD/0wbBfXMNhpTUe5YCtgJl/2cNoA=="], + + "@coinbase/coinbase-sdk": ["@coinbase/coinbase-sdk@0.20.0", "", { "dependencies": { "@scure/bip32": "^1.4.0", "abitype": "^1.0.6", "axios": "^1.6.8", "axios-mock-adapter": "^1.22.0", "axios-retry": "^4.4.1", "bip32": "^4.0.0", "bip39": "^3.1.0", "decimal.js": "^10.4.3", "dotenv": "^16.4.5", "ed2curve": "^0.3.0", "ethers": "^6.12.1", "jose": "^5.10.0", "secp256k1": "^5.0.0", "viem": "^2.21.26" } }, "sha512-OoMMktKbjmeEwtwQCK3kIIoX5M+hNelxAGX5Llymvw6bmyrMDaEBZ/Myga9kaLJ+7Hi5Y4jPDy4Cy2MGxxXg6w=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.25.1", "", { "os": "android", "cpu": "arm" }, "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q=="], @@ -124,6 +143,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@jup-ag/api": ["@jup-ag/api@6.0.40", "", {}, "sha512-iHDOY5YiCnt+XvqCoiPTKcYWIpAY7nmeo3Rsr1Cx2sdjgqTRjqNsYtLLvjTOO33pemVz5h+U0GaU2vc9zeyjew=="], + "@mcp-proxy/bitte-ai": ["@mcp-proxy/bitte-ai@workspace:apps/bitte-ai"], "@mcp-sdk/server": ["@mcp-sdk/server@0.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.6.1", "file-type": "^20.4.1", "fuse.js": "^7.1.0", "mcp-proxy": "^2.7.0", "strict-event-emitter-types": "^2.0.0", "uri-templates": "^0.2.0", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.3" }, "peerDependencies": { "typescript": "^5.8.2" } }, "sha512-CHU8v1P7DXtdSj/ONRRHgga8Q/L14Eag7u4bR3JofwJAPMEwuG/TQ4wfna/jebUd/2I7byaSKXbWPMyanLo69A=="], @@ -134,8 +155,14 @@ "@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@opensea/seaport-js": ["@opensea/seaport-js@4.0.4", "", { "dependencies": { "ethers": "^6.9.0", "merkletreejs": "^0.4.0" } }, "sha512-pOBgU+y1H9Bh463ZdgFshFBxnBQvEaGfoOJFDHbkvZTNLSqIOyuDmICFTQJEiPjYsS6tMQTbw2oJBtcVLFUT2g=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@privy-io/server-auth": ["@privy-io/server-auth@1.19.1", "", { "dependencies": { "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@solana/web3.js": "^1.95.8", "canonicalize": "^2.0.0", "dotenv": "^16.0.3", "jose": "^4.10.4", "node-fetch-native": "^1.4.0", "redaxios": "^0.5.1", "svix": ">=1.29.0 <= 1.37.0 || ^1.40.0", "ts-case-convert": "^2.0.2", "type-fest": "^3.6.1" }, "peerDependencies": { "viem": "^2" }, "optionalPeers": ["viem"] }, "sha512-jNhYtRbfxtcI16J1DIAsE6+BtD9Adq2hHdRjm7Hjgmjky3yKUqeXPW0tSvkvZDsEZKyY3+ykrsv2oTQ3rfe9kA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.36.0", "", { "os": "android", "cpu": "arm" }, "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.36.0", "", { "os": "android", "cpu": "arm64" }, "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg=="], @@ -180,34 +207,116 @@ "@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + + "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], + + "@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/options": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], + + "@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + + "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], + + "@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], + + "@solana/spl-token": ["@solana/spl-token@0.4.13", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w=="], + + "@solana/spl-token-group": ["@solana/spl-token-group@0.0.7", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug=="], + + "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.6", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA=="], + + "@solana/web3.js": ["@solana/web3.js@1.98.0", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "agentkeepalive": "^4.5.0", "bigint-buffer": "^1.1.5", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA=="], + + "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], "@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="], + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/diff-match-patch": ["@types/diff-match-patch@1.0.36", "", {}, "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg=="], + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], "@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + "@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="], + "@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], + "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], + "abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + "aes-js": ["aes-js@4.0.0-beta.5", "", {}, "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "ai": ["ai@4.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.0", "@ai-sdk/provider-utils": "2.2.1", "@ai-sdk/react": "1.2.3", "@ai-sdk/ui-utils": "1.2.2", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-0gwfPZAuuQ+uTfk/GssrfnNTYxliCFKojbSQoEhzpbpSVaPao9NoU3iuE8vwBjWuDKqILRGzYGFE4+vTak0Oxg=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@1.8.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw=="], + + "axios-mock-adapter": ["axios-mock-adapter@1.22.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" }, "peerDependencies": { "axios": ">= 0.17.0" } }, "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw=="], + + "axios-retry": ["axios-retry@4.5.0", "", { "dependencies": { "is-retry-allowed": "^2.2.0" }, "peerDependencies": { "axios": "0.x || 1.x" } }, "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bigint-buffer": ["bigint-buffer@1.1.5", "", { "dependencies": { "bindings": "^1.3.0" } }, "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA=="], + + "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bip32": ["bip32@4.0.0", "", { "dependencies": { "@noble/hashes": "^1.2.0", "@scure/base": "^1.1.1", "typeforce": "^1.11.5", "wif": "^2.0.6" } }, "sha512-aOGy88DDlVUhspIXJN+dVEtclhIsfAUppD43V0j40cPTld3pv/0X/MlrZSZ6jowIaQQzFwP8M6rFU2z2mVYjDQ=="], + + "bip39": ["bip39@3.1.0", "", { "dependencies": { "@noble/hashes": "^1.2.0" } }, "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A=="], + + "bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], + "body-parser": ["body-parser@2.1.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.5.2", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ=="], + "borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "bs58check": ["bs58check@2.1.2", "", { "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-reverse": ["buffer-reverse@1.0.1", "", {}, "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg=="], + + "bufferutil": ["bufferutil@4.0.9", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw=="], + "bun-types": ["bun-types@1.2.4", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q=="], "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], @@ -220,16 +329,24 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "canonicalize": ["canonicalize@2.1.0", "", { "bin": { "canonicalize": "bin/canonicalize.js" } }, "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "cipher-base": ["cipher-base@1.0.6", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw=="], + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "concurrently": ["concurrently@8.2.2", "", { "dependencies": { "chalk": "^4.1.2", "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg=="], @@ -246,22 +363,44 @@ "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + + "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], + "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + "diff-match-patch": ["diff-match-patch@1.0.5", "", {}, "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="], + + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + "ed2curve": ["ed2curve@0.3.0", "", { "dependencies": { "tweetnacl": "1.x.x" } }, "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ=="], + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], @@ -272,6 +411,12 @@ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], + + "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], + "esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", "@esbuild/android-arm64": "0.25.1", "@esbuild/android-x64": "0.25.1", "@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-x64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-x64": "0.25.1", "@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-x64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-x64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.1", "@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-x64": "0.25.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -280,6 +425,8 @@ "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + "ethers": ["ethers@6.13.5", "", { "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", "ws": "8.17.1" } }, "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ=="], + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], "eventsource": ["eventsource@3.0.5", "", { "dependencies": { "eventsource-parser": "^3.0.0" } }, "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw=="], @@ -290,16 +437,32 @@ "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + "eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="], + + "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], + + "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="], + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], "file-type": ["file-type@20.4.1", "", { "dependencies": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ=="], + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], @@ -324,10 +487,20 @@ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hash-base": ["hash-base@3.1.0", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" } }, "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="], + + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -336,18 +509,36 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "is-retry-allowed": ["is-retry-allowed@2.2.0", "", {}, "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], + "isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "jayson": ["jayson@4.1.3", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "JSONStream": "^1.3.5", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ=="], + + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "jsondiffpatch": ["jsondiffpatch@0.6.0", "", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="], + + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], @@ -364,16 +555,26 @@ "mcp-proxy": ["mcp-proxy@2.10.4", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.6.0", "eventsource": "^3.0.5", "yargs": "^17.7.2" }, "bin": { "mcp-proxy": "dist/bin/mcp-proxy.js" } }, "sha512-J6rEqvr5zEExDNllgBM+9en7A/OGJ7GKIcToxb3XkQ5KZ11jRlm9JCDtCm/07b8d1uHyynCQldZScbMPxiMpxA=="], + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + + "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + "merkletreejs": ["merkletreejs@0.4.1", "", { "dependencies": { "buffer-reverse": "^1.0.1", "crypto-js": "^4.2.0", "treeify": "^1.1.0" } }, "sha512-W2VSHeGTdAnWtedee+pgGn7SHvncMdINnMeHAaXrfarSaMNLff/pm7RCr/QXYxN6XzJFgJZY+28ejO0lAosW4A=="], + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], "mime-db": ["mime-db@1.53.0", "", {}, "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg=="], "mime-types": ["mime-types@3.0.0", "", { "dependencies": { "mime-db": "^1.53.0" } }, "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], @@ -382,8 +583,18 @@ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "node-addon-api": ["node-addon-api@5.1.0", "", {}, "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -392,7 +603,9 @@ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + "opensea-js": ["opensea-js@7.1.18", "", { "dependencies": { "@opensea/seaport-js": "^4.0.0", "ethers": "^6.9.0" } }, "sha512-cFSwroGwRkb8/FHsNjIwL2qvdve39CKMU6IUKmx+zDfsgVwKQ+7SHEj5YfKEspji5kUPpnfBlNLCAIbRS+pssA=="], + + "ox": ["ox@0.6.9", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], @@ -418,40 +631,62 @@ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "redaxios": ["redaxios@0.5.1", "", {}, "sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg=="], + "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + "ripemd160": ["ripemd160@2.0.2", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="], + "rollup": ["rollup@4.36.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.36.0", "@rollup/rollup-android-arm64": "4.36.0", "@rollup/rollup-darwin-arm64": "4.36.0", "@rollup/rollup-darwin-x64": "4.36.0", "@rollup/rollup-freebsd-arm64": "4.36.0", "@rollup/rollup-freebsd-x64": "4.36.0", "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", "@rollup/rollup-linux-arm-musleabihf": "4.36.0", "@rollup/rollup-linux-arm64-gnu": "4.36.0", "@rollup/rollup-linux-arm64-musl": "4.36.0", "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", "@rollup/rollup-linux-riscv64-gnu": "4.36.0", "@rollup/rollup-linux-s390x-gnu": "4.36.0", "@rollup/rollup-linux-x64-gnu": "4.36.0", "@rollup/rollup-linux-x64-musl": "4.36.0", "@rollup/rollup-win32-arm64-msvc": "4.36.0", "@rollup/rollup-win32-ia32-msvc": "4.36.0", "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q=="], "router": ["router@2.1.0", "", { "dependencies": { "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA=="], + "rpc-websockets": ["rpc-websockets@9.1.1", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA=="], + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "secp256k1": ["secp256k1@5.0.1", "", { "dependencies": { "elliptic": "^6.5.7", "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" } }, "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA=="], + + "secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="], + "send": ["send@1.1.0", "", { "dependencies": { "debug": "^4.3.5", "destroy": "^1.2.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^0.5.2", "http-errors": "^2.0.0", "mime-types": "^2.1.35", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA=="], "serve-static": ["serve-static@2.1.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.0.0" } }, "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + "sha.js": ["sha.js@2.4.11", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "./bin.js" } }, "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], @@ -480,6 +715,8 @@ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -488,12 +725,26 @@ "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + "superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "svix": ["svix@1.62.0", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "@types/node": "^22.7.5", "es6-promise": "^4.2.8", "fast-sha256": "^1.3.0", "svix-fetch": "^3.0.0", "url-parse": "^1.5.10" } }, "sha512-Ia1s78JVcK0SXEzULNln4Vqi8LN3l+9rEs7d10XoOtg1c/dY2r59W4qRwd77BVbstW2v3HmsSqXkeZ6eZktnhA=="], + + "svix-fetch": ["svix-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-rcADxEFhSqHbraZIsjyZNh4TF6V+koloX1OzZ+AQuObX9mZ2LIMhm1buZeuc5BIZPftZpJCMBsSiBaeszo9tRw=="], + + "swr": ["swr@2.3.3", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A=="], + + "text-encoding-utf-8": ["text-encoding-utf-8@1.0.2", "", {}, "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="], + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="], @@ -506,6 +757,10 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "treeify": ["treeify@1.1.0", "", {}, "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A=="], + + "ts-case-convert": ["ts-case-convert@2.1.0", "", {}, "sha512-Ye79el/pHYXfoew6kqhMwCoxp4NWjKNcm2kBzpmEMIU9dd9aBmHNNFtZ+WTm0rz1ngyDmfqDXDlyUnBXayiD0w=="], + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -526,8 +781,16 @@ "turbo-windows-arm64": ["turbo-windows-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg=="], + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "twitter-api-v2": ["twitter-api-v2@1.22.0", "", {}, "sha512-KlcRL9vcBzjeS/PwxX33NziP+SHp9n35DOclKtpOmnNes7nNVnK7WG4pKlHfBqGrY5kAz/8J5ERS8DWkYOaiWw=="], + + "type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + "type-is": ["type-is@2.0.0", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw=="], + "typeforce": ["typeforce@1.18.0", "", {}, "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="], + "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], @@ -538,25 +801,39 @@ "uri-templates": ["uri-templates@0.2.0", "", {}, "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg=="], + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "viem": ["viem@2.23.4", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-UQquuolKlS1w5H5e0Fd1KKoUlIPJryIEBzY5AUhGyV1ka+9O6+3uYVhUzj6RbvGK0PtsMKn2ddwPZFwjNDVU/A=="], + "viem": ["viem@2.24.1", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.9", "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-xptFlc081SIPz+ZNDeb0XS/Nn5PU28onq+im+UxEAPCXTIuL1kfw1GTnV8NhbUNoEONnrwcZNqoI0AT0ADF5XQ=="], "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "wif": ["wif@2.0.6", "", { "dependencies": { "bs58check": "<3.0.0" } }, "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ=="], + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -568,8 +845,14 @@ "zod-to-json-schema": ["zod-to-json-schema@3.23.5", "", { "peerDependencies": { "zod": "^3.23.3" } }, "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA=="], + "@ai-sdk/ui-utils/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + + "@goat-sdk/plugin-erc20/viem": ["viem@2.23.4", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-UQquuolKlS1w5H5e0Fd1KKoUlIPJryIEBzY5AUhGyV1ka+9O6+3uYVhUzj6RbvGK0PtsMKn2ddwPZFwjNDVU/A=="], + "@goat-sdk/plugin-erc20/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + "@goat-sdk/wallet-evm/viem": ["viem@2.23.4", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-UQquuolKlS1w5H5e0Fd1KKoUlIPJryIEBzY5AUhGyV1ka+9O6+3uYVhUzj6RbvGK0PtsMKn2ddwPZFwjNDVU/A=="], + "@goat-sdk/wallet-evm/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -578,40 +861,94 @@ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "@mcp-proxy/bitte-ai/@types/bun": ["@types/bun@1.2.5", "", { "dependencies": { "bun-types": "1.2.5" } }, "sha512-w2OZTzrZTVtbnJew1pdFmgV99H0/L+Pvw+z1P67HaR18MHOzYnTYOi6qzErhK8HyT+DB782ADVPPE92Xu2/Opg=="], + "@mcp-proxy/bitte-ai/@types/bun": ["@types/bun@1.2.8", "", { "dependencies": { "bun-types": "1.2.7" } }, "sha512-t8L1RvJVUghW5V+M/fL3Thbxcs0HwNsXsnTEBEfEVqGteiJToOlZ/fyOEaR1kZsNqnu+3XA4RI/qmnX4w6+S+w=="], "@mcp-sdk/server/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], "@mcp-sdk/server/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "@privy-io/server-auth/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + + "@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "axios-mock-adapter/is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], + "body-parser/iconv-lite": ["iconv-lite@0.5.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag=="], "body-parser/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "elliptic/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "ethers/@adraffy/ens-normalize": ["@adraffy/ens-normalize@1.10.1", "", {}, "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw=="], + + "ethers/@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], + + "ethers/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + + "ethers/@types/node": ["@types/node@22.7.5", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ=="], + + "ethers/tslib": ["tslib@2.7.0", "", {}, "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA=="], + + "ethers/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + "express/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "jsondiffpatch/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + "mcp-proxy/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], + "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "send/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], "send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "send/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "@goat-sdk/plugin-erc20/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + + "@goat-sdk/plugin-erc20/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "@goat-sdk/wallet-evm/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + + "@goat-sdk/wallet-evm/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - "@mcp-proxy/bitte-ai/@types/bun/bun-types": ["bun-types@1.2.5", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-3oO6LVGGRRKI4kHINx5PIdIgnLRb7l/SprhzqXapmoYkFl5m4j6EvALvbDVuuBFaamB46Ap6HCUxIXNLCGy+tg=="], + "@mcp-proxy/bitte-ai/@types/bun/bun-types": ["bun-types@1.2.7", "", { "dependencies": { "@types/node": "*", "@types/ws": "*" } }, "sha512-P4hHhk7kjF99acXqKvltyuMQ2kf/rzIw3ylEDpCxDS9Xa0X0Yp/gJu/vDCucmWpiur5qJ0lwB2bWzOXa2GlHqA=="], + + "ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], "express/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "jayson/@types/ws/@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + "mcp-proxy/@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "send/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], "send/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], From 6850fa5a73c6180fc8a55699c73c9c1ef36bc61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lui=CC=81s=20Freitas?= Date: Wed, 2 Apr 2025 14:12:12 +0100 Subject: [PATCH 2/5] Refactor Bitte AI integration by replacing MCP with FastMCP for improved performance and functionality. Introduced new search tools for agents and tools, enhancing the API's capabilities. Updated package.json to include new dependencies and adjusted TypeScript configuration for better module handling. Added utility functions for API calls and search operations, streamlining the codebase. --- apps/bitte-ai/index.ts | 321 +++++++++++-------------- apps/bitte-ai/lib/search.ts | 321 +++++++++++++++++++++++++ apps/bitte-ai/package.json | 3 +- apps/bitte-ai/tools/goat-sdk/index.ts | 4 +- apps/bitte-ai/tools/goat-sdk/wallet.ts | 2 +- apps/bitte-ai/tsconfig.json | 4 +- apps/bitte-ai/utils/bitte-registry.ts | 58 +++++ apps/bitte-ai/utils/bitte.ts | 45 ++++ apps/bitte-ai/utils/search.ts | 125 ++++++++++ bun.lock | 49 +++- 10 files changed, 739 insertions(+), 193 deletions(-) create mode 100644 apps/bitte-ai/lib/search.ts create mode 100644 apps/bitte-ai/utils/bitte-registry.ts create mode 100644 apps/bitte-ai/utils/bitte.ts create mode 100644 apps/bitte-ai/utils/search.ts diff --git a/apps/bitte-ai/index.ts b/apps/bitte-ai/index.ts index 3b3f251..0aab591 100644 --- a/apps/bitte-ai/index.ts +++ b/apps/bitte-ai/index.ts @@ -1,8 +1,13 @@ -import { MCP } from '@mcp-sdk/server'; import { z } from 'zod'; -import { config } from './config'; import { services } from './tools'; - +import { FastMCP } from 'fastmcp'; +import { callBitteAPI } from './utils/bitte'; +import { + searchAgents, + searchAgentsSchema, + searchTools, + searchToolsSchema +} from './lib/search'; // Export configuration export { config } from './config'; @@ -24,11 +29,27 @@ export interface ExecuteAgentParams { input: string; } +// Function to convert object to URLSearchParams +function objectToParams(obj: Record): string { + const params = new URLSearchParams(); + Object.entries(obj).forEach(([key, value]) => { + if (value !== undefined) { + params.append(key, String(value)); + } + }); + return params.toString(); +} + // Create and export the server -export const server = new MCP({ +export const server = new FastMCP({ name: 'bitte-ai-mcp-proxy', version: '0.0.1', authenticate: async (req) => { + + const agentId = req.headers['x-agent-id']; + const accountId = req.headers['x-account-id']; + const bitteApiKey = req.headers['x-bitte-api-key']; + return { id: `user-${Math.random().toString(36).substring(2, 15)}`, }; @@ -48,38 +69,10 @@ server.addTool({ }), execute: async (args, { log }) => { log.info(`Getting agents with params: ${JSON.stringify(args)}`); - - // Build query parameters - const params = new URLSearchParams(); - if (args.verifiedOnly !== undefined) - params.append('verifiedOnly', args.verifiedOnly.toString()); - if (args.chainIds) params.append('chainIds', args.chainIds); - if (args.category) params.append('category', args.category); - if (args.limit) params.append('limit', args.limit.toString()); - if (args.offset) params.append('offset', args.offset.toString()); - - const url = `${config.bitteRegistryUrl}/api/agents`; - - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - return JSON.stringify(data); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - log.error(`Error fetching agents: ${errorMessage}`); - return { - content: [ - { - type: 'text', - text: 'Error fetching agents', - }, - ], - isError: true, - }; - } + const params = objectToParams(args); + const endpoint = `/api/agents${params ? `?${params}` : ''}`; + const data = await callBitteAPI(endpoint, 'GET', undefined, log); + return JSON.stringify(data); }, }); @@ -92,76 +85,24 @@ server.addTool({ }), execute: async (args, { log }) => { log.info(`Getting agent with ID: ${args.agentId}`); - - const url = `${config.bitteRegistryUrl}/api/agents/${args.agentId}`; - - try { - const response = await fetch(url); - if (response.status === 404) { - return { - content: [ - { - type: 'text', - text: 'Agent not found', - }, - ], - isError: true, - }; - } - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - return JSON.stringify(data); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - log.error(`Error fetching agent: ${errorMessage}`); - - return { - content: [ - { - type: 'text', - text: 'Error fetching agent', - }, - ], - isError: true, - }; - } + const endpoint = `/api/agents/${args.agentId}`; + const data = await callBitteAPI(endpoint, 'GET', undefined, log); + return JSON.stringify(data); }, }); // Tool to get all tools from Bitte AI API server.addTool({ - name: 'get-all-tools', + name: 'search-tools', description: 'Get a list of tools from the Bitte AI registry', parameters: z.object({ random_string: z.string().optional().describe('Dummy parameter for no-parameter tools'), }), execute: async (args, { log }) => { log.info('Getting tools'); - - const url = `${config.bitteRegistryUrl}/api/tools`; - - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - return JSON.stringify(data); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - log.error(`Error fetching tools: ${errorMessage}`); - return { - content: [ - { - type: 'text', - text: 'Error fetching tools', - }, - ], - isError: true, - }; - } + const endpoint = `/api/tools`; + const data = await callBitteAPI(endpoint, 'GET', undefined, log); + return JSON.stringify(data); }, }); @@ -174,55 +115,27 @@ server.addTool({ }), execute: async (args, { log, session }) => { log.info(`Executing agent with ID: ${args.agentId}`); - - const url = `${config.bitteRuntimeUrl}/chat`; - - try { - const response = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${config.bitteApiKey}`, - }, - body: JSON.stringify({ - id: session?.id, - agentId: args.agentId, - accountId: '', // TODO: find a way to get the account id - messages: [{ role: 'user', content: args.input }], - }), - }); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.text(); - return { - content: [ - { - type: 'text', - text: data, - }, - ], - }; - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - log.error(`Error executing agent: ${errorMessage}`); + + const body = { + id: session?.id, + agentId: args.agentId, + accountId: '', // TODO: find a way to get the account id + messages: [{ role: 'user', content: args.input }], + }; + + const data = await callBitteAPI('/chat', 'POST', body, log); + + if (typeof data === 'string') { return { - content: [ - { - type: 'text', - text: `Error executing agent: ${errorMessage}`, - }, - ], - isError: true, + content: [{ type: 'text', text: data }], }; } + + // Ensure we return a properly typed result + return data as any; }, }); -// Add tools from extra-tools - // Tool to get existing tools server.addTool({ name: 'get-existing-tools', @@ -233,15 +146,26 @@ server.addTool({ execute: async (args, { log }) => { log.info(`Executing get-existing-tools tool with params: ${JSON.stringify(args)}`); - switch (args.service) { - case services.goat.name: - const goatTools = await services.goat.tools(); - return JSON.stringify(goatTools); - case services.agentkit.name: - const baseAgentkitTools = await services.agentkit.tools(); - return JSON.stringify(baseAgentkitTools); - default: - throw new Error(`Unknown service: ${args.service}`); + try { + let tools; + switch (args.service) { + case services.goat.name: + tools = await services.goat.tools(); + break; + case services.agentkit.name: + tools = await services.agentkit.tools(); + break; + default: + throw new Error(`Unknown service: ${args.service}`); + } + return JSON.stringify(tools); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log.error(`Error getting tools: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error getting tools: ${errorMessage}` }], + isError: true, + }; } }, }); @@ -253,7 +177,6 @@ server.addTool({ parameters: z.object({}), execute: async (args, { log }) => { log.info('Executing get-available-services tool'); - return JSON.stringify({ services: Object.values(services).map((service) => service.name), count: Object.keys(services).length, @@ -272,40 +195,79 @@ server.addTool({ }), execute: async (args, { log }) => { log.info(`Executing execute-tool tool with params: ${JSON.stringify(args)}`); - console.log(`[execute-tool] Starting execution for tool: ${args.tool} from service: ${args.service} with params: ${JSON.stringify(args.params)}`); - - switch (args.service) { - case services.goat.name: { - console.log(`[execute-tool] Fetching GOAT tools`); - const goatTools = await services.goat.tools(); - console.log(`[execute-tool] Found ${goatTools.length} GOAT tools`); - const tool = goatTools.find((t) => t.name === args.tool); - if (!tool) { - console.error(`[execute-tool] Tool not found: ${args.tool}`); - throw new Error(`Tool not found: ${args.tool}`); + + try { + let tool; + switch (args.service) { + case services.goat.name: { + const goatTools = await services.goat.tools(); + tool = goatTools.find((t) => t.name === args.tool); + break; } - console.log(`[execute-tool] Executing GOAT tool: ${args.tool} with params:`, args.params); - const result = await tool.execute(args.params); - console.log(`[execute-tool] GOAT tool execution completed`); - return result; - } - case services.agentkit.name: { - console.log(`[execute-tool] Fetching AgentKit tools`); - const baseAgentkitTools = await services.agentkit.tools(); - console.log(`[execute-tool] Found ${baseAgentkitTools.length} AgentKit tools`); - const tool = baseAgentkitTools.find((t) => t.name === args.tool); - if (!tool) { - console.error(`[execute-tool] Tool not found: ${args.tool}`); - throw new Error(`Tool not found: ${args.tool}`); + case services.agentkit.name: { + const agentkitTools = await services.agentkit.tools(); + tool = agentkitTools.find((t) => t.name === args.tool); + break; } - console.log(`[execute-tool] Executing AgentKit tool: ${args.tool} with params:`, JSON.stringify(args.params)); - const result = await tool.execute(args.params); - console.log(`[execute-tool] AgentKit tool execution completed`); - return result; + default: + throw new Error(`Unknown service: ${args.service}`); + } + + if (!tool) { + throw new Error(`Tool not found: ${args.tool}`); } - default: - console.error(`[execute-tool] Unknown tool: ${args.tool}`); - throw new Error(`Unknown tool: ${args.tool}`); + + log.info(`Executing ${args.service} tool: ${args.tool}`); + return await tool.execute(args.params); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log.error(`Error executing tool: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error executing tool: ${errorMessage}` }], + isError: true, + }; + } + }, +}); + +// Tool to search for agents across Bitte API and other services +server.addTool({ + name: 'search-agents', + description: 'Search for AI agents across Bitte API and other services', + parameters: searchAgentsSchema, + execute: async (args, { log }) => { + log.info(`Searching agents with params: ${JSON.stringify(args)}`); + try { + const result = await searchAgents(args, log); + return JSON.stringify(result); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log.error(`Error searching agents: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error searching agents: ${errorMessage}` }], + isError: true, + }; + } + }, +}); + +// Tool to search for tools across Bitte API and other services +server.addTool({ + name: 'search-tools', + description: 'Search for tools across Bitte API and other services', + parameters: searchToolsSchema, + execute: async (args, { log }) => { + log.info(`Searching tools with params: ${JSON.stringify(args)}`); + try { + const result = await searchTools(args, log); + return JSON.stringify(result); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log.error(`Error searching tools: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error searching tools: ${errorMessage}` }], + isError: true, + }; } }, }); @@ -317,7 +279,6 @@ export async function startServer(port = 3000) { sse: { endpoint: '/sse', port, - host: '0.0.0.0', }, }); console.log(`Bitte AI MCP Proxy server is running on port ${port}`); diff --git a/apps/bitte-ai/lib/search.ts b/apps/bitte-ai/lib/search.ts new file mode 100644 index 0000000..370ea6d --- /dev/null +++ b/apps/bitte-ai/lib/search.ts @@ -0,0 +1,321 @@ +import { z } from 'zod'; +import type { Agent } from '../utils/bitte-registry'; +import { searchArray } from '../utils/search'; +import type { SearchResult, SearchOptions } from '../utils/search'; +import { callBitteAPI } from '../utils/bitte'; +import { services } from '../tools'; + +// Define a type for service keys +type ServiceKey = keyof typeof services; + +// Define a generic interface for tools +interface GenericTool { + name: string; + description?: string; + parameters?: Record; + execute: (params: Record, options?: any) => Promise; +} + +/** + * Parameters for searching agents + */ +export interface SearchAgentsParams { + query: string; + verifiedOnly?: boolean; + chainIds?: string; + category?: string; + limit?: number; + offset?: number; + threshold?: number; + includeServices?: string[]; +} + +/** + * Default search options + */ +const DEFAULT_SEARCH_PARAMS: Omit = { + verifiedOnly: true, + limit: 10, + offset: 0, + threshold: 0.3, + includeServices: Object.keys(services) +}; + +/** + * Search results combining agents from Bitte API and other services + */ +export interface CombinedAgentsSearchResult { + bitteResults: SearchResult[]; + serviceResults: Record[]>; + totalResults: number; +} + +/** + * Search for agents across Bitte API and optionally other services + * @param params Search parameters + * @param log Optional logger + * @returns Combined search results + */ +export async function searchAgents( + params: SearchAgentsParams, + log?: any +): Promise { + // Merge with default parameters + const mergedParams = { ...DEFAULT_SEARCH_PARAMS, ...params }; + const { + query, + verifiedOnly, + chainIds, + category, + limit, + offset, + threshold, + includeServices + } = mergedParams; + + // Search options for Fuse.js + const searchOptions: SearchOptions = { + keys: ['name', 'description', 'instructions', 'generatedDescription', 'category'], + limit, + threshold + }; + + // Initialize results + const result: CombinedAgentsSearchResult = { + bitteResults: [], + serviceResults: {}, + totalResults: 0 + }; + + // First, search Bitte API + try { + log?.info(`Searching for agents with query: ${query}`); + + // Build API query parameters + const apiParams: Record = { + verifiedOnly, + limit, + offset + }; + + if (chainIds) apiParams.chainIds = chainIds; + if (category) apiParams.category = category; + + // Convert object to URL search parameters + const urlParams = new URLSearchParams(); + Object.entries(apiParams).forEach(([key, value]) => { + if (value !== undefined) { + urlParams.append(key, String(value)); + } + }); + + // Call Bitte API to get agents + const endpoint = `/api/agents?${urlParams.toString()}`; + const response = await callBitteAPI(endpoint, 'GET', undefined, log); + + // If response is an array, search within it + if (Array.isArray(response)) { + // Search within the results using Fuse.js + result.bitteResults = searchArray(response, query, searchOptions); + result.totalResults += result.bitteResults.length; + } else { + log?.warn('Bitte API did not return an array of agents'); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error(`Error searching Bitte API: ${errorMessage}`); + } + + // Then, search each included service + if (includeServices && includeServices.length > 0) { + await Promise.all( + includeServices.map(async (serviceName) => { + try { + // Check if service name is a valid key + if (!(serviceName in services)) { + log?.warn(`Service not found: ${serviceName}`); + return; + } + + const service = services[serviceName as ServiceKey]; + + // Get tools from the service, which might include agents + const tools = await service.tools() as GenericTool[]; + + // Extract agents from tools if possible + // This assumes that some tools might be or contain agents + // You may need to adapt this logic based on your actual service implementation + const agentsFromTools = tools + .filter((tool: GenericTool) => + // Example filtering logic - adjust as needed for your use case + tool.parameters?.agentId || + tool.name.toLowerCase().includes('agent') + ) + .map((tool: GenericTool) => { + // Convert tool to Agent format - adjust mapping as needed + return { + id: tool.parameters?.agentId || tool.name, + name: tool.name, + accountId: '', + description: tool.description || '', + instructions: '', + tools: [], + verified: true, + pings: 0 + } as Agent; + }); + + if (agentsFromTools.length > 0) { + // Search within the agents from this service + result.serviceResults[serviceName] = searchArray( + agentsFromTools, + query, + searchOptions + ); + result.totalResults += result.serviceResults[serviceName].length; + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error(`Error searching service ${serviceName}: ${errorMessage}`); + result.serviceResults[serviceName] = []; + } + }) + ); + } + + return result; +} + +// Export zodSchema for use with FastMCP +export const searchAgentsSchema = z.object({ + query: z.string().describe('Search query text'), + verifiedOnly: z.boolean().optional().default(true), + chainIds: z.string().optional(), + category: z.string().optional(), + limit: z.number().optional().default(10), + offset: z.number().optional().default(0), + threshold: z.number().optional().default(0.3), + includeServices: z.array(z.string()).optional().default(Object.keys(services)) +}); + +/** + * Parameters for searching tools + */ +export interface SearchToolsParams { + query: string; + includeServices?: string[]; + limit?: number; + threshold?: number; +} + +/** + * Default search options for tools + */ +const DEFAULT_TOOLS_SEARCH_PARAMS: Omit = { + limit: 10, + threshold: 0.3, + includeServices: Object.keys(services) +}; + +/** + * Search results for tools + */ +export interface ToolsSearchResult { + bitteResults: SearchResult[]; + serviceResults: Record[]>; + totalResults: number; +} + +/** + * Search for tools across Bitte API and other services + * @param params Search parameters + * @param log Optional logger + * @returns Combined search results + */ +export async function searchTools( + params: SearchToolsParams, + log?: any +): Promise { + // Merge with default parameters + const mergedParams = { ...DEFAULT_TOOLS_SEARCH_PARAMS, ...params }; + const { query, limit, threshold, includeServices } = mergedParams; + + // Search options for Fuse.js + const searchOptions: SearchOptions = { + keys: ['name', 'description', 'function.name', 'function.description'], + limit, + threshold + }; + + // Initialize results + const result: ToolsSearchResult = { + bitteResults: [], + serviceResults: {}, + totalResults: 0 + }; + + // First, search Bitte API tools + try { + log?.info(`Searching for tools with query: ${query}`); + + // Call Bitte API to get tools + const endpoint = `/api/tools`; + const response = await callBitteAPI(endpoint, 'GET', undefined, log); + + // If response is an array, search within it + if (Array.isArray(response)) { + // Search within the results using Fuse.js + result.bitteResults = searchArray(response, query, searchOptions); + result.totalResults += result.bitteResults.length; + } else { + log?.warn('Bitte API did not return an array of tools'); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error(`Error searching Bitte API tools: ${errorMessage}`); + } + + // Then, search each included service + if (includeServices && includeServices.length > 0) { + await Promise.all( + includeServices.map(async (serviceName) => { + try { + // Check if service name is a valid key + if (!(serviceName in services)) { + log?.warn(`Service not found: ${serviceName}`); + return; + } + + const service = services[serviceName as ServiceKey]; + + // Get tools from the service + const tools = await service.tools() as GenericTool[]; + + if (tools.length > 0) { + // Search within the tools from this service + result.serviceResults[serviceName] = searchArray( + tools, + query, + searchOptions + ); + result.totalResults += result.serviceResults[serviceName].length; + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error(`Error searching service ${serviceName} tools: ${errorMessage}`); + result.serviceResults[serviceName] = []; + } + }) + ); + } + + return result; +} + +// Export zodSchema for searching tools +export const searchToolsSchema = z.object({ + query: z.string().describe('Search query text'), + limit: z.number().optional().default(10), + threshold: z.number().optional().default(0.3), + includeServices: z.array(z.string()).optional().default(Object.keys(services)) +}); diff --git a/apps/bitte-ai/package.json b/apps/bitte-ai/package.json index a14eb7d..2a379fd 100644 --- a/apps/bitte-ai/package.json +++ b/apps/bitte-ai/package.json @@ -26,7 +26,8 @@ "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", "@goat-sdk/plugin-erc20": "^0.2.14", - "@mcp-sdk/server": "0.0.7", + "fastmcp": "^1.20.5", + "fuse.js": "^7.1.0", "viem": "^2.24.1", "zod": "^3.24.2" } diff --git a/apps/bitte-ai/tools/goat-sdk/index.ts b/apps/bitte-ai/tools/goat-sdk/index.ts index 8fd137a..32d4d38 100644 --- a/apps/bitte-ai/tools/goat-sdk/index.ts +++ b/apps/bitte-ai/tools/goat-sdk/index.ts @@ -1,5 +1,5 @@ import { getOnChainTools } from '@goat-sdk/adapter-model-context-protocol'; -import { USDC, erc20 } from '@goat-sdk/plugin-erc20'; +import { USDC, WETH, erc20 } from '@goat-sdk/plugin-erc20'; import { wallet } from './wallet'; // Define a type for the tool objects @@ -12,7 +12,7 @@ type GoatTool = { export const getTools = async (): Promise => { const onChainToolsAdapter = await getOnChainTools({ - plugins: [erc20({ tokens: [USDC] })], + plugins: [erc20({ tokens: [USDC, WETH] })], wallet: wallet, }); diff --git a/apps/bitte-ai/tools/goat-sdk/wallet.ts b/apps/bitte-ai/tools/goat-sdk/wallet.ts index 0188c00..a1d3df9 100644 --- a/apps/bitte-ai/tools/goat-sdk/wallet.ts +++ b/apps/bitte-ai/tools/goat-sdk/wallet.ts @@ -52,4 +52,4 @@ class SimpleWallet extends WalletClientBase { } } -export const wallet = new SimpleWallet('0x0000000000000000000000000000000000000000', mainnet.id); +export const wallet = new SimpleWallet('0x742d35Cc6634C0532925a3b844Bc454e4438f44e', mainnet.id); diff --git a/apps/bitte-ai/tsconfig.json b/apps/bitte-ai/tsconfig.json index 4bd9907..da64681 100644 --- a/apps/bitte-ai/tsconfig.json +++ b/apps/bitte-ai/tsconfig.json @@ -22,6 +22,6 @@ "forceConsistentCasingInFileNames": true, "outDir": "dist" }, - "include": ["index.ts", "config.ts", "tools/**/*.ts"], - "files": ["index.ts", "config.ts", "tools/goat-sdk/index.ts", "tools/goat-sdk/wallet.ts"] + "include": ["index.ts", "config.ts", "tools/**/*.ts", "utils/**/*.ts", "lib/**/*.ts"], + "files": ["index.ts", "config.ts", "tools/goat-sdk/index.ts", "tools/goat-sdk/wallet.ts", "utils/bitte.ts", "lib/search.ts"] } diff --git a/apps/bitte-ai/utils/bitte-registry.ts b/apps/bitte-ai/utils/bitte-registry.ts new file mode 100644 index 0000000..603b216 --- /dev/null +++ b/apps/bitte-ai/utils/bitte-registry.ts @@ -0,0 +1,58 @@ +// Base interface for all registry items +export interface RegistryItem { + id: string; + name: string; + description: string; + version: string; + createdAt: Date; + updatedAt: Date; +} + +// Agent Tool definition +export interface AgentTool { + id?: string; + agentId?: string; + type: string; + function: { + name: string; + description: string; + parameters?: Record; + }; + execution?: { + baseUrl: string; + path: string; + httpMethod: string; + }; + verified?: boolean; + image?: string; + chainIds?: (number | string)[]; + isPrimitive?: boolean; + pings?: number; +} + +// Agent definitions +export interface Agent { + id: string; + name: string; + accountId: string; + description: string; + instructions: string; + tools: AgentTool[]; + image?: string; + verified: boolean; + chainIds?: (number | string)[]; + repo?: string; + generatedDescription?: string; + category?: string; + defaultPrompts?: string[]; + pings: number; +} + +// Registry type that contains all items +export interface BitteRegistry { + agents: Agent[]; +} + +export function isAgent(item: any): item is Agent { + return item && typeof item === 'object' && 'tools' in item && Array.isArray(item.tools); +} diff --git a/apps/bitte-ai/utils/bitte.ts b/apps/bitte-ai/utils/bitte.ts new file mode 100644 index 0000000..162fdd5 --- /dev/null +++ b/apps/bitte-ai/utils/bitte.ts @@ -0,0 +1,45 @@ +import { config } from "../config"; + +// Reusable API client function +export async function callBitteAPI(endpoint: string, method = 'GET', body?: any, log?: any) { + const isRegistry = endpoint.startsWith('/api/'); + const baseUrl = isRegistry ? config.bitteRegistryUrl : config.bitteRuntimeUrl; + const url = `${baseUrl}${endpoint}`; + + try { + const options: RequestInit = { + method, + headers: { + 'Content-Type': 'application/json', + }, + }; + + if (body) { + options.body = JSON.stringify(body); + if (!isRegistry) { + options.headers = { + ...options.headers, + Authorization: `Bearer ${config.bitteApiKey}`, + }; + } + } + + log?.info(`Calling ${method} ${url}`); + const response = await fetch(url, options); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return endpoint === '/chat' ? + await response.text() : + await response.json(); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error(`API error: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error: ${errorMessage}` }], + isError: true + }; + } + } \ No newline at end of file diff --git a/apps/bitte-ai/utils/search.ts b/apps/bitte-ai/utils/search.ts new file mode 100644 index 0000000..9899d1f --- /dev/null +++ b/apps/bitte-ai/utils/search.ts @@ -0,0 +1,125 @@ +import Fuse from 'fuse.js'; + +/** + * Options for the search functionality + */ +export interface SearchOptions { + /** + * Keys to search within. If not provided, search will be performed on the root level. + */ + keys?: string[]; + + /** + * Maximum number of results to return + */ + limit?: number; + + /** + * Threshold for fuzzy matching (0.0 = exact match, 1.0 = very fuzzy) + */ + threshold?: number; +} + +/** + * Default search options + */ +const DEFAULT_SEARCH_OPTIONS: SearchOptions = { + limit: 10, + threshold: 0.3 +}; + +/** + * Search result type + */ +export interface SearchResult { + /** The matched item */ + item: T; + /** The match score (lower is better) */ + score: number; + /** The reference index in the original array */ + refIndex: number; +} + +/** + * Search within a large stringified object for items matching the query + * @param stringifiedObject - The stringified object to search within + * @param query - The search query + * @param options - Search configuration options + * @returns Array of matched results with their scores + */ +export function searchStringifiedObject( + stringifiedObject: string, + query: string, + options: SearchOptions = DEFAULT_SEARCH_OPTIONS +): SearchResult[] { + try { + // Parse the stringified object + const parsed = JSON.parse(stringifiedObject); + const data = Array.isArray(parsed) ? parsed : [parsed]; + + return performSearch(data, query, options); + } catch (error) { + console.error('Error searching stringified object:', error); + throw new Error(`Failed to search: ${error instanceof Error ? error.message : String(error)}`); + } +} + +/** + * Search within a large array for items matching the query + * Useful when you already have the parsed array + * @param dataArray - The array to search within + * @param query - The search query + * @param options - Search configuration options + * @returns Array of matched results with their scores + */ +export function searchArray( + dataArray: T[], + query: string, + options: SearchOptions = DEFAULT_SEARCH_OPTIONS +): SearchResult[] { + try { + if (!Array.isArray(dataArray)) { + throw new Error('The data must be an array'); + } + + return performSearch(dataArray, query, options); + } catch (error) { + console.error('Error searching array:', error); + throw new Error(`Failed to search: ${error instanceof Error ? error.message : String(error)}`); + } +} + +/** + * Internal helper to perform the actual search operation + */ +function performSearch( + data: T[], + query: string, + options: SearchOptions +): SearchResult[] { + // Configure Fuse.js + const fuseOptions = { + includeScore: true, + includeRefIndex: true, + threshold: options.threshold ?? DEFAULT_SEARCH_OPTIONS.threshold, + keys: options.keys ?? [], + }; + + // Create Fuse instance + const fuse = new Fuse(data, fuseOptions); + + // Perform the search + const limit = options.limit ?? DEFAULT_SEARCH_OPTIONS.limit ?? 10; + const rawResults = fuse.search(query, { limit }); + + // Convert to our consistent result format + return rawResults.map((result, index) => { + return { + item: result.item, + // Default to 1 (worst score) if score is undefined + score: typeof result.score === 'number' ? result.score : 1, + // Use the result's refIndex if available, otherwise use the result index + refIndex: typeof result.refIndex === 'number' ? result.refIndex : index, + }; + }); +} diff --git a/bun.lock b/bun.lock index 2eb6665..9495417 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,8 @@ "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", "@goat-sdk/plugin-erc20": "^0.2.14", - "@mcp-sdk/server": "0.0.7", + "fastmcp": "^1.20.5", + "fuse.js": "^7.1.0", "viem": "^2.24.1", "zod": "^3.24.2", }, @@ -147,8 +148,6 @@ "@mcp-proxy/bitte-ai": ["@mcp-proxy/bitte-ai@workspace:apps/bitte-ai"], - "@mcp-sdk/server": ["@mcp-sdk/server@0.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.6.1", "file-type": "^20.4.1", "fuse.js": "^7.1.0", "mcp-proxy": "^2.7.0", "strict-event-emitter-types": "^2.0.0", "uri-templates": "^0.2.0", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.3" }, "peerDependencies": { "typescript": "^5.8.2" } }, "sha512-CHU8v1P7DXtdSj/ONRRHgga8Q/L14Eag7u4bR3JofwJAPMEwuG/TQ4wfna/jebUd/2I7byaSKXbWPMyanLo69A=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.0.4", "", { "dependencies": { "content-type": "^1.0.5", "raw-body": "^3.0.0", "zod": "^3.23.8" } }, "sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow=="], "@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], @@ -207,6 +206,10 @@ "@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], @@ -433,6 +436,8 @@ "eventsource-parser": ["eventsource-parser@3.0.0", "", {}, "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA=="], + "execa": ["execa@9.5.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.0.0" } }, "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q=="], + "express": ["express@5.0.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.0.1", "content-disposition": "^1.0.0", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "^1.2.1", "debug": "4.3.6", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "^2.0.0", "fresh": "2.0.0", "http-errors": "2.0.0", "merge-descriptors": "^2.0.0", "methods": "~1.1.2", "mime-types": "^3.0.0", "on-finished": "2.4.1", "once": "1.4.0", "parseurl": "~1.3.3", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "router": "^2.0.0", "safe-buffer": "5.2.1", "send": "^1.1.0", "serve-static": "^2.1.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "^2.0.0", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ=="], "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], @@ -447,10 +452,14 @@ "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="], + "fastmcp": ["fastmcp@1.20.5", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.6.0", "execa": "^9.5.2", "file-type": "^20.3.0", "fuse.js": "^7.1.0", "mcp-proxy": "^2.10.4", "strict-event-emitter-types": "^2.0.0", "undici": "^7.4.0", "uri-templates": "^0.2.0", "yargs": "^17.7.2", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.3" }, "bin": { "fastmcp": "dist/bin/fastmcp.js" } }, "sha512-jwcPgMF9bcE9qsEG82YMlAG26/n5CSYsr95e60ntqWWd+3kgTBbUIasB3HfpqHLTNaQuoX6/jl18fpDcybBjcQ=="], + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + "file-type": ["file-type@20.4.1", "", { "dependencies": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ=="], "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], @@ -479,6 +488,8 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -499,6 +510,8 @@ "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], @@ -513,10 +526,16 @@ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], "is-retry-allowed": ["is-retry-allowed@2.2.0", "", {}, "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg=="], + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], @@ -595,6 +614,8 @@ "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -609,6 +630,8 @@ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -629,6 +652,8 @@ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + "pretty-ms": ["pretty-ms@9.2.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], @@ -721,6 +746,8 @@ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "strtok3": ["strtok3@10.2.2", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^7.0.0" } }, "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg=="], "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], @@ -795,8 +822,12 @@ "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + "undici": ["undici@7.6.0", "", {}, "sha512-gaFsbThjrDGvAaD670r81RZro/s6H2PVZF640Qn0p5kZK+/rim7/mmyfp2W7VB5vOMaFM8vuFBJUaMlaZTYHlA=="], + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], "uri-templates": ["uri-templates@0.2.0", "", {}, "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg=="], @@ -841,6 +872,8 @@ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.23.5", "", { "peerDependencies": { "zod": "^3.23.3" } }, "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA=="], @@ -863,10 +896,6 @@ "@mcp-proxy/bitte-ai/@types/bun": ["@types/bun@1.2.8", "", { "dependencies": { "bun-types": "1.2.7" } }, "sha512-t8L1RvJVUghW5V+M/fL3Thbxcs0HwNsXsnTEBEfEVqGteiJToOlZ/fyOEaR1kZsNqnu+3XA4RI/qmnX4w6+S+w=="], - "@mcp-sdk/server/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], - - "@mcp-sdk/server/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], - "@privy-io/server-auth/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], "@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -897,6 +926,10 @@ "express/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], + "fastmcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], + + "fastmcp/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], @@ -913,6 +946,8 @@ "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + "send/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], "send/fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], From 81568fbea3ab3bf5802406e44464e3efaf5116e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lui=CC=81s=20Freitas?= Date: Wed, 2 Apr 2025 16:01:28 +0100 Subject: [PATCH 3/5] Update Bitte AI integration by adding new dependencies for agentkit-model-context-protocol and refining search functionality. Removed unused tools and improved error handling in agent execution. Adjusted search parameters to enhance agent and tool discovery, ensuring better performance and user experience. --- apps/bitte-ai/index.ts | 164 +++++++-------------- apps/bitte-ai/lib/search.ts | 87 +++-------- apps/bitte-ai/package.json | 1 + apps/bitte-ai/tools/base-agentkit/index.ts | 38 ++--- apps/bitte-ai/tools/goat-sdk/index.ts | 48 +++--- bun.lock | 19 +-- 6 files changed, 106 insertions(+), 251 deletions(-) diff --git a/apps/bitte-ai/index.ts b/apps/bitte-ai/index.ts index 0aab591..7c03c92 100644 --- a/apps/bitte-ai/index.ts +++ b/apps/bitte-ai/index.ts @@ -45,7 +45,8 @@ export const server = new FastMCP({ name: 'bitte-ai-mcp-proxy', version: '0.0.1', authenticate: async (req) => { - + // TODO: Implement authentication + // These are currently not sent by the client (Cursor for example) const agentId = req.headers['x-agent-id']; const accountId = req.headers['x-account-id']; const bitteApiKey = req.headers['x-bitte-api-key']; @@ -56,26 +57,6 @@ export const server = new FastMCP({ }, }); -// Tool to get all agents from Bitte AI API -server.addTool({ - name: 'get-all-agents', - description: 'Get a list of AI agents from the Bitte AI registry', - parameters: z.object({ - verifiedOnly: z.boolean().optional().default(true), - chainIds: z.string().optional(), - category: z.string().optional(), - limit: z.number().optional().default(50), - offset: z.number().optional().default(0), - }), - execute: async (args, { log }) => { - log.info(`Getting agents with params: ${JSON.stringify(args)}`); - const params = objectToParams(args); - const endpoint = `/api/agents${params ? `?${params}` : ''}`; - const data = await callBitteAPI(endpoint, 'GET', undefined, log); - return JSON.stringify(data); - }, -}); - // Tool to get a specific agent by ID server.addTool({ name: 'get-agent-by-id', @@ -91,21 +72,6 @@ server.addTool({ }, }); -// Tool to get all tools from Bitte AI API -server.addTool({ - name: 'search-tools', - description: 'Get a list of tools from the Bitte AI registry', - parameters: z.object({ - random_string: z.string().optional().describe('Dummy parameter for no-parameter tools'), - }), - execute: async (args, { log }) => { - log.info('Getting tools'); - const endpoint = `/api/tools`; - const data = await callBitteAPI(endpoint, 'GET', undefined, log); - return JSON.stringify(data); - }, -}); - server.addTool({ name: 'execute-agent', description: 'Execute an AI agent', @@ -116,109 +82,79 @@ server.addTool({ execute: async (args, { log, session }) => { log.info(`Executing agent with ID: ${args.agentId}`); - const body = { - id: session?.id, - agentId: args.agentId, - accountId: '', // TODO: find a way to get the account id - messages: [{ role: 'user', content: args.input }], - }; - - const data = await callBitteAPI('/chat', 'POST', body, log); - - if (typeof data === 'string') { - return { - content: [{ type: 'text', text: data }], - }; - } - - // Ensure we return a properly typed result - return data as any; - }, -}); - -// Tool to get existing tools -server.addTool({ - name: 'get-existing-tools', - description: 'Get existing tools', - parameters: z.object({ - service: z.string().describe('The service to get tools from'), - }), - execute: async (args, { log }) => { - log.info(`Executing get-existing-tools tool with params: ${JSON.stringify(args)}`); - try { - let tools; - switch (args.service) { - case services.goat.name: - tools = await services.goat.tools(); - break; - case services.agentkit.name: - tools = await services.agentkit.tools(); - break; - default: - throw new Error(`Unknown service: ${args.service}`); + // First, search for the agent to make sure it exists + const searchResult = await searchAgents({ + query: args.agentId, + threshold: 0.1 // Lower threshold for more exact matching + }, log); + + // Check if we found a matching agent + if (searchResult.bitteResults.length === 0) { + throw new Error(`Agent with ID '${args.agentId}' not found`); } - return JSON.stringify(tools); + + // Prepare the body for the API call + const body = { + id: session?.id, + agentId: args.agentId, + accountId: '', // TODO: find a way to get the account id + messages: [{ role: 'user', content: args.input }], + }; + + // Call the Bitte API to execute the agent + const data = await callBitteAPI('/chat', 'POST', body, log); + + if (typeof data === 'string') { + return { + content: [{ type: 'text', text: data }], + }; + } + + // Ensure we return a properly typed result + return data as any; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); - log.error(`Error getting tools: ${errorMessage}`); + log.error(`Error executing agent: ${errorMessage}`); return { - content: [{ type: 'text', text: `Error getting tools: ${errorMessage}` }], + content: [{ type: 'text', text: `Error executing agent: ${errorMessage}` }], isError: true, }; } }, }); -// Tool to get available services -server.addTool({ - name: 'get-available-services', - description: 'Get a list of all available services', - parameters: z.object({}), - execute: async (args, { log }) => { - log.info('Executing get-available-services tool'); - return JSON.stringify({ - services: Object.values(services).map((service) => service.name), - count: Object.keys(services).length, - }); - }, -}); - // Tool to execute a tool server.addTool({ name: 'execute-tool', description: 'Execute a tool', parameters: z.object({ tool: z.string().describe('The tool to execute'), - service: z.string().describe('The service to execute the tool from'), - params: z.object({}).describe('The parameters to pass to the tool'), + params: z.string().describe('The parameters to pass to the tool as a JSON string'), }), execute: async (args, { log }) => { log.info(`Executing execute-tool tool with params: ${JSON.stringify(args)}`); + console.log("execute-tool with args", JSON.stringify(args)) + console.log("args", args) try { - let tool; - switch (args.service) { - case services.goat.name: { - const goatTools = await services.goat.tools(); - tool = goatTools.find((t) => t.name === args.tool); - break; - } - case services.agentkit.name: { - const agentkitTools = await services.agentkit.tools(); - tool = agentkitTools.find((t) => t.name === args.tool); - break; - } - default: - throw new Error(`Unknown service: ${args.service}`); - } + // Use searchTools to find the specified tool + const searchResult = await searchTools({ + query: args.tool, + threshold: 0.1 // Lower threshold for more exact matching + }, log); + + // Get the first (best) match + const toolMatch = searchResult.combinedResults[0]; + const tool = toolMatch.item; + + console.log(tool) - if (!tool) { - throw new Error(`Tool not found: ${args.tool}`); + if (!tool || !tool.execute) { + throw new Error(`Tool '${args.tool}' found but cannot be executed`); } - log.info(`Executing ${args.service} tool: ${args.tool}`); - return await tool.execute(args.params); + return await tool.execute(JSON.parse(args.params)); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); log.error(`Error executing tool: ${errorMessage}`); diff --git a/apps/bitte-ai/lib/search.ts b/apps/bitte-ai/lib/search.ts index 370ea6d..169cb26 100644 --- a/apps/bitte-ai/lib/search.ts +++ b/apps/bitte-ai/lib/search.ts @@ -38,7 +38,7 @@ const DEFAULT_SEARCH_PARAMS: Omit = { limit: 10, offset: 0, threshold: 0.3, - includeServices: Object.keys(services) + includeServices: [] }; /** @@ -66,16 +66,16 @@ export async function searchAgents( query, verifiedOnly, chainIds, - category, + category, limit, offset, threshold, - includeServices + includeServices } = mergedParams; // Search options for Fuse.js const searchOptions: SearchOptions = { - keys: ['name', 'description', 'instructions', 'generatedDescription', 'category'], + keys: ['id','name', 'description', 'instructions', 'generatedDescription', 'category'], limit, threshold }; @@ -126,63 +126,8 @@ export async function searchAgents( log?.error(`Error searching Bitte API: ${errorMessage}`); } - // Then, search each included service - if (includeServices && includeServices.length > 0) { - await Promise.all( - includeServices.map(async (serviceName) => { - try { - // Check if service name is a valid key - if (!(serviceName in services)) { - log?.warn(`Service not found: ${serviceName}`); - return; - } - - const service = services[serviceName as ServiceKey]; - - // Get tools from the service, which might include agents - const tools = await service.tools() as GenericTool[]; - - // Extract agents from tools if possible - // This assumes that some tools might be or contain agents - // You may need to adapt this logic based on your actual service implementation - const agentsFromTools = tools - .filter((tool: GenericTool) => - // Example filtering logic - adjust as needed for your use case - tool.parameters?.agentId || - tool.name.toLowerCase().includes('agent') - ) - .map((tool: GenericTool) => { - // Convert tool to Agent format - adjust mapping as needed - return { - id: tool.parameters?.agentId || tool.name, - name: tool.name, - accountId: '', - description: tool.description || '', - instructions: '', - tools: [], - verified: true, - pings: 0 - } as Agent; - }); - - if (agentsFromTools.length > 0) { - // Search within the agents from this service - result.serviceResults[serviceName] = searchArray( - agentsFromTools, - query, - searchOptions - ); - result.totalResults += result.serviceResults[serviceName].length; - } - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - log?.error(`Error searching service ${serviceName}: ${errorMessage}`); - result.serviceResults[serviceName] = []; - } - }) - ); - } - + // We skip searching services as requested + return result; } @@ -195,7 +140,7 @@ export const searchAgentsSchema = z.object({ limit: z.number().optional().default(10), offset: z.number().optional().default(0), threshold: z.number().optional().default(0.3), - includeServices: z.array(z.string()).optional().default(Object.keys(services)) + includeServices: z.array(z.string()).optional().default([]) }); /** @@ -214,7 +159,7 @@ export interface SearchToolsParams { const DEFAULT_TOOLS_SEARCH_PARAMS: Omit = { limit: 10, threshold: 0.3, - includeServices: Object.keys(services) + includeServices: ['goat', 'agentkit', ...Object.keys(services).filter(s => s !== 'goat' && s !== 'agentkit')] }; /** @@ -223,6 +168,7 @@ const DEFAULT_TOOLS_SEARCH_PARAMS: Omit = { export interface ToolsSearchResult { bitteResults: SearchResult[]; serviceResults: Record[]>; + combinedResults: SearchResult[]; totalResults: number; } @@ -251,6 +197,7 @@ export async function searchTools( const result: ToolsSearchResult = { bitteResults: [], serviceResults: {}, + combinedResults: [], totalResults: 0 }; @@ -267,6 +214,9 @@ export async function searchTools( // Search within the results using Fuse.js result.bitteResults = searchArray(response, query, searchOptions); result.totalResults += result.bitteResults.length; + + // Add Bitte results to combined results + result.combinedResults.push(...result.bitteResults); } else { log?.warn('Bitte API did not return an array of tools'); } @@ -277,8 +227,11 @@ export async function searchTools( // Then, search each included service if (includeServices && includeServices.length > 0) { + // Make sure we're including 'goat' and 'agentkit' services + const allServices = Array.from(new Set([...includeServices, 'goat', 'agentkit'])); + await Promise.all( - includeServices.map(async (serviceName) => { + allServices.map(async (serviceName) => { try { // Check if service name is a valid key if (!(serviceName in services)) { @@ -299,6 +252,9 @@ export async function searchTools( searchOptions ); result.totalResults += result.serviceResults[serviceName].length; + + // Add service results to combined results + result.combinedResults.push(...result.serviceResults[serviceName]); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); @@ -315,7 +271,4 @@ export async function searchTools( // Export zodSchema for searching tools export const searchToolsSchema = z.object({ query: z.string().describe('Search query text'), - limit: z.number().optional().default(10), - threshold: z.number().optional().default(0.3), - includeServices: z.array(z.string()).optional().default(Object.keys(services)) }); diff --git a/apps/bitte-ai/package.json b/apps/bitte-ai/package.json index 2a379fd..faf97b4 100644 --- a/apps/bitte-ai/package.json +++ b/apps/bitte-ai/package.json @@ -22,6 +22,7 @@ }, "dependencies": { "@coinbase/agentkit": "^0.4.0", + "@coinbase/agentkit-model-context-protocol": "^0.2.0", "@coinbase/agentkit-vercel-ai-sdk": "^0.1.0", "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", diff --git a/apps/bitte-ai/tools/base-agentkit/index.ts b/apps/bitte-ai/tools/base-agentkit/index.ts index cb41965..e013bc1 100644 --- a/apps/bitte-ai/tools/base-agentkit/index.ts +++ b/apps/bitte-ai/tools/base-agentkit/index.ts @@ -10,9 +10,7 @@ import { wethActionProvider, wowActionProvider } from '@coinbase/agentkit'; -import { getVercelAITools } from '@coinbase/agentkit-vercel-ai-sdk'; - -import { type ToolSet } from 'ai'; +import { getMcpTools } from "@coinbase/agentkit-model-context-protocol" import { AgentKitWalletProvider } from './wallet'; @@ -36,32 +34,16 @@ export const getTools = async () => { }); // Convert AgentKit tools to MCP-compatible format - const tools: ToolSet = await getVercelAITools(agentKit); - - // Transform tools into a consistent format with proper typing - const formattedTools = Object.entries(tools).map(([name, tool]) => ({ - name, - description: tool.description as string, - parameters: tool.parameters, + const { tools, toolHandler } = await getMcpTools(agentKit); + + const formattedTools = tools.map(tool => ({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, execute: async (params: Record, options?: any) => { - console.log(`Executing tool ${name} with params:`, JSON.stringify(params)); - - if (!tool.execute) { - console.log(`Tool ${name} execution not available`); - return "Tool execution not available"; - } - - try { - const result = await tool.execute(params, options); - console.log(`Tool ${name} executed successfully`); - return result; - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - console.error(`Error executing tool ${name}:`, errorMessage); - return `Error executing tool ${name}: ${errorMessage}`; - } - }, + console.log(tool.name, params) + return await toolHandler(tool.name, params); + } })); - return formattedTools; }; \ No newline at end of file diff --git a/apps/bitte-ai/tools/goat-sdk/index.ts b/apps/bitte-ai/tools/goat-sdk/index.ts index 32d4d38..9be9630 100644 --- a/apps/bitte-ai/tools/goat-sdk/index.ts +++ b/apps/bitte-ai/tools/goat-sdk/index.ts @@ -3,44 +3,30 @@ import { USDC, WETH, erc20 } from '@goat-sdk/plugin-erc20'; import { wallet } from './wallet'; // Define a type for the tool objects -type GoatTool = { +type Tool = { name: string; description: string; - parameters: any; - execute: (params: Record, options?: any) => Promise; -}; + inputSchema: any; // Using any for now since JsonSchema7Type is not defined + execute: (params: any) => Promise; +} + +type ToolList = Tool[]; -export const getTools = async (): Promise => { +export const getTools = async (): Promise => { const onChainToolsAdapter = await getOnChainTools({ plugins: [erc20({ tokens: [USDC, WETH] })], wallet: wallet, }); - // Transform on-chain tools to the format expected by the MCP server - const formattedTools = onChainToolsAdapter.listOfTools().map((toolDef) => { - return { - name: toolDef.name, - description: toolDef.description, - parameters: toolDef.inputSchema, - execute: async (params: Record, options?: any) => { - // Log tool execution if context is provided - if (options?.log) { - options.log.info(`Executing GOAT tool: ${toolDef.name} with params: ${JSON.stringify(params)}`); - } - - try { - const result = await onChainToolsAdapter.toolHandler(toolDef.name, params); - return result; - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - if (options?.log) { - options.log.error(`Error executing GOAT tool ${toolDef.name}: ${errorMessage}`); - } - return `Error executing tool ${toolDef.name}: ${errorMessage}`; - } - }, - }; - }); + const rawTools = onChainToolsAdapter.listOfTools(); + + // Transform the raw tools to include the execute method + const tools = rawTools.map(tool => ({ + ...tool, + execute: async (params: any) => { + return await onChainToolsAdapter.toolHandler(tool.name, params); + } + })); - return formattedTools; + return tools; }; diff --git a/bun.lock b/bun.lock index 9495417..01a1ed8 100644 --- a/bun.lock +++ b/bun.lock @@ -17,6 +17,7 @@ "name": "@mcp-proxy/bitte-ai", "dependencies": { "@coinbase/agentkit": "^0.4.0", + "@coinbase/agentkit-model-context-protocol": "^0.2.0", "@coinbase/agentkit-vercel-ai-sdk": "^0.1.0", "@goat-sdk/adapter-model-context-protocol": "^0.2.11", "@goat-sdk/core": "^0.4.9", @@ -70,6 +71,8 @@ "@coinbase/agentkit": ["@coinbase/agentkit@0.4.0", "", { "dependencies": { "@alloralabs/allora-sdk": "^0.1.0", "@coinbase/coinbase-sdk": "^0.20.0", "@jup-ag/api": "^6.0.39", "@privy-io/server-auth": "^1.18.4", "@solana/spl-token": "^0.4.12", "@solana/web3.js": "^1.98.0", "md5": "^2.3.0", "opensea-js": "^7.1.18", "reflect-metadata": "^0.2.2", "twitter-api-v2": "^1.18.2", "viem": "^2.22.16", "zod": "^3.23.8" } }, "sha512-jh7hzDfBfHvhwU3cQ4CkhzA0NY4RvmZNjJ9lipk+y6k1RCCfAnqMq/w/3XDPN7fqr+La0O3Phw3KNZ0jAFadEg=="], + "@coinbase/agentkit-model-context-protocol": ["@coinbase/agentkit-model-context-protocol@0.2.0", "", { "dependencies": { "@modelcontextprotocol/sdk": "^1.6.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.24.3" }, "peerDependencies": { "@coinbase/agentkit": ">=0.1.0" } }, "sha512-x+E7ip79HxLboqJh+YZ2lWXz8uwN1E4XLnxtwBt6RvQZdA+gVM4MyMUrGmc292yg4z0USCUwrfFnE27aAObZmA=="], + "@coinbase/agentkit-vercel-ai-sdk": ["@coinbase/agentkit-vercel-ai-sdk@0.1.0", "", { "dependencies": { "zod": "^3.22.4" }, "peerDependencies": { "@coinbase/agentkit": ">=0.1.0", "ai": "^4.1.16" } }, "sha512-/3ZGzs5jec2o1P8VSWXVKlZ96WCLpoGYznYyHHkunwolnRKAxcbV7vk1oeD/0wbBfXMNhpTUe5YCtgJl/2cNoA=="], "@coinbase/coinbase-sdk": ["@coinbase/coinbase-sdk@0.20.0", "", { "dependencies": { "@scure/bip32": "^1.4.0", "abitype": "^1.0.6", "axios": "^1.6.8", "axios-mock-adapter": "^1.22.0", "axios-retry": "^4.4.1", "bip32": "^4.0.0", "bip39": "^3.1.0", "decimal.js": "^10.4.3", "dotenv": "^16.4.5", "ed2curve": "^0.3.0", "ethers": "^6.12.1", "jose": "^5.10.0", "secp256k1": "^5.0.0", "viem": "^2.21.26" } }, "sha512-OoMMktKbjmeEwtwQCK3kIIoX5M+hNelxAGX5Llymvw6bmyrMDaEBZ/Myga9kaLJ+7Hi5Y4jPDy4Cy2MGxxXg6w=="], @@ -148,7 +151,7 @@ "@mcp-proxy/bitte-ai": ["@mcp-proxy/bitte-ai@workspace:apps/bitte-ai"], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.0.4", "", { "dependencies": { "content-type": "^1.0.5", "raw-body": "^3.0.0", "zod": "^3.23.8" } }, "sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], "@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], @@ -876,9 +879,11 @@ "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], - "zod-to-json-schema": ["zod-to-json-schema@3.23.5", "", { "peerDependencies": { "zod": "^3.23.3" } }, "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + + "@goat-sdk/adapter-model-context-protocol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.0.4", "", { "dependencies": { "content-type": "^1.0.5", "raw-body": "^3.0.0", "zod": "^3.23.8" } }, "sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow=="], - "@ai-sdk/ui-utils/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], + "@goat-sdk/adapter-model-context-protocol/zod-to-json-schema": ["zod-to-json-schema@3.23.5", "", { "peerDependencies": { "zod": "^3.23.3" } }, "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA=="], "@goat-sdk/plugin-erc20/viem": ["viem@2.23.4", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-UQquuolKlS1w5H5e0Fd1KKoUlIPJryIEBzY5AUhGyV1ka+9O6+3uYVhUzj6RbvGK0PtsMKn2ddwPZFwjNDVU/A=="], @@ -926,10 +931,6 @@ "express/debug": ["debug@4.3.6", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg=="], - "fastmcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], - - "fastmcp/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], @@ -942,8 +943,6 @@ "jsondiffpatch/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - "mcp-proxy/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -978,8 +977,6 @@ "jayson/@types/ws/@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], - "mcp-proxy/@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="], - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], From 25fa0b7654659c04bb6e79a627b34db655745b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lui=CC=81s=20Freitas?= Date: Wed, 2 Apr 2025 16:08:16 +0100 Subject: [PATCH 4/5] Enhance search functionality in Bitte AI integration to return all results when the query is "*" instead of performing a search. Updated search logic for both agents and tools to improve performance and user experience. This change ensures that all available results are returned efficiently when requested. --- apps/bitte-ai/lib/search.ts | 66 ++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/apps/bitte-ai/lib/search.ts b/apps/bitte-ai/lib/search.ts index 169cb26..c47274c 100644 --- a/apps/bitte-ai/lib/search.ts +++ b/apps/bitte-ai/lib/search.ts @@ -115,9 +115,15 @@ export async function searchAgents( // If response is an array, search within it if (Array.isArray(response)) { - // Search within the results using Fuse.js - result.bitteResults = searchArray(response, query, searchOptions); - result.totalResults += result.bitteResults.length; + // If query is "*", return all results without searching + if (query === "*") { + result.bitteResults = response.map(agent => ({ item: agent, score: 1, refIndex: 0 })); + result.totalResults += result.bitteResults.length; + } else { + // Search within the results using Fuse.js + result.bitteResults = searchArray(response, query, searchOptions); + result.totalResults += result.bitteResults.length; + } } else { log?.warn('Bitte API did not return an array of agents'); } @@ -211,12 +217,21 @@ export async function searchTools( // If response is an array, search within it if (Array.isArray(response)) { - // Search within the results using Fuse.js - result.bitteResults = searchArray(response, query, searchOptions); - result.totalResults += result.bitteResults.length; - - // Add Bitte results to combined results - result.combinedResults.push(...result.bitteResults); + // If query is "*", return all results without searching + if (query === "*") { + result.bitteResults = response.map(tool => ({ item: tool, score: 1, refIndex: 0 })); + result.totalResults += result.bitteResults.length; + + // Add Bitte results to combined results + result.combinedResults.push(...result.bitteResults); + } else { + // Search within the results using Fuse.js + result.bitteResults = searchArray(response, query, searchOptions); + result.totalResults += result.bitteResults.length; + + // Add Bitte results to combined results + result.combinedResults.push(...result.bitteResults); + } } else { log?.warn('Bitte API did not return an array of tools'); } @@ -245,16 +260,29 @@ export async function searchTools( const tools = await service.tools() as GenericTool[]; if (tools.length > 0) { - // Search within the tools from this service - result.serviceResults[serviceName] = searchArray( - tools, - query, - searchOptions - ); - result.totalResults += result.serviceResults[serviceName].length; - - // Add service results to combined results - result.combinedResults.push(...result.serviceResults[serviceName]); + // If query is "*", return all tools without searching + if (query === "*") { + result.serviceResults[serviceName] = tools.map(tool => ({ + item: tool, + score: 1, + refIndex: 0 + })); + result.totalResults += result.serviceResults[serviceName].length; + + // Add service results to combined results + result.combinedResults.push(...result.serviceResults[serviceName]); + } else { + // Search within the tools from this service + result.serviceResults[serviceName] = searchArray( + tools, + query, + searchOptions + ); + result.totalResults += result.serviceResults[serviceName].length; + + // Add service results to combined results + result.combinedResults.push(...result.serviceResults[serviceName]); + } } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); From c39851fdb44a3f3369bc7b88ce28cb24d191c84b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lui=CC=81s=20Freitas?= Date: Wed, 2 Apr 2025 16:20:45 +0100 Subject: [PATCH 5/5] Refactor Bitte AI integration by cleaning up imports, enhancing type safety, and improving error handling in API calls. Updated search functionality to ensure consistent return types and streamlined the codebase for better maintainability. Adjusted TypeScript configurations for improved module handling. --- apps/bitte-ai/index.ts | 93 ++++++++------- apps/bitte-ai/lib/search.ts | 123 +++++++++----------- apps/bitte-ai/tools/base-agentkit/index.ts | 82 ++++++------- apps/bitte-ai/tools/base-agentkit/wallet.ts | 20 ++-- apps/bitte-ai/tools/goat-sdk/index.ts | 16 +-- apps/bitte-ai/tools/index.ts | 20 ++-- apps/bitte-ai/tsconfig.json | 9 +- apps/bitte-ai/utils/bitte-registry.ts | 8 +- apps/bitte-ai/utils/bitte.ts | 85 +++++++------- apps/bitte-ai/utils/search.ts | 26 ++--- 10 files changed, 239 insertions(+), 243 deletions(-) diff --git a/apps/bitte-ai/index.ts b/apps/bitte-ai/index.ts index 7c03c92..26fbdca 100644 --- a/apps/bitte-ai/index.ts +++ b/apps/bitte-ai/index.ts @@ -1,13 +1,8 @@ +import { FastMCP } from 'fastmcp'; import { z } from 'zod'; +import { searchAgents, searchAgentsSchema, searchTools, searchToolsSchema } from './lib/search'; import { services } from './tools'; -import { FastMCP } from 'fastmcp'; import { callBitteAPI } from './utils/bitte'; -import { - searchAgents, - searchAgentsSchema, - searchTools, - searchToolsSchema -} from './lib/search'; // Export configuration export { config } from './config'; @@ -29,17 +24,6 @@ export interface ExecuteAgentParams { input: string; } -// Function to convert object to URLSearchParams -function objectToParams(obj: Record): string { - const params = new URLSearchParams(); - Object.entries(obj).forEach(([key, value]) => { - if (value !== undefined) { - params.append(key, String(value)); - } - }); - return params.toString(); -} - // Create and export the server export const server = new FastMCP({ name: 'bitte-ai-mcp-proxy', @@ -81,19 +65,22 @@ server.addTool({ }), execute: async (args, { log, session }) => { log.info(`Executing agent with ID: ${args.agentId}`); - + try { // First, search for the agent to make sure it exists - const searchResult = await searchAgents({ - query: args.agentId, - threshold: 0.1 // Lower threshold for more exact matching - }, log); - + const searchResult = await searchAgents( + { + query: args.agentId, + threshold: 0.1, // Lower threshold for more exact matching + }, + log + ); + // Check if we found a matching agent if (searchResult.bitteResults.length === 0) { throw new Error(`Agent with ID '${args.agentId}' not found`); } - + // Prepare the body for the API call const body = { id: session?.id, @@ -101,18 +88,20 @@ server.addTool({ accountId: '', // TODO: find a way to get the account id messages: [{ role: 'user', content: args.input }], }; - + // Call the Bitte API to execute the agent const data = await callBitteAPI('/chat', 'POST', body, log); - + if (typeof data === 'string') { return { content: [{ type: 'text', text: data }], }; } - + // Ensure we return a properly typed result - return data as any; + return { + content: [{ type: 'text', text: JSON.stringify(data) }], + }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); log.error(`Error executing agent: ${errorMessage}`); @@ -134,27 +123,45 @@ server.addTool({ }), execute: async (args, { log }) => { log.info(`Executing execute-tool tool with params: ${JSON.stringify(args)}`); - console.log("execute-tool with args", JSON.stringify(args)) - console.log("args", args) - + console.log('execute-tool with args', JSON.stringify(args)); + console.log('args', args); + try { // Use searchTools to find the specified tool - const searchResult = await searchTools({ - query: args.tool, - threshold: 0.1 // Lower threshold for more exact matching - }, log); - + const searchResult = await searchTools( + { + query: args.tool, + threshold: 0.1, // Lower threshold for more exact matching + }, + log + ); + // Get the first (best) match const toolMatch = searchResult.combinedResults[0]; - const tool = toolMatch.item; + if (!toolMatch) { + throw new Error(`Tool '${args.tool}' not found`); + } - console.log(tool) - - if (!tool || !tool.execute) { + const tool = toolMatch.item as { + execute?: (params: Record) => Promise; + }; + + if (!tool || typeof tool.execute !== 'function') { throw new Error(`Tool '${args.tool}' found but cannot be executed`); } - - return await tool.execute(JSON.parse(args.params)); + + const result = await tool.execute(JSON.parse(args.params)); + + // Ensure we return a properly typed result + if (typeof result === 'string') { + return { + content: [{ type: 'text', text: result }], + }; + } + + return { + content: [{ type: 'text', text: JSON.stringify(result) }], + }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); log.error(`Error executing tool: ${errorMessage}`); diff --git a/apps/bitte-ai/lib/search.ts b/apps/bitte-ai/lib/search.ts index c47274c..2ead176 100644 --- a/apps/bitte-ai/lib/search.ts +++ b/apps/bitte-ai/lib/search.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; +import { services } from '../tools'; +import { callBitteAPI } from '../utils/bitte'; import type { Agent } from '../utils/bitte-registry'; import { searchArray } from '../utils/search'; -import type { SearchResult, SearchOptions } from '../utils/search'; -import { callBitteAPI } from '../utils/bitte'; -import { services } from '../tools'; +import type { SearchOptions, SearchResult } from '../utils/search'; // Define a type for service keys type ServiceKey = keyof typeof services; @@ -12,8 +12,8 @@ type ServiceKey = keyof typeof services; interface GenericTool { name: string; description?: string; - parameters?: Record; - execute: (params: Record, options?: any) => Promise; + parameters?: Record; + execute: (params: Record, options?: unknown) => Promise; } /** @@ -38,7 +38,7 @@ const DEFAULT_SEARCH_PARAMS: Omit = { limit: 10, offset: 0, threshold: 0.3, - includeServices: [] + includeServices: [], }; /** @@ -58,82 +58,69 @@ export interface CombinedAgentsSearchResult { */ export async function searchAgents( params: SearchAgentsParams, - log?: any + log?: { info?: (message: string) => void; error?: (message: string) => void } ): Promise { // Merge with default parameters const mergedParams = { ...DEFAULT_SEARCH_PARAMS, ...params }; - const { - query, - verifiedOnly, - chainIds, - category, - limit, - offset, - threshold, - includeServices - } = mergedParams; + const { query, verifiedOnly, chainIds, category, limit, offset, threshold, includeServices } = + mergedParams; // Search options for Fuse.js const searchOptions: SearchOptions = { - keys: ['id','name', 'description', 'instructions', 'generatedDescription', 'category'], + keys: ['id', 'name', 'description', 'instructions', 'generatedDescription', 'category'], limit, - threshold + threshold, }; // Initialize results const result: CombinedAgentsSearchResult = { bitteResults: [], serviceResults: {}, - totalResults: 0 + totalResults: 0, }; // First, search Bitte API try { - log?.info(`Searching for agents with query: ${query}`); - // Build API query parameters - const apiParams: Record = { + const apiParams: Record = { verifiedOnly, limit, - offset + offset, }; - + if (chainIds) apiParams.chainIds = chainIds; if (category) apiParams.category = category; - + // Convert object to URL search parameters const urlParams = new URLSearchParams(); - Object.entries(apiParams).forEach(([key, value]) => { + for (const [key, value] of Object.entries(apiParams)) { if (value !== undefined) { urlParams.append(key, String(value)); } - }); - + } + // Call Bitte API to get agents const endpoint = `/api/agents?${urlParams.toString()}`; const response = await callBitteAPI(endpoint, 'GET', undefined, log); - + // If response is an array, search within it if (Array.isArray(response)) { // If query is "*", return all results without searching - if (query === "*") { - result.bitteResults = response.map(agent => ({ item: agent, score: 1, refIndex: 0 })); + if (query === '*') { + result.bitteResults = response.map((agent) => ({ item: agent, score: 1, refIndex: 0 })); result.totalResults += result.bitteResults.length; } else { // Search within the results using Fuse.js result.bitteResults = searchArray(response, query, searchOptions); result.totalResults += result.bitteResults.length; } - } else { - log?.warn('Bitte API did not return an array of agents'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); - log?.error(`Error searching Bitte API: ${errorMessage}`); } // We skip searching services as requested - + return result; } @@ -146,7 +133,7 @@ export const searchAgentsSchema = z.object({ limit: z.number().optional().default(10), offset: z.number().optional().default(0), threshold: z.number().optional().default(0.3), - includeServices: z.array(z.string()).optional().default([]) + includeServices: z.array(z.string()).optional().default([]), }); /** @@ -165,16 +152,20 @@ export interface SearchToolsParams { const DEFAULT_TOOLS_SEARCH_PARAMS: Omit = { limit: 10, threshold: 0.3, - includeServices: ['goat', 'agentkit', ...Object.keys(services).filter(s => s !== 'goat' && s !== 'agentkit')] + includeServices: [ + 'goat', + 'agentkit', + ...Object.keys(services).filter((s) => s !== 'goat' && s !== 'agentkit'), + ], }; /** * Search results for tools */ export interface ToolsSearchResult { - bitteResults: SearchResult[]; + bitteResults: SearchResult[]; serviceResults: Record[]>; - combinedResults: SearchResult[]; + combinedResults: SearchResult[]; totalResults: number; } @@ -186,7 +177,7 @@ export interface ToolsSearchResult { */ export async function searchTools( params: SearchToolsParams, - log?: any + log?: { info?: (message: string) => void; error?: (message: string) => void } ): Promise { // Merge with default parameters const mergedParams = { ...DEFAULT_TOOLS_SEARCH_PARAMS, ...params }; @@ -196,7 +187,7 @@ export async function searchTools( const searchOptions: SearchOptions = { keys: ['name', 'description', 'function.name', 'function.description'], limit, - threshold + threshold, }; // Initialize results @@ -204,89 +195,83 @@ export async function searchTools( bitteResults: [], serviceResults: {}, combinedResults: [], - totalResults: 0 + totalResults: 0, }; // First, search Bitte API tools try { - log?.info(`Searching for tools with query: ${query}`); - // Call Bitte API to get tools - const endpoint = `/api/tools`; + const endpoint = '/api/tools'; const response = await callBitteAPI(endpoint, 'GET', undefined, log); - + // If response is an array, search within it if (Array.isArray(response)) { // If query is "*", return all results without searching - if (query === "*") { - result.bitteResults = response.map(tool => ({ item: tool, score: 1, refIndex: 0 })); + if (query === '*') { + result.bitteResults = response.map((tool) => ({ item: tool, score: 1, refIndex: 0 })); result.totalResults += result.bitteResults.length; - + // Add Bitte results to combined results result.combinedResults.push(...result.bitteResults); } else { // Search within the results using Fuse.js result.bitteResults = searchArray(response, query, searchOptions); result.totalResults += result.bitteResults.length; - + // Add Bitte results to combined results result.combinedResults.push(...result.bitteResults); } } else { - log?.warn('Bitte API did not return an array of tools'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); - log?.error(`Error searching Bitte API tools: ${errorMessage}`); } // Then, search each included service if (includeServices && includeServices.length > 0) { // Make sure we're including 'goat' and 'agentkit' services const allServices = Array.from(new Set([...includeServices, 'goat', 'agentkit'])); - + await Promise.all( allServices.map(async (serviceName) => { try { // Check if service name is a valid key if (!(serviceName in services)) { - log?.warn(`Service not found: ${serviceName}`); return; } - + const service = services[serviceName as ServiceKey]; - + // Get tools from the service - const tools = await service.tools() as GenericTool[]; - + const tools = (await service.tools()) as GenericTool[]; + if (tools.length > 0) { // If query is "*", return all tools without searching - if (query === "*") { - result.serviceResults[serviceName] = tools.map(tool => ({ - item: tool, - score: 1, - refIndex: 0 + if (query === '*') { + result.serviceResults[serviceName] = tools.map((tool) => ({ + item: tool, + score: 1, + refIndex: 0, })); result.totalResults += result.serviceResults[serviceName].length; - + // Add service results to combined results result.combinedResults.push(...result.serviceResults[serviceName]); } else { // Search within the tools from this service result.serviceResults[serviceName] = searchArray( - tools, - query, + tools, + query, searchOptions ); result.totalResults += result.serviceResults[serviceName].length; - + // Add service results to combined results result.combinedResults.push(...result.serviceResults[serviceName]); } } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); - log?.error(`Error searching service ${serviceName} tools: ${errorMessage}`); result.serviceResults[serviceName] = []; } }) diff --git a/apps/bitte-ai/tools/base-agentkit/index.ts b/apps/bitte-ai/tools/base-agentkit/index.ts index e013bc1..8a0b79b 100644 --- a/apps/bitte-ai/tools/base-agentkit/index.ts +++ b/apps/bitte-ai/tools/base-agentkit/index.ts @@ -1,49 +1,49 @@ import { - AgentKit, - compoundActionProvider, - defillamaActionProvider, - erc20ActionProvider, - erc721ActionProvider, - jupiterActionProvider, - pythActionProvider, - walletActionProvider, - wethActionProvider, - wowActionProvider + AgentKit, + compoundActionProvider, + defillamaActionProvider, + erc20ActionProvider, + erc721ActionProvider, + jupiterActionProvider, + pythActionProvider, + walletActionProvider, + wethActionProvider, + wowActionProvider, } from '@coinbase/agentkit'; -import { getMcpTools } from "@coinbase/agentkit-model-context-protocol" +import { getMcpTools } from '@coinbase/agentkit-model-context-protocol'; import { AgentKitWalletProvider } from './wallet'; export const getTools = async () => { - const walletProvider = new AgentKitWalletProvider(); + const walletProvider = new AgentKitWalletProvider(); - const agentKit = await AgentKit.from({ - walletProvider, - actionProviders: [ - walletActionProvider(), - wowActionProvider(), - wethActionProvider(), - pythActionProvider(), - // openseaActionProvider(), // Requires API key - compoundActionProvider(), - jupiterActionProvider(), - defillamaActionProvider(), - erc20ActionProvider(), - erc721ActionProvider(), - ], - }); - - // Convert AgentKit tools to MCP-compatible format - const { tools, toolHandler } = await getMcpTools(agentKit); + const agentKit = await AgentKit.from({ + walletProvider, + actionProviders: [ + walletActionProvider(), + wowActionProvider(), + wethActionProvider(), + pythActionProvider(), + // openseaActionProvider(), // Requires API key + compoundActionProvider(), + jupiterActionProvider(), + defillamaActionProvider(), + erc20ActionProvider(), + erc721ActionProvider(), + ], + }); - const formattedTools = tools.map(tool => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - execute: async (params: Record, options?: any) => { - console.log(tool.name, params) - return await toolHandler(tool.name, params); - } - })); - return formattedTools; -}; \ No newline at end of file + // Convert AgentKit tools to MCP-compatible format + const { tools, toolHandler } = await getMcpTools(agentKit); + + const formattedTools = tools.map((tool) => ({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + execute: async (params: Record, options?: any) => { + console.log(tool.name, params); + return await toolHandler(tool.name, params); + }, + })); + return formattedTools; +}; diff --git a/apps/bitte-ai/tools/base-agentkit/wallet.ts b/apps/bitte-ai/tools/base-agentkit/wallet.ts index 986b62e..e9aefce 100644 --- a/apps/bitte-ai/tools/base-agentkit/wallet.ts +++ b/apps/bitte-ai/tools/base-agentkit/wallet.ts @@ -1,25 +1,21 @@ -import type { Network } from "@coinbase/agentkit"; -import { WalletProvider } from "@coinbase/agentkit"; +import type { Network } from '@coinbase/agentkit'; +import { WalletProvider } from '@coinbase/agentkit'; export class AgentKitWalletProvider extends WalletProvider { - constructor() { - super(); - } - getAddress(): string { - return "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; + return '0x742d35Cc6634C0532925a3b844Bc454e4438f44e'; } getNetwork(): Network { return { - networkId: "mainnet", - chainId: "1", - protocolFamily: "ethereum", + networkId: 'mainnet', + chainId: '1', + protocolFamily: 'ethereum', }; } getName(): string { - return "AgentKitWalletProvider"; + return 'AgentKitWalletProvider'; } getBalance(): Promise { @@ -27,6 +23,6 @@ export class AgentKitWalletProvider extends WalletProvider { } nativeTransfer(to: string, value: string): Promise { - return Promise.resolve("0x"); + return Promise.resolve('0x'); } } diff --git a/apps/bitte-ai/tools/goat-sdk/index.ts b/apps/bitte-ai/tools/goat-sdk/index.ts index 9be9630..0beef52 100644 --- a/apps/bitte-ai/tools/goat-sdk/index.ts +++ b/apps/bitte-ai/tools/goat-sdk/index.ts @@ -6,9 +6,9 @@ import { wallet } from './wallet'; type Tool = { name: string; description: string; - inputSchema: any; // Using any for now since JsonSchema7Type is not defined - execute: (params: any) => Promise; -} + inputSchema: unknown; + execute: (params: unknown) => Promise; +}; type ToolList = Tool[]; @@ -17,15 +17,15 @@ export const getTools = async (): Promise => { plugins: [erc20({ tokens: [USDC, WETH] })], wallet: wallet, }); - + const rawTools = onChainToolsAdapter.listOfTools(); - + // Transform the raw tools to include the execute method - const tools = rawTools.map(tool => ({ + const tools = rawTools.map((tool) => ({ ...tool, - execute: async (params: any) => { + execute: async (params: unknown) => { return await onChainToolsAdapter.toolHandler(tool.name, params); - } + }, })); return tools; diff --git a/apps/bitte-ai/tools/index.ts b/apps/bitte-ai/tools/index.ts index 682b454..94828e1 100644 --- a/apps/bitte-ai/tools/index.ts +++ b/apps/bitte-ai/tools/index.ts @@ -1,13 +1,13 @@ -import { getTools as getGoatTools } from './goat-sdk'; import { getTools as getBaseAgentkitTools } from './base-agentkit'; +import { getTools as getGoatTools } from './goat-sdk'; export const services = { - "goat": { - name: "goat", - tools: getGoatTools, - }, - "agentkit": { - name: "agentkit", - tools: getBaseAgentkitTools, - }, - } \ No newline at end of file + goat: { + name: 'goat', + tools: getGoatTools, + }, + agentkit: { + name: 'agentkit', + tools: getBaseAgentkitTools, + }, +}; diff --git a/apps/bitte-ai/tsconfig.json b/apps/bitte-ai/tsconfig.json index da64681..7c3af21 100644 --- a/apps/bitte-ai/tsconfig.json +++ b/apps/bitte-ai/tsconfig.json @@ -23,5 +23,12 @@ "outDir": "dist" }, "include": ["index.ts", "config.ts", "tools/**/*.ts", "utils/**/*.ts", "lib/**/*.ts"], - "files": ["index.ts", "config.ts", "tools/goat-sdk/index.ts", "tools/goat-sdk/wallet.ts", "utils/bitte.ts", "lib/search.ts"] + "files": [ + "index.ts", + "config.ts", + "tools/goat-sdk/index.ts", + "tools/goat-sdk/wallet.ts", + "utils/bitte.ts", + "lib/search.ts" + ] } diff --git a/apps/bitte-ai/utils/bitte-registry.ts b/apps/bitte-ai/utils/bitte-registry.ts index 603b216..c663361 100644 --- a/apps/bitte-ai/utils/bitte-registry.ts +++ b/apps/bitte-ai/utils/bitte-registry.ts @@ -16,7 +16,7 @@ export interface AgentTool { function: { name: string; description: string; - parameters?: Record; + parameters?: Record; }; execution?: { baseUrl: string; @@ -53,6 +53,8 @@ export interface BitteRegistry { agents: Agent[]; } -export function isAgent(item: any): item is Agent { - return item && typeof item === 'object' && 'tools' in item && Array.isArray(item.tools); +export function isAgent(item: unknown): item is Agent { + return Boolean( + item && typeof item === 'object' && 'tools' in item && Array.isArray((item as any).tools) + ); } diff --git a/apps/bitte-ai/utils/bitte.ts b/apps/bitte-ai/utils/bitte.ts index 162fdd5..ad55dc3 100644 --- a/apps/bitte-ai/utils/bitte.ts +++ b/apps/bitte-ai/utils/bitte.ts @@ -1,45 +1,48 @@ -import { config } from "../config"; +import { config } from '../config'; // Reusable API client function -export async function callBitteAPI(endpoint: string, method = 'GET', body?: any, log?: any) { - const isRegistry = endpoint.startsWith('/api/'); - const baseUrl = isRegistry ? config.bitteRegistryUrl : config.bitteRuntimeUrl; - const url = `${baseUrl}${endpoint}`; - - try { - const options: RequestInit = { - method, - headers: { - 'Content-Type': 'application/json', - }, - }; - - if (body) { - options.body = JSON.stringify(body); - if (!isRegistry) { - options.headers = { - ...options.headers, - Authorization: `Bearer ${config.bitteApiKey}`, - }; - } - } - - log?.info(`Calling ${method} ${url}`); - const response = await fetch(url, options); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); +export async function callBitteAPI( + endpoint: string, + method = 'GET', + body?: unknown, + log?: { info?: (message: string) => void; error?: (message: string) => void } +) { + const isRegistry = endpoint.startsWith('/api/'); + const baseUrl = isRegistry ? config.bitteRegistryUrl : config.bitteRuntimeUrl; + const url = `${baseUrl}${endpoint}`; + + try { + const options: RequestInit = { + method, + headers: { + 'Content-Type': 'application/json', + }, + }; + + if (body) { + options.body = JSON.stringify(body); + if (!isRegistry) { + options.headers = { + ...options.headers, + Authorization: `Bearer ${config.bitteApiKey}`, + }; } - - return endpoint === '/chat' ? - await response.text() : - await response.json(); - } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); - log?.error(`API error: ${errorMessage}`); - return { - content: [{ type: 'text', text: `Error: ${errorMessage}` }], - isError: true - }; } - } \ No newline at end of file + + log?.info?.(`Calling ${method} ${url}`); + const response = await fetch(url, options); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return endpoint === '/chat' ? await response.text() : await response.json(); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + log?.error?.(`API error: ${errorMessage}`); + return { + content: [{ type: 'text', text: `Error: ${errorMessage}` }], + isError: true, + }; + } +} diff --git a/apps/bitte-ai/utils/search.ts b/apps/bitte-ai/utils/search.ts index 9899d1f..f780110 100644 --- a/apps/bitte-ai/utils/search.ts +++ b/apps/bitte-ai/utils/search.ts @@ -8,12 +8,12 @@ export interface SearchOptions { * Keys to search within. If not provided, search will be performed on the root level. */ keys?: string[]; - + /** * Maximum number of results to return */ limit?: number; - + /** * Threshold for fuzzy matching (0.0 = exact match, 1.0 = very fuzzy) */ @@ -25,7 +25,7 @@ export interface SearchOptions { */ const DEFAULT_SEARCH_OPTIONS: SearchOptions = { limit: 10, - threshold: 0.3 + threshold: 0.3, }; /** @@ -47,7 +47,7 @@ export interface SearchResult { * @param options - Search configuration options * @returns Array of matched results with their scores */ -export function searchStringifiedObject( +export function searchStringifiedObject( stringifiedObject: string, query: string, options: SearchOptions = DEFAULT_SEARCH_OPTIONS @@ -56,7 +56,7 @@ export function searchStringifiedObject( // Parse the stringified object const parsed = JSON.parse(stringifiedObject); const data = Array.isArray(parsed) ? parsed : [parsed]; - + return performSearch(data, query, options); } catch (error) { console.error('Error searching stringified object:', error); @@ -72,7 +72,7 @@ export function searchStringifiedObject( * @param options - Search configuration options * @returns Array of matched results with their scores */ -export function searchArray( +export function searchArray( dataArray: T[], query: string, options: SearchOptions = DEFAULT_SEARCH_OPTIONS @@ -81,7 +81,7 @@ export function searchArray( if (!Array.isArray(dataArray)) { throw new Error('The data must be an array'); } - + return performSearch(dataArray, query, options); } catch (error) { console.error('Error searching array:', error); @@ -92,11 +92,7 @@ export function searchArray( /** * Internal helper to perform the actual search operation */ -function performSearch( - data: T[], - query: string, - options: SearchOptions -): SearchResult[] { +function performSearch(data: T[], query: string, options: SearchOptions): SearchResult[] { // Configure Fuse.js const fuseOptions = { includeScore: true, @@ -104,14 +100,14 @@ function performSearch( threshold: options.threshold ?? DEFAULT_SEARCH_OPTIONS.threshold, keys: options.keys ?? [], }; - + // Create Fuse instance const fuse = new Fuse(data, fuseOptions); - + // Perform the search const limit = options.limit ?? DEFAULT_SEARCH_OPTIONS.limit ?? 10; const rawResults = fuse.search(query, { limit }); - + // Convert to our consistent result format return rawResults.map((result, index) => { return {