From 84083197f2953d30c0ddb57efa80d66f0bd6c05a Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Wed, 19 Feb 2025 20:10:17 -0800 Subject: [PATCH 01/22] only sell what you have bought --- clients/client-coinbase/src/index.ts | 742 ++++++++++++++------------- 1 file changed, 382 insertions(+), 360 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index a654ae5d3..79de941db 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -45,159 +45,164 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; - - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - } + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; + private initialBuyAmountInCurrency: number | null; + + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; + } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; + } } - } - private setupWebhookEndpoint() { - this.server.use(express.json()); + private setupWebhookEndpoint() { + this.server.use(express.json()); - // Add CORS middleware to allow external requests - this.server.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST"); - res.header("Access-Control-Allow-Headers", "Content-Type"); - if (req.method === "OPTIONS") { - return res.sendStatus(200); - } - next(); - }); - - // Add webhook validation middleware - const _validateWebhook = ( - req: express.Request, - res: express.Response, - next: express.NextFunction, - ) => { - const event = req.body as WebhookEvent; - elizaLogger.info("event ", JSON.stringify(event)); - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } - next(); - }; + // Add CORS middleware to allow external requests + this.server.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "POST"); + res.header("Access-Control-Allow-Headers", "Content-Type"); + if (req.method === "OPTIONS") { + return res.sendStatus(200); + } + next(); + }); - // Add health check endpoint - this.server.get("/health", (_req, res) => { - res.status(200).json({ status: "ok" }); - }); + // Add webhook validation middleware + const _validateWebhook = ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { + const event = req.body as WebhookEvent; + elizaLogger.info("event ", JSON.stringify(event)); + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } + next(); + }; - this.server.get("/webhook/coinbase/health", (_req, res) => { - elizaLogger.info("Health check received"); - res.status(200).json({ status: "ok" }); - }); + // Add health check endpoint + this.server.get("/health", (_req, res) => { + res.status(200).json({ status: "ok" }); + }); - this.server.post("/webhook/coinbase/:agentId", async (req, res) => { - elizaLogger.info("Webhook received for agent:", req.params.agentId); - const runtime = this.runtime; + this.server.get("/webhook/coinbase/health", (_req, res) => { + elizaLogger.info("Health check received"); + res.status(200).json({ status: "ok" }); + }); - if (!runtime) { - res.status(404).json({ error: "Agent not found" }); - return; - } + this.server.post("/webhook/coinbase/:agentId", async (req, res) => { + elizaLogger.info("Webhook received for agent:", req.params.agentId); + const runtime = this.runtime; - // Validate the webhook payload - const event = req.body as WebhookEvent; - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } + if (!runtime) { + res.status(404).json({ error: "Agent not found" }); + return; + } - try { - // Forward the webhook event to the client's handleWebhookEvent method - await this.handleWebhookEvent(event); - res.status(200).json({ status: "success" }); - } catch (error) { - elizaLogger.error("Error processing Coinbase webhook:", error.message); - res.status(500).json({ error: "Internal Server Error" }); - } - }); + // Validate the webhook payload + const event = req.body as WebhookEvent; + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } - return new Promise((resolve, reject) => { - try { - this.server.listen(this.port, "0.0.0.0", () => { - elizaLogger.info(`Webhook server listening on port ${this.port}`); - resolve(); - }); - } catch (error) { - reject(error); - } - }); - } + try { + // Forward the webhook event to the client's handleWebhookEvent method + await this.handleWebhookEvent(event); + res.status(200).json({ status: "success" }); + } catch (error) { + elizaLogger.error( + "Error processing Coinbase webhook:", + error.message, + ); + res.status(500).json({ error: "Internal Server Error" }); + } + }); - private async initializeWallets() { - Coinbase.configure({ - apiKeyName: - this.runtime.getSetting("COINBASE_API_KEY") ?? - process.env.COINBASE_API_KEY, - privateKey: - this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? - process.env.COINBASE_PRIVATE_KEY, - }); - const walletTypes: WalletType[] = [ - "short_term_trading", - "long_term_trading", - "dry_powder", - "operational_capital", - ]; - const networkId = Coinbase.networks.BaseMainnet; - for (const walletType of walletTypes) { - elizaLogger.info("walletType ", walletType); - const wallet = await initializeWallet( - this.runtime, - networkId, - walletType, - ); - elizaLogger.info("Successfully loaded wallet ", wallet.wallet.getId()); - this.wallets.push(wallet); + return new Promise((resolve, reject) => { + try { + this.server.listen(this.port, "0.0.0.0", () => { + elizaLogger.info(`Webhook server listening on port ${this.port}`); + resolve(); + }); + } catch (error) { + reject(error); + } + }); } - } - private async generateMediaContent( - event: WebhookEvent, - amountInCurrency: number, - pnl: string, - formattedTimestamp: string, - state: State, - hash: string | null, - ): Promise { - try { - const tradeTweetTemplate = ` + private async initializeWallets() { + Coinbase.configure({ + apiKeyName: + this.runtime.getSetting("COINBASE_API_KEY") ?? + process.env.COINBASE_API_KEY, + privateKey: + this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? + process.env.COINBASE_PRIVATE_KEY, + }); + const walletTypes: WalletType[] = [ + "short_term_trading", + "long_term_trading", + "dry_powder", + "operational_capital", + ]; + const networkId = Coinbase.networks.BaseMainnet; + for (const walletType of walletTypes) { + elizaLogger.info("walletType ", walletType); + const wallet = await initializeWallet( + this.runtime, + networkId, + walletType, + ); + elizaLogger.info("Successfully loaded wallet ", wallet.wallet.getId()); + this.wallets.push(wallet); + } + } + + private async generateMediaContent( + event: WebhookEvent, + amountInCurrency: number, + pnl: string, + formattedTimestamp: string, + state: State, + hash: string | null, + ): Promise { + try { + const tradeTweetTemplate = ` # Task Craft a compelling and concise tweet to announce a Coinbase trade. Aim for creativity and professionalism. @@ -217,192 +222,129 @@ Guidelines: Sample buy tweets: "📈 Added $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "🎯 Strategic ${event.ticker} buy: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Sample sell tweets: "💫 Sold ${event.ticker}: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "📊 Sold $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Generate only the tweet text, no commentary or markdown.`; - const context = composeContext({ - template: tradeTweetTemplate, - state, - }); + const context = composeContext({ + template: tradeTweetTemplate, + state, + }); - const tweetContent = await generateText({ - runtime: this.runtime, - context, - modelClass: ModelClass.LARGE, - }); + const tweetContent = await generateText({ + runtime: this.runtime, + context, + modelClass: ModelClass.LARGE, + }); - const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} PNL: ${pnl} ${blockExplorerBaseTxUrl(hash)}`; - return finalContent.length > 280 - ? `${finalContent.substring(0, 277)}...` - : finalContent; - } catch (error) { - elizaLogger.error("Error generating tweet content:", error); - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( - 2, - )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; - return fallbackTweet; + const trimmedContent = tweetContent.trim(); + const finalContent = `${trimmedContent} PNL: ${pnl} ${blockExplorerBaseTxUrl(hash)}`; + return finalContent.length > 280 + ? `${finalContent.substring(0, 277)}...` + : finalContent; + } catch (error) { + elizaLogger.error("Error generating tweet content:", error); + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( + 2, + )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; + return fallbackTweet; + } } - } - private async handleWebhookEvent(event: WebhookEvent) { - // for now just support ETH - if (!supportedTickers.includes(event.ticker)) { - elizaLogger.info("Unsupported ticker:", event.ticker); - return; - } - // Set up room and ensure participation - const roomId = stringToUuid("coinbase-trading"); - await this.setupRoom(roomId); - - // Get trading amount from settings - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - - // Create and store memory of trade - const memory = this.createTradeMemory(event, amount, roomId); - await this.runtime.messageManager.createMemory(memory); - - // Generate state and format timestamp - const state = await this.runtime.composeState(memory); - const formattedTimestamp = this.getFormattedTimestamp(); - - // Execute token swap - const buy = event.event.toUpperCase() === "BUY"; - const tokenMetadata = getTokenMetadata(event.ticker); - const usdcMetadata = getTokenMetadata("USDC"); - const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found - const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found - - const amountInCurrency = Math.floor( - buy - ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units - : (amount / Number(event.price)) * 10 ** tokenDecimals, // Convert to token base units - ); - elizaLogger.info( - "amountInCurrency non base units ", - amount / Number(event.price), - ); - const pnl = await calculateOverallPNL( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - 1000, - ); - elizaLogger.info("pnl ", pnl); - elizaLogger.info("amountInCurrency ", amountInCurrency); - const enoughBalance = await hasEnoughBalance( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - buy ? "USDC" : event.ticker, - amountInCurrency, - ); - elizaLogger.info("enoughBalance ", enoughBalance); - if (!enoughBalance) { - elizaLogger.error("Not enough balance to trade"); - return; - } - const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); - if (txHash == null) { - elizaLogger.error("txHash is null"); - return; - } - elizaLogger.info("txHash ", txHash); - - // Generate and post tweet - await this.handleMediaPosting( - event, - amount, - pnl, - formattedTimestamp, - state, - txHash, - ); - } + private async handleWebhookEvent(event: WebhookEvent) { + // for now just support ETH + if (!supportedTickers.includes(event.ticker)) { + elizaLogger.info("Unsupported ticker:", event.ticker); + return; + } + // Set up room and ensure participation + const roomId = stringToUuid("coinbase-trading"); + await this.setupRoom(roomId); - private async setupRoom(roomId: UUID) { - await this.runtime.ensureRoomExists(roomId); - await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); - } + // Get trading amount from settings + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - private createTradeMemory( - event: WebhookEvent, - amount: number, - roomId: UUID, - ): Memory { - return { - id: stringToUuid(`coinbase-${event.timestamp}`), - userId: this.runtime.agentId, - agentId: this.runtime.agentId, - roomId, - content: { - text: `${event.event.toUpperCase()} $${amount} worth of ${ - event.ticker - }`, - action: "SWAP", - source: "coinbase", - metadata: { - ticker: event.ticker, - side: event.event.toUpperCase(), - price: event.price, - amount: amount, - timestamp: event.timestamp, - walletType: "short_term_trading", - }, - }, - createdAt: Date.now(), - }; - } + // Create and store memory of trade + const memory = this.createTradeMemory(event, amount, roomId); + await this.runtime.messageManager.createMemory(memory); - private getFormattedTimestamp(): string { - return new Intl.DateTimeFormat("en-US", { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - timeZoneName: "short", - }).format(new Date()); - } + // Generate state and format timestamp + const state = await this.runtime.composeState(memory); + const formattedTimestamp = this.getFormattedTimestamp(); - private async executeTokenSwap( - event: WebhookEvent, - amount: number, - buy: boolean, - ): Promise { - return await tokenSwap( - this.runtime, - amount, - buy ? "USDC" : event.ticker, - buy ? event.ticker : "USDC", - this.runtime.getSetting("WALLET_PUBLIC_KEY"), - this.runtime.getSetting("WALLET_PRIVATE_KEY"), - "base", - ); - } + // Execute token swap + const buy = event.event.toUpperCase() === "BUY"; + if (buy) { + this.initialBuyAmountInCurrency = amount / Number(event.price); + } + // if sell, use the initial buy amount in currency instead of the current price + let amountInCurrency: number; + const tokenMetadata = getTokenMetadata(event.ticker); + const usdcMetadata = getTokenMetadata("USDC"); + const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found + const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found + + amountInCurrency = Math.floor( + buy + ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units + : (amount / Number(event.price)) * 10 ** tokenDecimals, // Convert to token base units + ); + if (buy) { + this.initialBuyAmountInCurrency = amountInCurrency; + } + if (this.initialBuyAmountInCurrency != null) { + amountInCurrency = this.initialBuyAmountInCurrency; + } + elizaLogger.info( + "amountInCurrency non base units ", + amount / Number(event.price), + ); + const pnl = await calculateOverallPNL( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + 1000, + ); + elizaLogger.info("pnl ", pnl); + elizaLogger.info("amountInCurrency ", amountInCurrency); + const enoughBalance = await hasEnoughBalance( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + buy ? "USDC" : event.ticker, + amountInCurrency, + ); + elizaLogger.info("enoughBalance ", enoughBalance); + if (!enoughBalance) { + elizaLogger.error("Not enough balance to trade"); + return; + } + const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); + if (txHash == null) { + elizaLogger.error("txHash is null"); + return; + } + elizaLogger.info("txHash ", txHash); + console.log("buy ", buy); + console.log( + "this.initialBuyAmountInCurrency ", + this.initialBuyAmountInCurrency, + ); - private async handleMediaPosting( - event: WebhookEvent, - amount: number, - pnl: string, - formattedTimestamp: string, - state: State, - txHash: string, - ) { - let mediaContent = ""; - try { - mediaContent = await this.generateMediaContent( + // Generate and post tweet + await this.handleMediaPosting( event, amount, pnl, @@ -410,71 +352,151 @@ Generate only the tweet text, no commentary or markdown.`; state, txHash, ); - elizaLogger.info("Generated media content:", mediaContent); - - if (this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true") { - elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); - } else { - // post tweet to twitter - const response = await postTweet(this.runtime, mediaContent); - elizaLogger.info("Tweet response:", response); - } - } catch (error) { - elizaLogger.error("Failed to post tweet:", error); } - try { - if ( - this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === - "true" && - this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null - ) { - elizaLogger.info( - "Telegram client disabled. Skipping telegram posting.", + + private async setupRoom(roomId: UUID) { + await this.runtime.ensureRoomExists(roomId); + await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); + } + + private createTradeMemory( + event: WebhookEvent, + amount: number, + roomId: UUID, + ): Memory { + return { + id: stringToUuid(`coinbase-${event.timestamp}`), + userId: this.runtime.agentId, + agentId: this.runtime.agentId, + roomId, + content: { + text: `${event.event.toUpperCase()} $${amount} worth of ${ + event.ticker + }`, + action: "SWAP", + source: "coinbase", + metadata: { + ticker: event.ticker, + side: event.event.toUpperCase(), + price: event.price, + amount: amount, + timestamp: event.timestamp, + walletType: "short_term_trading", + }, + }, + createdAt: Date.now(), + }; + } + + private getFormattedTimestamp(): string { + return new Intl.DateTimeFormat("en-US", { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(new Date()); + } + + private async executeTokenSwap( + event: WebhookEvent, + amount: number, + buy: boolean, + ): Promise { + return await tokenSwap( + this.runtime, + amount, + buy ? "USDC" : event.ticker, + buy ? event.ticker : "USDC", + this.runtime.getSetting("WALLET_PUBLIC_KEY"), + this.runtime.getSetting("WALLET_PRIVATE_KEY"), + "base", + ); + } + + private async handleMediaPosting( + event: WebhookEvent, + amount: number, + pnl: string, + formattedTimestamp: string, + state: State, + txHash: string, + ) { + let mediaContent = ""; + try { + mediaContent = await this.generateMediaContent( + event, + amount, + pnl, + formattedTimestamp, + state, + txHash, ); - } else { - // post message to telegram - if (mediaContent.length > 0) { - // TODO: remove hardcoded channel id - await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( - this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), - mediaContent, + elizaLogger.info("Generated media content:", mediaContent); + + if ( + this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true" + ) { + elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); + } else { + // post tweet to twitter + const response = await postTweet(this.runtime, mediaContent); + elizaLogger.info("Tweet response:", response); + } + } catch (error) { + elizaLogger.error("Failed to post tweet:", error); + } + try { + if ( + this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === + "true" && + this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null + ) { + elizaLogger.info( + "Telegram client disabled. Skipping telegram posting.", ); + } else { + // post message to telegram + if (mediaContent.length > 0) { + await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( + this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), + mediaContent, + ); + } } + } catch (error) { + elizaLogger.error("Failed to post telegram:", error); } - } catch (error) { - elizaLogger.error("Failed to post telegram:", error); } - } - async stop(): Promise { - try { - if (this.server?.listen) { - await new Promise((resolve, reject) => { - this.server.listen().close((err: Error | undefined) => { - if (err) reject(err); - else resolve(); + async stop(): Promise { + try { + if (this.server?.listen) { + await new Promise((resolve, reject) => { + this.server.listen().close((err: Error | undefined) => { + if (err) reject(err); + else resolve(); + }); }); - }); + } + elizaLogger.info("Coinbase client stopped successfully"); + } catch (error) { + elizaLogger.error("Error stopping Coinbase client:", error); + throw error; } - elizaLogger.info("Coinbase client stopped successfully"); - } catch (error) { - elizaLogger.error("Error stopping Coinbase client:", error); - throw error; } - } - getType(): string { - return "coinbase"; - } + getType(): string { + return "coinbase"; + } - getName(): string { - return "coinbase"; - } + getName(): string { + return "coinbase"; + } - async start(): Promise { - await this.initialize(); + async start(): Promise { + await this.initialize(); + } } -} export const CoinbaseClientInterface: Client = { start: async (runtime: IAgentRuntime) => { From 97f2542a5c0414e2aee944037f62824d6b1646dc Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Thu, 20 Feb 2025 17:10:52 -0800 Subject: [PATCH 02/22] add trade specific pnl --- clients/client-coinbase/src/index.ts | 31 +- pnpm-lock.yaml | 597 +++++++++------------------ 2 files changed, 225 insertions(+), 403 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 79de941db..c1b7ca141 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -247,9 +247,15 @@ Generate only the tweet text, no commentary or markdown.`; context, modelClass: ModelClass.LARGE, }); - + const isSellTrade = event.event.toUpperCase() === "SELL"; + const sellTradePNL = isSellTrade + ? await calculateSellTradePNL( + this.runtime, + this.initialBuyAmountInCurrency, + ) + : ""; const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} PNL: ${pnl} ${blockExplorerBaseTxUrl(hash)}`; + const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} ${blockExplorerBaseTxUrl(hash)}`; return finalContent.length > 280 ? `${finalContent.substring(0, 277)}...` : finalContent; @@ -540,6 +546,27 @@ export const calculateOverallPNL = async ( return formattedPNLUSD; }; +export const calculateSellTradePNL = async ( + runtime: IAgentRuntime, + initialBuyAmountInCurrency: number, +): Promise => { + const tradingAmount = Number(runtime.getSetting("COINBASE_TRADING_AMOUNT")); + const pnlUSD = initialBuyAmountInCurrency - tradingAmount; + elizaLogger.info(`Sell Trade pnlUSD ${pnlUSD}`); + const absoluteValuePNL = Math.abs(pnlUSD); + elizaLogger.info(`Sell Trade absoluteValuePNL ${absoluteValuePNL}`); + const formattedPNL = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(absoluteValuePNL); + elizaLogger.info(`Sell Trade formattedPNL ${formattedPNL}`); + const formattedPNLUSD = `${pnlUSD < 0 ? "-" : ""}${formattedPNL}`; + elizaLogger.info(`Sell Trade formattedPNLUSD ${formattedPNLUSD}`); + return formattedPNLUSD; +}; + export async function getTotalBalanceUSD( runtime: IAgentRuntime, publicKey: `0x${string}`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f34d1182f..e3cbfefdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 1.9.4 '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) csv-parse: specifier: 5.6.0 version: 5.6.0 @@ -25,7 +25,7 @@ importers: version: 16.4.5 framer-motion: specifier: ^12.4.3 - version: 12.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) pg: specifier: ^8.13.3 version: 8.13.3 @@ -123,16 +123,16 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-coinbase: dependencies: @@ -141,7 +141,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-0x': specifier: workspace:* version: link:../../plugins/plugin-0x @@ -187,13 +187,13 @@ importers: version: 5.0.10 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) tsup: specifier: ^8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -205,13 +205,13 @@ importers: version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-image-generation': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) '@elizaos/plugin-tee-log': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@elizaos/plugin-tee-verifiable-log': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@realityspiral/client-coinbase': specifier: workspace:* version: link:../client-coinbase @@ -266,13 +266,13 @@ importers: version: 8.11.11 tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-github: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/rest': specifier: 20.1.1 version: 20.1.1 @@ -297,7 +297,7 @@ importers: version: 8.1.0 tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.2.1 version: 1.6.1(@types/node@22.13.4) @@ -309,7 +309,7 @@ importers: version: 2.1.1(@types/express@5.0.0)(@types/node@20.17.19)(encoding@0.1.13) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: specifier: 2.21.58 version: 2.21.58(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -328,7 +328,7 @@ importers: version: 20.17.19 tsup: specifier: ^8.0.1 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^2.1.5 version: 2.1.9(@types/node@20.17.19) @@ -340,7 +340,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-email': specifier: workspace:^ version: link:../plugin-email @@ -368,7 +368,7 @@ importers: version: 20.17.19 tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.0.0 version: 1.6.1(@types/node@20.17.19) @@ -377,10 +377,10 @@ importers: dependencies: '@elizaos/adapter-postgres': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) mail-notifier: specifier: ^0.5.0 version: 0.5.0 @@ -408,16 +408,16 @@ importers: version: 6.4.17 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.19) + version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) ts-jest-mock-import-meta: specifier: ^1.2.1 - version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)) + version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -426,7 +426,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/graphql': specifier: 8.2.0 version: 8.2.0 @@ -463,22 +463,22 @@ importers: version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.1) eslint-plugin-vitest: specifier: 0.5.4 - version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)) + version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) plugins/plugin-twitter: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) agent-twitter-client: specifier: 0.0.18 version: 0.0.18(bufferutil@4.0.9)(utf-8-validate@5.0.10) tsup: specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) devDependencies: '@biomejs/biome': specifier: 1.5.3 @@ -491,7 +491,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@radix-ui/react-avatar': specifier: ^1.1.2 version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -539,7 +539,7 @@ importers: version: 1.11.13 framer-motion: specifier: ^12.4.3 - version: 12.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.0.0) @@ -597,7 +597,7 @@ importers: version: 3.8.0(@swc/helpers@0.5.15)(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)) autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.2) + version: 10.4.20(postcss@8.5.3) eslint: specifier: ^9.17.0 version: 9.20.1(jiti@1.21.7) @@ -624,7 +624,7 @@ importers: version: 15.15.0 postcss: specifier: ^8.4.38 - version: 8.5.2 + version: 8.5.3 rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.34.8) @@ -750,8 +750,8 @@ packages: zod: optional: true - '@ai-sdk/provider-utils@2.1.2': - resolution: {integrity: sha512-ezpQT6kzy/2O4yyn/2YigMqynBYjZIOam3/EMNVzju+Ogj+Z+pf27c/Th78ce0A2ltgrXx6xN14sal/HHZNOOw==} + '@ai-sdk/provider-utils@2.1.0': + resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -775,10 +775,6 @@ packages: resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} engines: {node: '>=18'} - '@ai-sdk/provider@1.0.6': - resolution: {integrity: sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==} - engines: {node: '>=18'} - '@ai-sdk/react@0.0.70': resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} @@ -1737,8 +1733,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': @@ -4900,8 +4896,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.4: - resolution: {integrity: sha512-JWkVwbJBgVkeZHNcnk8ififgwTF+5de9wbJnTLI+g9YqaGo75Xd5uRVDm9FR8chqRDOKcXv/71f40CGescYVmg==} + framer-motion@12.4.5: + resolution: {integrity: sha512-9+8wglyIJFeUpVg4U8Ohvoo5x7zmvRqawWXhEUThcYdwL/5A1/OkLvQo68Zz5taUE11HKG/Ex+LPaN2+fMkRdA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6002,8 +5998,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - motion-dom@12.4.4: - resolution: {integrity: sha512-D8Kjp8oqUNqxoAVmIlOH+YCMov/4koBAmG4OJs0VWfh18xkQEIsx9+S7yrXyx0XaMBEPtre6e9LiSW2Zs7vIhA==} + motion-dom@12.4.5: + resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} motion-utils@12.0.0: resolution: {integrity: sha512-MNFiBKbbqnmvOjkPyOKgHUp3Q6oiokLkI1bEwm5QA28cxMZrv0CbbBGDNmhF6DIXsi1pCQBSs0dX8xjeER1tmA==} @@ -6532,8 +6528,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.2: - resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -7317,8 +7313,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.11: - resolution: {integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} tinyld@1.3.4: @@ -8164,8 +8160,8 @@ snapshots: '@ai-sdk/amazon-bedrock@1.1.0(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.6 - '@ai-sdk/provider-utils': 2.1.2(zod@3.23.8) + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) '@aws-sdk/client-bedrock-runtime': 3.751.0 zod: 3.23.8 transitivePeerDependencies: @@ -8244,9 +8240,9 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/provider-utils@2.1.2(zod@3.23.8)': + '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.6 + '@ai-sdk/provider': 1.0.4 eventsource-parser: 3.0.0 nanoid: 3.3.8 secure-json-parse: 2.7.0 @@ -8269,10 +8265,6 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.0.6': - dependencies: - json-schema: 0.4.0 - '@ai-sdk/react@0.0.70(react@19.0.0)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) @@ -9102,9 +9094,9 @@ snapshots: - bufferutil - utf-8-validate - '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@types/pg': 8.11.10 pg: 8.13.1 transitivePeerDependencies: @@ -9271,7 +9263,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9283,65 +9275,7 @@ snapshots: '@fal-ai/client': 1.2.0 '@tavily/core': 0.0.2 '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) - anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) - dotenv: 16.4.5 - fastembed: 1.14.1 - fastestsmallesttextencoderdecoder: 1.0.22 - gaxios: 6.7.1(encoding@0.1.13) - glob: 11.0.0 - handlebars: 4.7.8 - js-sha1: 0.7.0 - js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ollama-ai-provider: 0.16.1(zod@3.23.8) - openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - pino: 9.6.0 - pino-pretty: 13.0.0 - tinyld: 1.3.4 - together-ai: 0.7.0(encoding@0.1.13) - unique-names-generator: 4.7.1 - uuid: 11.0.3 - zod: 3.23.8 - transitivePeerDependencies: - - '@google-cloud/vertexai' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/core' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - aws-crt - - axios - - cheerio - - debug - - encoding - - peggy - - react - - solid-js - - sswr - - supports-color - - svelte - - typeorm - - vue - - ws - - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) - '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) - '@ai-sdk/google': 0.0.55(zod@3.23.8) - '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) - '@ai-sdk/groq': 0.0.3(zod@3.23.8) - '@ai-sdk/mistral': 1.0.9(zod@3.23.8) - '@ai-sdk/openai': 1.0.5(zod@3.23.8) - '@fal-ai/client': 1.2.0 - '@tavily/core': 0.0.2 - '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) dotenv: 16.4.5 fastembed: 1.14.1 @@ -9387,7 +9321,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9409,65 +9343,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ollama-ai-provider: 0.16.1(zod@3.23.8) - openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - pino: 9.6.0 - pino-pretty: 13.0.0 - tinyld: 1.3.4 - together-ai: 0.7.0(encoding@0.1.13) - unique-names-generator: 4.7.1 - uuid: 11.0.3 - zod: 3.23.8 - transitivePeerDependencies: - - '@google-cloud/vertexai' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/core' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - aws-crt - - axios - - cheerio - - debug - - encoding - - peggy - - react - - solid-js - - sswr - - supports-color - - svelte - - typeorm - - vue - - ws - - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) - '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) - '@ai-sdk/google': 0.0.55(zod@3.23.8) - '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) - '@ai-sdk/groq': 0.0.3(zod@3.23.8) - '@ai-sdk/mistral': 1.0.9(zod@3.23.8) - '@ai-sdk/openai': 1.0.5(zod@3.23.8) - '@fal-ai/client': 1.2.0 - '@tavily/core': 0.0.2 - '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) - anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) - dotenv: 16.4.5 - fastembed: 1.14.1 - fastestsmallesttextencoderdecoder: 1.0.22 - gaxios: 6.7.1(encoding@0.1.13) - glob: 11.0.0 - handlebars: 4.7.8 - js-sha1: 0.7.0 - js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9503,7 +9379,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9525,7 +9401,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9594,10 +9470,10 @@ snapshots: - vue - ws - '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': + '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9661,11 +9537,11 @@ snapshots: - vue - ws - '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': + '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-sgx': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) better-sqlite3: 11.6.0 elliptic: 6.6.1 transitivePeerDependencies: @@ -9707,14 +9583,14 @@ snapshots: - yaml - zod - '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': + '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) dompurify: 3.2.2 elliptic: 6.6.1 ethereum-cryptography: 3.1.0 - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) uuid: 11.0.3 vitest: 2.1.5(@types/node@22.13.4) whatwg-url: 7.1.0 @@ -9770,7 +9646,7 @@ snapshots: - yaml - zod - '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.2)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': + '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@phala/dstack-sdk': 0.1.7(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -9780,7 +9656,7 @@ snapshots: bs58: 6.0.0 node-cache: 5.1.2 pumpdotfun-sdk: 1.3.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(rollup@4.34.8)(typescript@5.7.3)(utf-8-validate@5.0.10) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -10071,7 +9947,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -10189,7 +10065,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10203,7 +10079,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10224,7 +10100,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10238,7 +10114,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10259,7 +10135,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10273,7 +10149,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10461,40 +10337,6 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.19 - langsmith: 0.3.10(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - transitivePeerDependencies: - - openai - - '@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.19 - langsmith: 0.3.10(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - transitivePeerDependencies: - - openai - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) @@ -10517,43 +10359,11 @@ snapshots: - encoding - ws - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - openai: 4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - transitivePeerDependencies: - - encoding - - ws - - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - openai: 4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - transitivePeerDependencies: - - encoding - - ws - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - '@msgpack/msgpack@3.0.1': {} '@noble/ciphers@1.2.1': {} @@ -12272,7 +12082,7 @@ snapshots: '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.2 + postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -12578,14 +12388,14 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.5.2): + autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 caniuse-lite: 1.0.30001700 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.2 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -13097,13 +12907,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.19): + create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13112,13 +12922,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13579,13 +13389,13 @@ snapshots: get-tsconfig: 4.10.0 is-bun-module: 1.3.0 stable-hash: 0.0.4 - tinyglobby: 0.2.11 + tinyglobby: 0.2.12 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: @@ -13607,7 +13417,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.20.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13683,12 +13493,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)): + eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3) eslint: 9.13.0(jiti@1.21.7) optionalDependencies: - vitest: 2.1.9(@types/node@20.17.19) + vitest: 1.6.1(@types/node@20.17.19) transitivePeerDependencies: - supports-color - typescript @@ -13755,7 +13565,7 @@ snapshots: '@eslint/plugin-kit': 0.2.6 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -14108,9 +13918,9 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 12.4.4 + motion-dom: 12.4.5 motion-utils: 12.0.0 tslib: 2.8.1 optionalDependencies: @@ -14758,16 +14568,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.19): + jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19) + create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14777,16 +14587,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14827,7 +14637,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14853,11 +14663,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14883,12 +14694,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14914,7 +14725,38 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.9 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.9) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.13.4 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15146,24 +14988,24 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.17.19): + jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19) + jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15351,52 +15193,6 @@ snapshots: - openai - ws - langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) - js-tiktoken: 1.0.15 - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.7.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - optionalDependencies: - axios: 1.7.9 - handlebars: 4.7.8 - transitivePeerDependencies: - - encoding - - openai - - ws - - langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - '@langchain/core': 0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) - js-tiktoken: 1.0.15 - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.7.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) - optionalDependencies: - axios: 1.7.9 - handlebars: 4.7.8 - transitivePeerDependencies: - - encoding - - openai - - ws - langsmith@0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@types/uuid': 10.0.0 @@ -15420,30 +15216,6 @@ snapshots: optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - langsmith@0.3.10(openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.12.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.7.1 - uuid: 10.0.0 - optionalDependencies: - openai: 4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - - langsmith@0.3.10(openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.12.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.7.1 - uuid: 10.0.0 - optionalDependencies: - openai: 4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -15662,7 +15434,7 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 - motion-dom@12.4.4: + motion-dom@12.4.5: dependencies: motion-utils: 12.0.0 @@ -16171,37 +15943,37 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.2): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.2 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.2): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.2 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.2 + postcss: 8.5.3 ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3) - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.2)(yaml@2.7.0): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.2 + postcss: 8.5.3 yaml: 2.7.0 - postcss-nested@6.2.0(postcss@8.5.2): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.2 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -16211,7 +15983,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.2: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -17068,11 +16840,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.2 - postcss-import: 15.1.0(postcss@8.5.2) - postcss-js: 4.0.1(postcss@8.5.2) - postcss-load-config: 4.0.2(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) - postcss-nested: 6.2.0(postcss@8.5.2) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -17149,7 +16921,7 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.11: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -17227,16 +16999,16 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)): + ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): dependencies: - ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) + ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17251,12 +17023,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17269,13 +17041,14 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) + esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.19) + jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17288,6 +17061,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) + esbuild: 0.24.2 ts-mixer@6.0.4: {} @@ -17330,6 +17104,7 @@ snapshots: yn: 3.1.1 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) + optional: true ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3): dependencies: @@ -17352,6 +17127,26 @@ snapshots: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true + ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.4 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.18(@swc/helpers@0.5.15) + tsconfck@3.1.5(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 @@ -17367,7 +17162,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.2)(typescript@5.7.3)(yaml@2.7.0): + tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -17377,17 +17172,17 @@ snapshots: esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.2)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.11 + tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) - postcss: 8.5.2 + postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -17721,7 +17516,7 @@ snapshots: vite@5.4.14(@types/node@20.17.19): dependencies: esbuild: 0.21.5 - postcss: 8.5.2 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 20.17.19 @@ -17730,7 +17525,7 @@ snapshots: vite@5.4.14(@types/node@22.13.4): dependencies: esbuild: 0.21.5 - postcss: 8.5.2 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.4 @@ -17739,7 +17534,7 @@ snapshots: vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0): dependencies: esbuild: 0.24.2 - postcss: 8.5.2 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.4 From 405493fa474e58bff8cc6d6717840731d84f52b0 Mon Sep 17 00:00:00 2001 From: Snobbish Bee <125891987+snobbee@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:33:21 +0100 Subject: [PATCH 03/22] chore: add pre commit auto formatting (#37) --- .husky/pre-commit | 4 ++++ package.json | 4 +++- pnpm-lock.yaml | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..d06904221 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm format || (echo "❌ Format check failed. Please run 'pnpm format' to fix the issues." && exit 1) \ No newline at end of file diff --git a/package.json b/package.json index 8bfae958b..22277c4d7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "smokeTests": "bash ./scripts/smoke-tests.sh", "integrationTests": "bash ./scripts/integration-tests.sh", "detectMinifiedCode": "bash ./scripts/detect-minified-code.sh", - "clean": "bash ./scripts/clean.sh" + "clean": "bash ./scripts/clean.sh", + "prepare": "husky" }, "dependencies": { "@biomejs/biome": "^1.9.4", @@ -29,6 +30,7 @@ "devDependencies": { "@types/node": "^20.0.0", "@types/pg": "^8.11.11", + "husky": "^9.0.11", "prettier": "^3.4.2", "turbo": "^2.4.0", "typescript": "5.7.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3cbfefdd..661171f93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,6 +48,9 @@ importers: '@types/pg': specifier: ^8.11.11 version: 8.11.11 + husky: + specifier: ^9.0.11 + version: 9.1.7 prettier: specifier: ^3.4.2 version: 3.5.1 @@ -5146,6 +5149,11 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -14214,6 +14222,8 @@ snapshots: dependencies: ms: 2.1.3 + husky@9.1.7: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 From 5faac7c8ccbc7e7320f4f571984e030b968b908c Mon Sep 17 00:00:00 2001 From: Tim <70578108+TimKozak@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:48:52 +0200 Subject: [PATCH 04/22] docs: Update TG on website (#39) Update TG on website --- docs/prosper/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/prosper/README.md b/docs/prosper/README.md index c0ad2204d..2c2c19e07 100644 --- a/docs/prosper/README.md +++ b/docs/prosper/README.md @@ -64,5 +64,5 @@ By balancing financial performance with community engagement, Prosper continues - **Reality Spiral Website**: [Reality Spiral](https://www.realityspiral.com/) - **GitHub**: [Sifchain/realityspiral](https://github.com/Sifchain/realityspiral) -- **Telegram**: [Reality Spiral](https://t.me/reality_spiral) +- **Telegram**: [Prosper Spiral](https://t.me/ProsperSpiral) - **Twitter/X**: [@Prosper_Spiral](https://x.com/Prosper_spiral) From 85bf879f234c96f228e5ffdc5385207e99268ba7 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Fri, 21 Feb 2025 08:00:06 -0800 Subject: [PATCH 05/22] feat: Add provider for token address + staking instructions (#40) * token address + staking instructions * 2 * address comments * comments --- .env.example | 3 + characters/prosper.character.json | 2 +- clients/client-coinbase/src/index.ts | 42 + clients/client-coinbase/src/utils.ts | 1077 ++++++++++++++++++++++++ clients/client-coinbase/tsup.config.ts | 1 + pnpm-lock.yaml | 281 ++++++- 6 files changed, 1359 insertions(+), 47 deletions(-) create mode 100644 clients/client-coinbase/src/utils.ts diff --git a/.env.example b/.env.example index 17bdb3807..916c979a7 100644 --- a/.env.example +++ b/.env.example @@ -101,6 +101,9 @@ COINBASE_MASS_PAYMENTS_PAYMENT_ENABLED= # Enable this to run the mass payments p COINBASE_TRADE_PLUGIN_ENABLED= # Enable this to run the trade plugin COINBASE_TOKEN_CONTRACT_PLUGIN_ENABLED= # Enable this to run the token contract plugin COINBASE_ADVANCED_TRADE_PLUGIN_ENABLED= # Enable this to run the advanced trade plugin +COINBASE_TOKEN_ADDRESS_BASE= # Base token address +COINBASE_TOKEN_ADDRESS_SOL= # Sol token address +MORALIS_API_KEY= # Moralis API key # Github GITHUB_CLIENT_DISABLED=false # Enable this to disable the GitHub client diff --git a/characters/prosper.character.json b/characters/prosper.character.json index ac6fbef9a..f4b18c67e 100644 --- a/characters/prosper.character.json +++ b/characters/prosper.character.json @@ -1,7 +1,7 @@ { "name": "Prosper", "clients": ["coinbase", "twitter", "telegram"], - "username": "The Financial Strategist and Community Influencer", + "username": "Prosper", "modelProvider": "openai", "imageModelProvider": "openai", "knowledge": [ diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index c1b7ca141..c3e70a2fe 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -35,6 +35,7 @@ import { blockExplorerBaseTxUrl, supportedTickers, } from "./types"; +import { calculateAPR, fetchTokenPrice } from "./utils"; export type { WebhookEvent }; @@ -58,6 +59,10 @@ export class CoinbaseClient implements Client { this.runtime.providers.push(balanceProvider); this.runtime.providers.push(addressProvider); this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); this.server = express(); this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; this.wallets = []; @@ -830,4 +835,41 @@ export const tradingSignalBackTestProvider: Provider = { }, }; +const baseTokenAddressProvider = { + get: async (runtime: IAgentRuntime, _message: Memory) => { + return `BASE Token Address: ${runtime.getSetting("COINBASE_TOKEN_ADDRESS_BASE")}`; + }, +}; + +const solTokenAddressProvider = { + get: async (runtime: IAgentRuntime, _message: Memory) => { + return `SOL Token Address: ${runtime.getSetting("COINBASE_TOKEN_ADDRESS_SOL")}`; + }, +}; + +const stakingLiquidityPoolingProvider = { + get: async (runtime: IAgentRuntime, _message: Memory) => { + return `How to stake on BASE: + 1. Go to uniswap v2 (https://app.uniswap.org/positions/create/v2) and add liquidity to ${runtime.character.username.toUpperCase()} / ETH and receive the LP token + 2. Go to staking website (https://stakeprosper.com/) and stake your LP tokens and receive rewards + Notes you can claim rewards whenever and there is a 7 day lockup period for unstaking. + + How to pool on SOL: Go to raydium (https://raydium.io/liquidity-pools/?token=${runtime.getSetting("COINBASE_TOKEN_ADDRESS_SOL")}) and add liquidity to ${runtime.character.username.toUpperCase()} / ETH and receive rewards you can withdraw anytime`; + }, +}; + +const currentPriceProvider = { + get: async (_runtime: IAgentRuntime, _message: Memory) => { + // const priceOnBase = await fetchTokenPrice( + // runtime, + // runtime.getSetting("COINBASE_TOKEN_ADDRESS_BASE"), + // ); + // const aprOnBase = await calculateAPR( + // runtime.getSetting("COINBASE_TOKEN_ADDRESS_BASE"), + // ); + // return `Current price of ${runtime.character.name.toUpperCase} on Base is ${priceOnBase.current} and APR is ${aprOnBase}. + // `; + }, +}; + export default CoinbaseClientInterface; diff --git a/clients/client-coinbase/src/utils.ts b/clients/client-coinbase/src/utils.ts new file mode 100644 index 000000000..f3efbe0e0 --- /dev/null +++ b/clients/client-coinbase/src/utils.ts @@ -0,0 +1,1077 @@ +import { type IAgentRuntime, elizaLogger } from "@elizaos/core"; +import axios from "axios"; +import { Contract, type Signer } from "ethers"; +import { JsonRpcProvider } from "ethers/providers"; +import { formatUnits } from "ethers/utils"; + +// prosper +export const PROSPER_STAKING_CONTRACT_ADDRESS = + "0xdAdE4d372F57E325b34fB45fDf7bAaCBE6B760B5"; // staking contract prosper/eth lp +export const PROSPER_TOKEN_ADDRESS = + "0x8Ff64D734C614fEd508F6673CE65717Cc1d8B6c8"; // prosper +export const PROSPER_STAKING_TOKEN = + "0x75CBCa884c3cca9802a63D805c8b0f1C7110Ded7"; // prosper/eth lp +export const RSP_STAKING_CONTRACT_ADDRESS = + "0xb9EAfef078A903C16c269bD63A5F5D5636c4004C"; // staking contract rsp/eth lp +export const RSP_TOKEN_ADDRESS = "0x6F8097E84fdD24C482d1982416f85CF32De594F5"; // rsp +export const RSP_STAKING_TOKEN = "0x5131c2D2DdCBfdA5F5b5A7a9D5C173A99Eb36C5b"; // rsp/eth lp +const RPC_URL = + "https://base-mainnet.infura.io/v3/f2ace3972c5d4c75bfd063d4016d423a"; + +const ABI = [ + { + inputs: [ + { + internalType: "contract IERC20Metadata", + name: "_rewardToken", + type: "address", + }, + ], + name: "addRewardPool", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "adminWithdrawUnstakeFee", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "exit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_pid", + type: "uint256", + }, + { + internalType: "uint256", + name: "_reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "_duration", + type: "uint256", + }, + ], + name: "extendRewardPool", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getReward", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "removeETH", + outputs: [ + { + internalType: "bool", + name: "status", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "newLockTime", + type: "uint256", + }, + ], + name: "setLockTime", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_stakingToken", + type: "address", + }, + { + internalType: "address", + name: "_treasury", + type: "address", + }, + { + internalType: "uint256", + name: "_stakingFee", + type: "uint256", + }, + { + internalType: "uint256", + name: "_tokenFee", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "_token", + type: "address", + }, + ], + name: "rescueTokens", + outputs: [ + { + internalType: "bool", + name: "status", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "rewardToken", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardAmount", + type: "uint256", + }, + ], + name: "RewardPaid", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "rewardPoolID", + type: "uint256", + }, + { + indexed: false, + internalType: "address", + name: "rewardTokenAddress", + type: "address", + }, + ], + name: "RewardPoolAdded", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "rewardPoolID", + type: "uint256", + }, + { + indexed: false, + internalType: "address", + name: "rewardTokenAddress", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "oldRewardAmount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newRewardAmount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "totalRewardAmount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardDuration", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardPeriodFinish", + type: "uint256", + }, + ], + name: "RewardPoolExtended", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "rewardPoolID", + type: "uint256", + }, + { + indexed: false, + internalType: "address", + name: "rewardTokenAddress", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardAmount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardDuration", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "rewardPeriodFinish", + type: "uint256", + }, + ], + name: "RewardPoolStarted", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "_treasury", + type: "address", + }, + ], + name: "setNewTreasury", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "stake", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Staked", + type: "event", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_pid", + type: "uint256", + }, + { + internalType: "uint256", + name: "_reward", + type: "uint256", + }, + { + internalType: "uint256", + name: "_duration", + type: "uint256", + }, + ], + name: "startRewardPool", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Withdrawn", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "addedRewardTokens", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "stakingFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "_pid", + type: "uint256", + }, + ], + name: "earned", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_pid", + type: "uint256", + }, + ], + name: "endTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_pid", + type: "uint256", + }, + ], + name: "lastTimeRewardsActive", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "lockTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "poolInfo", + outputs: [ + { + internalType: "contract IERC20Metadata", + name: "rewardToken", + type: "address", + }, + { + internalType: "uint256", + name: "rewardPoolID", + type: "uint256", + }, + { + internalType: "uint256", + name: "duration", + type: "uint256", + }, + { + internalType: "uint256", + name: "periodFinish", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "lastUpdateTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "rewardRate", + type: "uint256", + }, + { + internalType: "uint256", + name: "rewardPerTokenStored", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "poolLength", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "uint256", name: "_pid", type: "uint256" }], + name: "rewardPerToken", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "rewardsInPool", + outputs: [ + { + internalType: "uint256", + name: "rewards", + type: "uint256", + }, + { + internalType: "uint256", + name: "userRewardPerTokenPaid", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "stakingToken", + outputs: [ + { + internalType: "contract IERC20Metadata", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "stakingTokenMultiplier", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "tokenFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "treasury", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "unstakeableTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unstakeFee", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, +]; + +export const getContract = (address: string, signer?: Signer) => { + try { + const provider = new JsonRpcProvider(RPC_URL); + elizaLogger.info("Getting contract for " + address); + elizaLogger.info("Signer: " + signer); + elizaLogger.info("Provider: " + provider); + return new Contract(address, ABI, signer || provider); + } catch (error) { + elizaLogger.error("Failed to get contract:", error); + throw error; + } +}; + +export const getTotalTokenStaked = async (token: "PROSPER" | "RSP") => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const totalSupply = await contract.totalSupply(); + console.log("Total Staked" + totalSupply); + return formatUnits(totalSupply, 18); +}; + +const cache = { + PROSPER: { price: null as number | null, timestamp: 0 }, + RSP: { price: null as number | null, timestamp: 0 }, +}; + +const CACHE_DURATION = 5 * 60 * 1000; // Cache duration in milliseconds (e.g., 5 minutes) +const MAX_RETRIES = 3; // Maximum number of retries +const RETRY_DELAY = 1000; // Delay between retries in milliseconds (e.g., 1 second) + +export const getLPPrice = async (token: "PROSPER" | "RSP") => { + const currentTime = Date.now(); + + // Check if the cached value is still valid + if ( + cache[token].price !== null && + currentTime - cache[token].timestamp < CACHE_DURATION + ) { + console.log("Returning cached price for", token + " " + cache[token].price); + return cache[token].price; + } + + const tokenAddress = + token === "PROSPER" ? PROSPER_TOKEN_ADDRESS : RSP_TOKEN_ADDRESS; + let response; + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + response = await axios.get(`/api/token_price?address=${tokenAddress}`); + break; // Exit loop if request is successful + } catch (error) { + console.error(`Attempt ${attempt + 1} failed:`, error); + if (attempt < MAX_RETRIES - 1) { + await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY)); // Wait before retrying + } else { + throw new Error("Failed to fetch token price after multiple attempts"); + } + } + } + + if (!response) { + throw new Error("Failed to fetch token price after multiple attempts"); + } + + console.log("Response:" + JSON.stringify(response.data)); + + const totalLiquidityUSD = BigInt( + Math.floor( + Number.parseFloat(response.data.price.totalLiquidityUSD.toString()), + ), + ); + console.log("Total Liquidity USD:" + totalLiquidityUSD); + + const contract = getContract( + token === "PROSPER" ? PROSPER_STAKING_TOKEN : RSP_STAKING_TOKEN, + ); + let totalLPSupply = BigInt(await contract.totalSupply()); + console.log("Total Supply:" + totalLPSupply); + if (totalLPSupply === BigInt(0)) { + totalLPSupply = BigInt(9999999999999999999000n); + } + + // Calculate liquidity pool price as a floating-point number + const liquidityPoolPrice = Number(totalLiquidityUSD) / Number(totalLPSupply); + console.log("Token Price:", liquidityPoolPrice); + + // Update the cache + cache[token] = { price: liquidityPoolPrice, timestamp: currentTime }; + + return liquidityPoolPrice; // Return as a number +}; + +export const getTotalAmountStaked = async (token: "PROSPER" | "RSP") => { + const tokenPrice = await getLPPrice(token); + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const totalSupply = BigInt(await contract.totalSupply()); + + // if (totalSupply === BigInt(0)) { + // totalSupply = BigInt(9999999999999999999000); + // } + console.log("Total Supply: " + totalSupply); + + // Calculate total staked USD using number arithmetic + const totalStakedUSD = Number(totalSupply) * tokenPrice; + + console.log("Total Staked USD" + totalStakedUSD); + console.log("Token Price " + tokenPrice); + + return totalStakedUSD.toFixed(4); // Return as a formatted string +}; + +export const getUserStaked = async ( + userWallet: string, + token: "PROSPER" | "RSP", +) => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const balance = await contract.balanceOf(userWallet); + return formatUnits(balance, 18); +}; + +export const getAvailableRewards = async ( + userWallet: string, + token: "PROSPER" | "RSP", +) => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const rewards = await contract.earned(userWallet, 0); + return formatUnits(rewards, 18); +}; + +export const claimReward = async (signer: Signer, token: "PROSPER" | "RSP") => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + signer, + ); + const tx = await contract.getReward(); + await tx.wait(); +}; + +export const unstake = async (signer: Signer, token: "PROSPER" | "RSP") => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + signer, + ); + const tx = await contract.exit(); + await tx.wait(); +}; + +export const stake = async ( + signer: Signer, + amount: string, + token: "PROSPER" | "RSP", +) => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + signer, + ); + const tx = await contract.stake(amount); + await tx.wait(); +}; + +export const getAvailableToken = async ( + userWallet: string, + token: "PROSPER" | "RSP", +) => { + const provider = new JsonRpcProvider(RPC_URL); + const prosperContract = new Contract( + token === "PROSPER" ? PROSPER_STAKING_TOKEN : RSP_STAKING_TOKEN, + ABI, + provider, + ); // token being staked + const balance = await prosperContract.balanceOf(userWallet); + return formatUnits(balance, 18); +}; + +export const getRewardPerToken = async (token: "PROSPER" | "RSP") => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const rewardPerToken = await contract.rewardPerToken(0); + return formatUnits(rewardPerToken, 18); +}; + +export const getStakingTokenMultiplier = async (token: "PROSPER" | "RSP") => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const multiplier = await contract.stakingTokenMultiplier(); + return formatUnits(multiplier, 18); +}; + +export const calculateAPR = async (address: string) => { + const contract = getContract(address); + + // Fetch poolInfo and extract rewardRate + const poolInfo = await contract.poolInfo(0); + const rewardRate = BigInt(poolInfo[6].toString()); + console.log(`Reward Rate for ${address}:`, rewardRate.toString()); + + // Calculate rewards per year using rewardRate + const secondsInYear = BigInt(365 * 24 * 60 * 60); + const rewardPerYear = rewardRate * secondsInYear; + console.log(`Reward Per Year for ${address}:`, rewardPerYear.toString()); + + let totalSupply = BigInt((await contract.totalSupply()).toString()); + if (totalSupply === BigInt(0)) { + console.warn(`Total Supply for ${address} is zero, using default value.`); + // Use a safer default value to avoid precision loss + totalSupply = BigInt("9999999999999999999000"); + } + console.log(`Total Supply for ${address}:`, totalSupply.toString()); + + // Calculate APR + console.log("Reward Per Year:" + rewardPerYear.toString()); + const apr = (rewardPerYear / BigInt(totalSupply)) * BigInt(100); + console.log(`APR for ${address}:`, apr.toString()); + + return apr; +}; + +export const fetchUnstakeableTime = async ( + userWallet: string, + token: "PROSPER" | "RSP", +) => { + const contract = getContract( + token === "PROSPER" + ? PROSPER_STAKING_CONTRACT_ADDRESS + : RSP_STAKING_CONTRACT_ADDRESS, + ); + const unstakeableTime = await contract.unstakeableTime(userWallet); + return Number.parseInt(unstakeableTime.toString(), 10); +}; + +/** + * Formats a number to USD currency string + * @param {number} value - The number to format + * @returns {string} - Formatted currency string + */ +export function formatUSD(value: number): string { + return new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(value); +} + +/** + * Safely converts a value to a number and handles formatting + * @param {any} value - The value to convert + * @param {number} decimals - Number of decimal places + * @returns {string} - Formatted number string + */ +export function safeNumberFormat(value: any, decimals = 2) { + const number = Number(value); + return Number.isNaN(number) ? "0.00" : number.toFixed(decimals); +} + +export const fetchTokenPrice = async ( + runtime: IAgentRuntime, + tokenAddress: string, + chainId = "0x2105", +) => { + if ( + runtime.getSetting("MORALIS_API_KEY") == null || + runtime.getSetting("MORALIS_API_KEY") === "" + ) { + elizaLogger.error("MORALIS_API_KEY is not set"); + throw new Error("MORALIS_API_KEY is not set"); + } + try { + // what about solana + const response = await axios.get( + `https://deep-index.moralis.io/api/v2/erc20/${tokenAddress}/price`, + { + params: { + chain: chainId, + include: "percent_change", + }, + headers: { + "X-API-Key": runtime.getSetting("MORALIS_API_KEY"), + }, + }, + ); + + const tokenPrice = Number(response.data.usdPrice) || 0; + const priceChange24h = Number(response.data["24hrPercentChange"]) || 0; + const totalLiquidityUSD = Number(response.data.pairTotalLiquidityUsd) || 0; + elizaLogger.info("Token Price: " + tokenPrice); + elizaLogger.info("Price Change 24h: " + priceChange24h); + elizaLogger.info("Total Liquidity USD: " + totalLiquidityUSD); + return { + current: tokenPrice, + change24h: priceChange24h, + totalLiquidityUSD: totalLiquidityUSD, + }; + } catch (error) { + console.error("Error fetching token price:", error); + throw error; + } +}; diff --git a/clients/client-coinbase/tsup.config.ts b/clients/client-coinbase/tsup.config.ts index 87a4956fb..76bc1cc3a 100644 --- a/clients/client-coinbase/tsup.config.ts +++ b/clients/client-coinbase/tsup.config.ts @@ -44,6 +44,7 @@ export default defineConfig({ "advanced-sdk-ts", "jsonwebtoken", "whatwg-url", + "ethers", ], platform: "node", target: "node23", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 661171f93..1e8b0003b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) csv-parse: specifier: 5.6.0 version: 5.6.0 @@ -25,7 +26,7 @@ importers: version: 16.4.5 framer-motion: specifier: ^12.4.3 - version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) pg: specifier: ^8.13.3 version: 8.13.3 @@ -127,15 +128,19 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: 10.9.2 version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-coinbase: dependencies: @@ -145,6 +150,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-0x': specifier: workspace:* version: link:../../plugins/plugin-0x @@ -191,12 +197,14 @@ importers: ts-jest: specifier: ^29.1.0 version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -209,12 +217,15 @@ importers: '@elizaos/plugin-image-generation': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) '@elizaos/plugin-tee-log': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@elizaos/plugin-tee-verifiable-log': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@realityspiral/client-coinbase': specifier: workspace:* version: link:../client-coinbase @@ -270,12 +281,14 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-github: dependencies: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/rest': specifier: 20.1.1 version: 20.1.1 @@ -301,6 +314,7 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.2.1 version: 1.6.1(@types/node@22.13.4) @@ -313,6 +327,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: specifier: 2.21.58 version: 2.21.58(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -332,6 +347,7 @@ importers: tsup: specifier: ^8.0.1 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^2.1.5 version: 2.1.9(@types/node@20.17.19) @@ -344,6 +360,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-email': specifier: workspace:^ version: link:../plugin-email @@ -372,6 +389,7 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.0.0 version: 1.6.1(@types/node@20.17.19) @@ -381,9 +399,11 @@ importers: '@elizaos/adapter-postgres': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) mail-notifier: specifier: ^0.5.0 version: 0.5.0 @@ -412,15 +432,19 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) ts-jest-mock-import-meta: specifier: ^1.2.1 version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) + version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -430,6 +454,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/graphql': specifier: 8.2.0 version: 8.2.0 @@ -467,21 +492,25 @@ importers: eslint-plugin-vitest: specifier: 0.5.4 version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) + version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) plugins/plugin-twitter: dependencies: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) agent-twitter-client: specifier: 0.0.18 version: 0.0.18(bufferutil@4.0.9)(utf-8-validate@5.0.10) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) devDependencies: '@biomejs/biome': specifier: 1.5.3 @@ -495,6 +524,7 @@ importers: '@elizaos/core': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@radix-ui/react-avatar': specifier: ^1.1.2 version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -527,7 +557,7 @@ importers: version: 9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query': specifier: ^5.63.0 - version: 5.66.7(react@19.0.0) + version: 5.66.8(react@19.0.0) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -542,7 +572,7 @@ importers: version: 1.11.13 framer-motion: specifier: ^12.4.3 - version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.0.0) @@ -601,15 +631,16 @@ importers: autoprefixer: specifier: ^10.4.19 version: 10.4.20(postcss@8.5.3) + version: 10.4.20(postcss@8.5.3) eslint: specifier: ^9.17.0 version: 9.20.1(jiti@1.21.7) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) + version: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) eslint-plugin-import: specifier: ^2.28.1 - version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)) + version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) eslint-plugin-jsx-a11y: specifier: ^6.7.1 version: 6.10.2(eslint@9.20.1(jiti@1.21.7)) @@ -628,6 +659,7 @@ importers: postcss: specifier: ^8.4.38 version: 8.5.3 + version: 8.5.3 rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.34.8) @@ -753,6 +785,8 @@ packages: zod: optional: true + '@ai-sdk/provider-utils@2.1.0': + resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} '@ai-sdk/provider-utils@2.1.0': resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} engines: {node: '>=18'} @@ -1736,6 +1770,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} '@humanwhocodes/retry@0.4.2': resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} @@ -2047,8 +2083,8 @@ packages: resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} engines: {node: '>= 18'} - '@octokit/graphql@7.1.0': - resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} engines: {node: '>= 18'} '@octokit/graphql@8.2.0': @@ -3057,8 +3093,8 @@ packages: '@tanstack/query-core@5.66.4': resolution: {integrity: sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==} - '@tanstack/react-query@5.66.7': - resolution: {integrity: sha512-qd3q/tUpF2K1xItfPZddk1k/8pSXnovg41XyCqJgPoyYEirMBtB0sVEVVQ/CsAOngzgWtBPXimVf4q4kM9uO6A==} + '@tanstack/react-query@5.66.8': + resolution: {integrity: sha512-LqYHYArmM7ycyT1I/Txc/n6KzI8S/hBFw2SQ9Uj1GpbZ89AvZLEvetquiQEHkZ5rFEm+iVNpZ6zYjTiPmJ9N5Q==} peerDependencies: react: ^18 || ^19 @@ -4522,8 +4558,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.2: - resolution: {integrity: sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -4899,8 +4935,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.5: - resolution: {integrity: sha512-9+8wglyIJFeUpVg4U8Ohvoo5x7zmvRqawWXhEUThcYdwL/5A1/OkLvQo68Zz5taUE11HKG/Ex+LPaN2+fMkRdA==} + framer-motion@12.4.7: + resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6006,6 +6042,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + motion-dom@12.4.5: + resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} motion-dom@12.4.5: resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} @@ -6232,8 +6270,8 @@ packages: zod: optional: true - openai@4.85.2: - resolution: {integrity: sha512-ZQg3Q+K4A6M9dLFh5W36paZkZBQO+VbxMNJ1gUSyHsGiEWuXahdn02ermqNV68LhWQxdJQaWUFRAYpW/suTPWQ==} + openai@4.85.3: + resolution: {integrity: sha512-KTMXAK6FPd2IvsPtglMt0J1GyVrjMxCYzu/mVbCPabzzquSJoZlYpHtE0p0ScZPyt11XTc757xSO4j39j5g+Xw==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -6536,6 +6574,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -7185,8 +7225,8 @@ packages: strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.0: + resolution: {integrity: sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -7321,6 +7361,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} tinyglobby@0.2.12: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} @@ -8100,8 +8142,8 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.24.2: + resolution: {integrity: sha512-pNUqrcSxuuB3/+jBbU8qKUbTbDqYUaG1vf5cXFjbhGgoUuA1amO/y4Q8lzfOhHU8HNPK6VFJ18lBDKj3OHyDsg==} peerDependencies: zod: ^3.24.1 @@ -8168,6 +8210,8 @@ snapshots: '@ai-sdk/amazon-bedrock@1.1.0(zod@3.23.8)': dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) '@ai-sdk/provider': 1.0.4 '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) '@aws-sdk/client-bedrock-runtime': 3.751.0 @@ -8248,8 +8292,10 @@ snapshots: optionalDependencies: zod: 3.23.8 + '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': dependencies: + '@ai-sdk/provider': 1.0.4 '@ai-sdk/provider': 1.0.4 eventsource-parser: 3.0.0 nanoid: 3.3.8 @@ -8306,7 +8352,7 @@ snapshots: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) json-schema: 0.4.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: zod: 3.23.8 @@ -9102,8 +9148,10 @@ snapshots: - bufferutil - utf-8-validate + '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: + '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@types/pg': 8.11.10 pg: 8.13.1 @@ -9271,6 +9319,7 @@ snapshots: - vue - ws + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) @@ -9284,6 +9333,7 @@ snapshots: '@tavily/core': 0.0.2 '@types/uuid': 10.0.0 ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) dotenv: 16.4.5 fastembed: 1.14.1 @@ -9329,6 +9379,7 @@ snapshots: - vue - ws + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) @@ -9352,6 +9403,7 @@ snapshots: js-sha1: 0.7.0 js-tiktoken: 1.0.15 langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9387,6 +9439,7 @@ snapshots: - vue - ws + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) @@ -9410,6 +9463,7 @@ snapshots: js-sha1: 0.7.0 js-tiktoken: 1.0.15 langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9478,10 +9532,12 @@ snapshots: - vue - ws + '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9545,11 +9601,13 @@ snapshots: - vue - ws + '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-sgx': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) better-sqlite3: 11.6.0 elliptic: 6.6.1 transitivePeerDependencies: @@ -9591,14 +9649,17 @@ snapshots: - yaml - zod + '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) dompurify: 3.2.2 elliptic: 6.6.1 ethereum-cryptography: 3.1.0 tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) uuid: 11.0.3 vitest: 2.1.5(@types/node@22.13.4) whatwg-url: 7.1.0 @@ -9654,6 +9715,7 @@ snapshots: - yaml - zod + '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -9665,6 +9727,7 @@ snapshots: node-cache: 5.1.2 pumpdotfun-sdk: 1.3.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(rollup@4.34.8)(typescript@5.7.3)(utf-8-validate@5.0.10) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) + tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9955,6 +10018,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.2': {} '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': @@ -10073,6 +10137,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 @@ -10088,6 +10153,7 @@ snapshots: graceful-fs: 4.2.11 jest-changed-files: 29.7.0 jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10108,6 +10174,7 @@ snapshots: - supports-color - ts-node + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 @@ -10123,6 +10190,7 @@ snapshots: graceful-fs: 4.2.11 jest-changed-files: 29.7.0 jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10143,6 +10211,7 @@ snapshots: - supports-color - ts-node + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 @@ -10158,6 +10227,7 @@ snapshots: graceful-fs: 4.2.11 jest-changed-files: 29.7.0 jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10341,7 +10411,7 @@ snapshots: p-retry: 4.6.2 uuid: 10.0.0 zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: - openai @@ -10349,9 +10419,9 @@ snapshots: dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - openai: 4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: - encoding - ws @@ -10360,9 +10430,9 @@ snapshots: dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - openai: 4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: - encoding - ws @@ -10415,7 +10485,7 @@ snapshots: '@octokit/core@5.2.0': dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.0 + '@octokit/graphql': 7.1.1 '@octokit/request': 8.4.1 '@octokit/request-error': 5.1.1 '@octokit/types': 13.8.0 @@ -10432,7 +10502,7 @@ snapshots: '@octokit/types': 13.8.0 universal-user-agent: 6.0.1 - '@octokit/graphql@7.1.0': + '@octokit/graphql@7.1.1': dependencies: '@octokit/request': 8.4.1 '@octokit/types': 13.8.0 @@ -11565,7 +11635,7 @@ snapshots: '@tanstack/query-core@5.66.4': {} - '@tanstack/react-query@5.66.7(react@19.0.0)': + '@tanstack/react-query@5.66.8(react@19.0.0)': dependencies: '@tanstack/query-core': 5.66.4 react: 19.0.0 @@ -12091,6 +12161,7 @@ snapshots: estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 + postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -12212,7 +12283,7 @@ snapshots: json-schema: 0.4.0 jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) react: 19.0.0 @@ -12237,7 +12308,7 @@ snapshots: json-schema: 0.4.0 jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) react: 19.0.0 @@ -12396,6 +12467,7 @@ snapshots: atomic-sleep@1.0.0: {} + autoprefixer@10.4.20(postcss@8.5.3): autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 @@ -12404,6 +12476,7 @@ snapshots: normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.3 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12915,6 +12988,7 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 @@ -12922,6 +12996,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12930,6 +13005,7 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 @@ -12937,6 +13013,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13388,7 +13465,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 @@ -13398,23 +13475,24 @@ snapshots: is-bun-module: 1.3.0 stable-hash: 0.0.4 tinyglobby: 0.2.12 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) eslint: 9.20.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -13425,7 +13503,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.20.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13501,12 +13579,14 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3) eslint: 9.13.0(jiti@1.21.7) optionalDependencies: vitest: 1.6.1(@types/node@20.17.19) + vitest: 1.6.1(@types/node@20.17.19) transitivePeerDependencies: - supports-color - typescript @@ -13574,6 +13654,7 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -13822,7 +13903,7 @@ snapshots: fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.0 fastembed@1.14.1: dependencies: @@ -13926,8 +14007,9 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: + motion-dom: 12.4.5 motion-dom: 12.4.5 motion-utils: 12.0.0 tslib: 2.8.1 @@ -14578,16 +14660,20 @@ snapshots: - supports-color - ts-node + jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14597,16 +14683,20 @@ snapshots: - supports-color - ts-node + jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14647,6 +14737,7 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 @@ -14674,10 +14765,12 @@ snapshots: optionalDependencies: '@types/node': 20.17.19 ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 @@ -14705,10 +14798,12 @@ snapshots: optionalDependencies: '@types/node': 20.17.19 ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 @@ -14740,6 +14835,38 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.9 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.9) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.13.4 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 @@ -14998,24 +15125,30 @@ snapshots: - supports-color - ts-node + jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15171,7 +15304,7 @@ snapshots: uuid: 10.0.0 yaml: 2.7.0 zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: axios: 1.7.9 handlebars: 4.7.8 @@ -15194,7 +15327,7 @@ snapshots: uuid: 10.0.0 yaml: 2.7.0 zod: 3.23.8 - zod-to-json-schema: 3.24.1(zod@3.23.8) + zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: axios: 1.7.9 handlebars: 4.7.8 @@ -15444,6 +15577,7 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 + motion-dom@12.4.5: motion-dom@12.4.5: dependencies: motion-utils: 12.0.0 @@ -15668,7 +15802,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.85.2(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): + openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): dependencies: '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 @@ -15683,7 +15817,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.85.2(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): + openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): dependencies: '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 @@ -15953,36 +16087,46 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-import@15.1.0(postcss@8.5.3): postcss-import@15.1.0(postcss@8.5.3): dependencies: + postcss: 8.5.3 postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 + postcss-js@4.0.1(postcss@8.5.3): postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 postcss: 8.5.3 + postcss: 8.5.3 + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: + postcss: 8.5.3 postcss: 8.5.3 ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3) + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.3 + postcss: 8.5.3 yaml: 2.7.0 + postcss-nested@6.2.0(postcss@8.5.3): postcss-nested@6.2.0(postcss@8.5.3): dependencies: + postcss: 8.5.3 postcss: 8.5.3 postcss-selector-parser: 6.1.2 @@ -15993,6 +16137,7 @@ snapshots: postcss-value-parser@4.2.0: {} + postcss@8.5.3: postcss@8.5.3: dependencies: nanoid: 3.3.8 @@ -16734,7 +16879,7 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@1.0.5: {} + strnum@1.1.0: {} sucrase@3.35.0: dependencies: @@ -16855,6 +17000,11 @@ snapshots: postcss-js: 4.0.1(postcss@8.5.3) postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -16931,6 +17081,7 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.12: tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) @@ -16994,7 +17145,7 @@ snapshots: node-mocks-http: 1.16.2(@types/express@5.0.0)(@types/node@20.17.19) openapi-types: 12.1.3 zod: 3.22.4 - zod-to-json-schema: 3.24.1(zod@3.22.4) + zod-to-json-schema: 3.24.2(zod@3.22.4) transitivePeerDependencies: - '@types/express' - '@types/node' @@ -17009,16 +17160,20 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): dependencies: ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17033,12 +17188,14 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17052,13 +17209,16 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 + esbuild: 0.24.2 + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17072,6 +17232,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 + esbuild: 0.24.2 ts-mixer@6.0.4: {} @@ -17115,6 +17276,7 @@ snapshots: optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true + optional: true ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3): dependencies: @@ -17157,6 +17319,26 @@ snapshots: optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) + ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.4 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.18(@swc/helpers@0.5.15) + tsconfck@3.1.5(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 @@ -17172,6 +17354,7 @@ snapshots: tslib@2.8.1: {} + tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) @@ -17183,16 +17366,19 @@ snapshots: joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 tinyglobby: 0.2.12 + tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) postcss: 8.5.3 + postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -17527,6 +17713,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.3 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 20.17.19 @@ -17536,6 +17723,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.3 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.4 @@ -17545,6 +17733,7 @@ snapshots: dependencies: esbuild: 0.24.2 postcss: 8.5.3 + postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.4 @@ -17876,11 +18065,11 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.24.1(zod@3.22.4): + zod-to-json-schema@3.24.2(zod@3.22.4): dependencies: zod: 3.22.4 - zod-to-json-schema@3.24.1(zod@3.23.8): + zod-to-json-schema@3.24.2(zod@3.23.8): dependencies: zod: 3.23.8 From 3c67dfff4f966bf21b084cb0c0c373b2343de621 Mon Sep 17 00:00:00 2001 From: mihai169 <42907887+mihai169@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:00:48 +0200 Subject: [PATCH 06/22] docs: Update PROSPER token README.md (#43) * Update README.md * Add files via upload * Update Prosper token README.md Added image from staking website. * Update PROSPER token README.md described option for RSP holders to get PROSPER thotugh staking RSP/ETH --- docs/prosper/_assets/Staking.png | Bin 0 -> 334215 bytes docs/prosper/token/README.md | 26 +++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 docs/prosper/_assets/Staking.png diff --git a/docs/prosper/_assets/Staking.png b/docs/prosper/_assets/Staking.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e7dcc8bb315aff03515962ad6af433cbd641e3 GIT binary patch literal 334215 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%0AaiB@pVf=3x#15*C{P3*B^DO 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 literal 0 HcmV?d00001 diff --git a/docs/prosper/token/README.md b/docs/prosper/token/README.md index 3d38f4388..ef40cfba3 100644 --- a/docs/prosper/token/README.md +++ b/docs/prosper/token/README.md @@ -1,3 +1,27 @@ # Token -prosper is working on creating content for this page. please come back soon. \ No newline at end of file +$PROSPER token is now available with exciting rewards. + +Contract Addresses:0x8Ff64D734C614fEd508F6673CE65717Cc1d8B6c8 + +## Where can I get $PROSPER ? + +You can get $PROSPER from: + +Uniswap LP: https://app.uniswap.org/explore/pools/base/0x75CBCa884c3cca9802a63D805c8b0f1C7110Ded7 + +Radium LP: https://raydium.io/swap/?inputMint=sol&outputMint=7PJRUcofFytiF8jDpdgE9zonLxyyC7P7qMK7eL7k2yd1 + +If you are an RSP holder you can also get PROSPER tokens by staking RSP/ETH at https://www.stakeprosper.com + +## Staking Prosper with high APR + + +image + + +You can now stake your $PROSPER tokens at https://www.stakeprosper.com and get an amazing APR if you hurry up! + + + + From dfcf3b9a4ac79ba296cff074f7e282022cd943b1 Mon Sep 17 00:00:00 2001 From: Tim <70578108+TimKozak@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:01:13 +0200 Subject: [PATCH 07/22] docs: Link to Prosper website from main RS website (#42) Link to Prosper website from main RS website --- docs/agents/_coverpage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/agents/_coverpage.md b/docs/agents/_coverpage.md index 5d3db6126..81d714b30 100644 --- a/docs/agents/_coverpage.md +++ b/docs/agents/_coverpage.md @@ -2,6 +2,6 @@ > Self-Evolving AI Agents [Get Started](README.md) -[Try Our New UI](https://agents.realityspiral.com/) +[Prosper is LAUNCHED!](https://prosperagent.realityspiral.com/#/) ![Cover Image](assets/background_hero.png) From e1315f034716a787ec10475df44d420babc492d6 Mon Sep 17 00:00:00 2001 From: Tim <70578108+TimKozak@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:01:41 +0200 Subject: [PATCH 08/22] docs: Add stakeprosper.com link in coverpage (#41) Update _coverpage.md --- docs/prosper/_coverpage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/prosper/_coverpage.md b/docs/prosper/_coverpage.md index e699b03f2..2c4b26f23 100644 --- a/docs/prosper/_coverpage.md +++ b/docs/prosper/_coverpage.md @@ -4,6 +4,6 @@ > I am Reality Spiral's Trading Agent [Get Started](README.md) -[Follow me on X](https://x.com/Prosper_spiral) +[Stake $PROSPER](https://www.stakeprosper.com/) ![Cover Image](_assets/prosper.png) From 9496d6ec864e417549dd41bb97852f6a497402d9 Mon Sep 17 00:00:00 2001 From: Snobbish Bee <125891987+snobbee@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:35:59 +0100 Subject: [PATCH 09/22] chore: fix biome errors (#45) --- clients/client-coinbase/src/utils.ts | 43 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/clients/client-coinbase/src/utils.ts b/clients/client-coinbase/src/utils.ts index f3efbe0e0..be5881a0e 100644 --- a/clients/client-coinbase/src/utils.ts +++ b/clients/client-coinbase/src/utils.ts @@ -754,12 +754,12 @@ const ABI = [ export const getContract = (address: string, signer?: Signer) => { try { const provider = new JsonRpcProvider(RPC_URL); - elizaLogger.info("Getting contract for " + address); - elizaLogger.info("Signer: " + signer); - elizaLogger.info("Provider: " + provider); + elizaLogger.info(`Getting contract for ${address}`); + elizaLogger.info(`Signer: ${signer}`); + elizaLogger.info(`Provider: ${provider}`); return new Contract(address, ABI, signer || provider); } catch (error) { - elizaLogger.error("Failed to get contract:", error); + elizaLogger.error(`Failed to get contract: ${error}`); throw error; } }; @@ -771,7 +771,7 @@ export const getTotalTokenStaked = async (token: "PROSPER" | "RSP") => { : RSP_STAKING_CONTRACT_ADDRESS, ); const totalSupply = await contract.totalSupply(); - console.log("Total Staked" + totalSupply); + elizaLogger.info(`Total Staked: ${totalSupply}`); return formatUnits(totalSupply, 18); }; @@ -792,12 +792,15 @@ export const getLPPrice = async (token: "PROSPER" | "RSP") => { cache[token].price !== null && currentTime - cache[token].timestamp < CACHE_DURATION ) { - console.log("Returning cached price for", token + " " + cache[token].price); + elizaLogger.info( + `Returning cached price for ${token}: ${cache[token].price}`, + ); return cache[token].price; } const tokenAddress = token === "PROSPER" ? PROSPER_TOKEN_ADDRESS : RSP_TOKEN_ADDRESS; + // biome-ignore lint/suspicious/noImplicitAnyLet: let response; for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { try { @@ -817,27 +820,27 @@ export const getLPPrice = async (token: "PROSPER" | "RSP") => { throw new Error("Failed to fetch token price after multiple attempts"); } - console.log("Response:" + JSON.stringify(response.data)); + elizaLogger.info(`Response: ${JSON.stringify(response.data)}`); const totalLiquidityUSD = BigInt( Math.floor( Number.parseFloat(response.data.price.totalLiquidityUSD.toString()), ), ); - console.log("Total Liquidity USD:" + totalLiquidityUSD); + elizaLogger.info(`Total Liquidity USD: ${totalLiquidityUSD}`); const contract = getContract( token === "PROSPER" ? PROSPER_STAKING_TOKEN : RSP_STAKING_TOKEN, ); let totalLPSupply = BigInt(await contract.totalSupply()); - console.log("Total Supply:" + totalLPSupply); + elizaLogger.info(`Total Supply: ${totalLPSupply}`); if (totalLPSupply === BigInt(0)) { totalLPSupply = BigInt(9999999999999999999000n); } // Calculate liquidity pool price as a floating-point number const liquidityPoolPrice = Number(totalLiquidityUSD) / Number(totalLPSupply); - console.log("Token Price:", liquidityPoolPrice); + elizaLogger.info(`Token Price: ${liquidityPoolPrice}`); // Update the cache cache[token] = { price: liquidityPoolPrice, timestamp: currentTime }; @@ -857,13 +860,13 @@ export const getTotalAmountStaked = async (token: "PROSPER" | "RSP") => { // if (totalSupply === BigInt(0)) { // totalSupply = BigInt(9999999999999999999000); // } - console.log("Total Supply: " + totalSupply); + elizaLogger.info(`Total Supply: ${totalSupply}`); // Calculate total staked USD using number arithmetic const totalStakedUSD = Number(totalSupply) * tokenPrice; - console.log("Total Staked USD" + totalStakedUSD); - console.log("Token Price " + tokenPrice); + elizaLogger.info(`Total Staked USD: ${totalStakedUSD}`); + elizaLogger.info(`Token Price: ${tokenPrice}`); return totalStakedUSD.toFixed(4); // Return as a formatted string }; @@ -984,12 +987,12 @@ export const calculateAPR = async (address: string) => { // Use a safer default value to avoid precision loss totalSupply = BigInt("9999999999999999999000"); } - console.log(`Total Supply for ${address}:`, totalSupply.toString()); + elizaLogger.info(`Total Supply for ${address}: ${totalSupply.toString()}`); // Calculate APR - console.log("Reward Per Year:" + rewardPerYear.toString()); + elizaLogger.info(`Reward Per Year: ${rewardPerYear.toString()}`); const apr = (rewardPerYear / BigInt(totalSupply)) * BigInt(100); - console.log(`APR for ${address}:`, apr.toString()); + elizaLogger.info(`APR for ${address}: ${apr.toString()}`); return apr; }; @@ -1027,6 +1030,8 @@ export function formatUSD(value: number): string { * @param {number} decimals - Number of decimal places * @returns {string} - Formatted number string */ + +// biome-ignore lint/suspicious/noExplicitAny: export function safeNumberFormat(value: any, decimals = 2) { const number = Number(value); return Number.isNaN(number) ? "0.00" : number.toFixed(decimals); @@ -1062,9 +1067,9 @@ export const fetchTokenPrice = async ( const tokenPrice = Number(response.data.usdPrice) || 0; const priceChange24h = Number(response.data["24hrPercentChange"]) || 0; const totalLiquidityUSD = Number(response.data.pairTotalLiquidityUsd) || 0; - elizaLogger.info("Token Price: " + tokenPrice); - elizaLogger.info("Price Change 24h: " + priceChange24h); - elizaLogger.info("Total Liquidity USD: " + totalLiquidityUSD); + elizaLogger.info(`Token Price: ${tokenPrice}`); + elizaLogger.info(`Price Change 24h: ${priceChange24h}`); + elizaLogger.info(`Total Liquidity USD: ${totalLiquidityUSD}`); return { current: tokenPrice, change24h: priceChange24h, From 7e381ddc80ece2e6b63340b1c90a6382efe0c65e Mon Sep 17 00:00:00 2001 From: Master X Date: Sat, 22 Feb 2025 00:03:27 +0500 Subject: [PATCH 10/22] fix: Filters, Template Manager, Dynamic chaarcters list (#38) * Filters, Template Manager, Dynamic chaarcters list * fix(tracer): fix swagger not diplaying endpoints, removed duplicated routes --------- Co-authored-by: Snobbish Bee <125891987+snobbee@users.noreply.github.com> --- clients/client-direct/package.json | 1 + clients/client-direct/src/api.ts | 660 +++++++++++++++++- clients/client-direct/src/config/swagger.ts | 11 +- .../src/controllers/templateController.ts | 33 +- .../src/controllers/tracesController.ts | 28 +- clients/client-direct/src/index.ts | 143 +++- .../src/routes/templateRoutes.ts | 188 ----- .../client-direct/src/routes/tracesRoutes.ts | 278 -------- .../client-direct/src/verifiable-log-api.ts | 3 +- package.json | 2 +- pnpm-lock.yaml | 621 +++++++++------- tsconfig.json | 3 +- .../ui/templatesManager/hooks/index.ts | 21 +- .../components/ui/templatesManager/index.tsx | 45 +- 14 files changed, 1246 insertions(+), 791 deletions(-) delete mode 100644 clients/client-direct/src/routes/templateRoutes.ts delete mode 100644 clients/client-direct/src/routes/tracesRoutes.ts diff --git a/clients/client-direct/package.json b/clients/client-direct/package.json index 869d7d747..9a4f684aa 100644 --- a/clients/client-direct/package.json +++ b/clients/client-direct/package.json @@ -38,6 +38,7 @@ }, "devDependencies": { "@types/multer": "^1.4.12", + "@types/node": "^22.13.4", "@types/pg": "^8.11.11", "tsup": "8.3.5" }, diff --git a/clients/client-direct/src/api.ts b/clients/client-direct/src/api.ts index a7a132340..c5b84762b 100644 --- a/clients/client-direct/src/api.ts +++ b/clients/client-direct/src/api.ts @@ -21,11 +21,11 @@ import type { TeeLogQuery, TeeLogService } from "@elizaos/plugin-tee-log"; import type { WebhookEvent } from "@realityspiral/client-coinbase"; import { REST, Routes } from "discord.js"; import type { DirectClient } from "."; -import { setupSwagger } from "./config/swagger.ts"; import { addTemplate, batchUpdateCharacterData, deleteTemplate, + getCharacters, getTemplates, updateTemplate, } from "./controllers/templateController"; @@ -35,6 +35,7 @@ import { getTracesByRoom, getUniqueAgentId, getUniqueRoomIdByAgent, + getUniqueRuns, } from "./controllers/tracesController.ts"; const GITHUB_REPO_URL = "https://github.com/Sifchain/realityspiral"; @@ -103,11 +104,73 @@ export function createApiRouter( }), ); + /** + * @swagger + * /webhook/coinbase/health: + * get: + * summary: Check Coinbase webhook health + * description: Returns health status of the Coinbase webhook endpoint + * responses: + * 200: + * description: Health check successful + * content: + * application/json: + * schema: + * type: object + * properties: + * status: + * type: string + * example: ok + */ router.get("/webhook/coinbase/health", (_req, res) => { elizaLogger.info("Health check received"); res.status(200).json({ status: "ok" }); }); + /** + * @swagger + * /webhook/coinbase/{agentId}: + * post: + * summary: Handle Coinbase webhook events + * description: Processes incoming Coinbase webhook events for a specific agent + * parameters: + * - in: path + * name: agentId + * required: true + * schema: + * type: string + * description: ID of the agent to handle the webhook + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - event + * - ticker + * - timestamp + * - price + * properties: + * event: + * type: string + * enum: [buy, sell] + * ticker: + * type: string + * timestamp: + * type: string + * price: + * type: number + * responses: + * 200: + * description: Webhook processed successfully + * 400: + * description: Invalid webhook payload or agent not configured + * 404: + * description: Agent not found + * 500: + * description: Internal server error + */ router.post("/webhook/coinbase/:agentId", async (req, res) => { elizaLogger.info("Webhook received for agent:", req.params.agentId); const agentId = req.params.agentId; @@ -149,14 +212,44 @@ export function createApiRouter( } }); + /** + * @swagger + * /: + * get: + * summary: Welcome message + * description: Returns a welcome message + * responses: + * 200: + * description: Welcome message + */ router.get("/", (_req, res) => { res.send("Welcome, this is the REST API!"); }); + /** + * @swagger + * /hello: + * get: + * summary: Hello World + * description: Returns a hello world message + * responses: + * 200: + * description: Hello World + */ router.get("/hello", (_req, res) => { res.json({ message: "Hello World!" }); }); + /** + * @swagger + * /version: + * get: + * summary: Get the version of the application + * description: Returns the version of the application + * responses: + * 200: + * description: Version of the application + */ router.get("/version", (_req, res) => { if (!process.env.VERSION) { res.json({ @@ -172,6 +265,37 @@ export function createApiRouter( res.json({ version, url }); }); + /** + * @swagger + * /agents: + * get: + * summary: Get all agents + * description: Returns a list of all registered agents and their basic information + * responses: + * 200: + * description: List of agents retrieved successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * agents: + * type: array + * items: + * type: object + * properties: + * id: + * type: string + * description: Agent's unique identifier + * name: + * type: string + * description: Agent's name + * clients: + * type: array + * items: + * type: string + * description: List of client types connected to the agent + */ router.get("/agents", (_req, res) => { const agentsList = Array.from(agents.values()).map((agent) => ({ id: agent.agentId, @@ -181,6 +305,16 @@ export function createApiRouter( res.json({ agents: agentsList }); }); + /** + * @swagger + * /storage: + * get: + * summary: Get all stored characters + * description: Returns a list of all stored characters + * responses: + * 200: + * description: List of stored characters + */ router.get("/storage", async (_req, res) => { try { const uploadDir = path.join(process.cwd(), "data", "characters"); @@ -191,6 +325,16 @@ export function createApiRouter( } }); + /** + * @swagger + * /agents/{agentId}: + * get: + * summary: Get an agent by ID + * description: Returns the agent with the specified ID + * responses: + * 200: + * description: Agent details + */ router.get("/agents/:agentId", (req, res) => { const { agentId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -215,6 +359,16 @@ export function createApiRouter( }); }); + /** + * @swagger + * /agents/{agentId}: + * delete: + * summary: Delete an agent by ID + * description: Deletes the agent with the specified ID + * responses: + * 204: + * description: Agent deleted successfully + */ router.delete("/agents/:agentId", async (req, res) => { const { agentId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -232,6 +386,16 @@ export function createApiRouter( } }); + /** + * @swagger + * /agents/{agentId}/set: + * post: + * summary: Set an agent by ID + * description: Sets the agent with the specified ID + * responses: + * 200: + * description: Agent set successfully + */ router.post("/agents/:agentId/set", async (req, res) => { const { agentId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -299,6 +463,16 @@ export function createApiRouter( }); }); + /** + * @swagger + * /agents/{agentId}/channels: + * get: + * summary: Get channels for an agent + * description: Returns a list of channels for the specified agent + * responses: + * 200: + * description: List of channels + */ router.get("/agents/:agentId/channels", async (req, res) => { const { agentId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -403,6 +577,16 @@ export function createApiRouter( } }; + /** + * @swagger + * /agents/{agentId}/{roomId}/memories: + * get: + * summary: Get memories for an agent in a room + * description: Returns a list of memories for the specified agent in the specified room + * responses: + * 200: + * description: List of memories + */ router.get("/agents/:agentId/:roomId/memories", async (req, res) => { const { agentId, roomId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -413,6 +597,16 @@ export function createApiRouter( await getMemories(agentId, roomId, null, req, res); }); + /** + * @swagger + * /agents/{agentId}/memories/{userId}: + * get: + * summary: Get memories for an agent in a room + * description: Returns a list of memories for the specified agent in the specified room + * responses: + * 200: + * description: List of memories + */ router.get("/agents/:agentId/memories/:userId", async (req, res) => { const { agentId, userId } = validateUUIDParams(req.params, res) ?? { agentId: null, @@ -427,6 +621,16 @@ export function createApiRouter( await getMemories(agentId, roomId, userId, req, res); }); + /** + * @swagger + * /tee/agents: + * get: + * summary: Get all TEE agents + * description: Returns a list of all TEE agents + * responses: + * 200: + * description: List of TEE agents + */ router.get("/tee/agents", async (_req, res) => { try { const allAgents = []; @@ -456,6 +660,16 @@ export function createApiRouter( } }); + /** + * @swagger + * /tee/agents/{agentId}: + * get: + * summary: Get a TEE agent by ID + * description: Returns the agent with the specified ID + * responses: + * 200: + * description: Agent details + */ router.get("/tee/agents/:agentId", async (req, res) => { try { const agentId = req.params.agentId; @@ -482,6 +696,16 @@ export function createApiRouter( } }); + /** + * @swagger + * /tee/logs: + * post: + * summary: Get logs for an agent + * description: Returns a list of logs for the specified agent + * responses: + * 200: + * description: List of logs + */ router.post( "/tee/logs", async (req: express.Request, res: express.Response) => { @@ -524,6 +748,16 @@ export function createApiRouter( }, ); + /** + * @swagger + * /agent/start: + * post: + * summary: Start an agent + * description: Starts the agent with the specified character + * responses: + * 200: + * description: Agent started successfully + */ router.post("/agent/start", async (req, res) => { const { characterPath, characterJson } = req.body; console.log("characterPath:", characterPath); @@ -556,6 +790,16 @@ export function createApiRouter( } }); + /** + * @swagger + * /agents/{agentId}/stop: + * post: + * summary: Stop an agent + * description: Stops the agent with the specified ID + * responses: + * 200: + * description: Agent stopped successfully + */ router.post("/agents/:agentId/stop", async (req, res) => { const agentId = req.params.agentId; console.log("agentId", agentId); @@ -573,43 +817,457 @@ export function createApiRouter( } }); + /** + * @swagger + * /traces: + * get: + * summary: Fetch all traces + * description: Retrieves all traces from the database. + * responses: + * 200: + * description: A JSON array of traces. + * content: + * application/json: + * schema: + * type: object + * properties: + * total_records: + * type: integer + * data: + * type: array + * items: + * type: object + * 500: + * description: Server error + */ router.get("/traces", async (req, res) => { getAllTraces(req, res); }); + /** + * @swagger + * /traces/unique-agent-ids: + * get: + * summary: Fetch all unique AgentId values + * description: Retrieves a list of all unique agentId values from the traces table. + * responses: + * 200: + * description: A JSON array of unique agentId values. + * content: + * application/json: + * schema: + * type: object + * properties: + * unique_agentId: + * type: array + * items: + * type: string + * 500: + * description: Server error + */ router.get("/traces/unique-agent-ids", async (req, res) => { getUniqueAgentId(req, res); }); + /** + * @swagger + * /traces/unique-room_id/by-agent/{agent_id}: + * get: + * summary: Fetch unique RoomId values for a specific Agent ID + * description: Retrieves a list of distinct RoomId values where the given agent_id exists in the traces table. + * parameters: + * - in: path + * name: agent_id + * required: true + * schema: + * type: string + * description: The Agent ID to filter unique room_id. + * responses: + * 200: + * description: A JSON array of unique RUN values linked to the given agent_id. + * content: + * application/json: + * schema: + * type: object + * properties: + * agent_id: + * type: string + * unique_room_id: + * type: array + * items: + * type: string + * 400: + * description: Missing or invalid Agent ID + * 500: + * description: Server error + */ router.get("/traces/unique-room_id/by-agent/:agent_id", async (req, res) => { getUniqueRoomIdByAgent(req, res); }); + /** + * @swagger + * /traces/by-room/{roomId}: + * get: + * summary: Fetch traces by ROOM ID + * description: Retrieves traces filtered by a specific ROOM ID. + * parameters: + * - in: path + * name: roomId + * required: true + * schema: + * type: string + * description: The ROOM ID to filter traces. + * - in: query + * name: name + * schema: + * type: string + * description: Filter by name field (optional). + * - in: query + * name: start_date + * schema: + * type: string + * format: date + * description: Filter by start date (YYYY-MM-DD) (optional). + * - in: query + * name: end_date + * schema: + * type: string + * format: date + * description: Filter by end date (YYYY-MM-DD) (optional). + * responses: + * 200: + * description: A JSON array of traces for the specified ROOM ID. + * content: + * application/json: + * schema: + * type: object + * properties: + * room_id: + * type: string + * total_records: + * type: integer + * data: + * type: array + * items: + * type: object + * properties: + * id: + * type: integer + * description: Unique ID of the trace. + * room_id: + * type: string + * description: UUID of the ROOM. + * start_time: + * type: string + * format: date-time + * description: Start time of the trace event (YYYY-MM-DD HH:MM:SS). + * end_time: + * type: string + * format: date-time + * description: End time of the trace event (YYYY-MM-DD HH:MM:SS). + * name: + * type: string + * description: Name of the trace event. + * data: + * type: object + * description: JSON data associated with the trace event. + * 400: + * description: Missing or invalid ROOM ID. + * 500: + * description: Server error. + */ router.get("/traces/by-room/:roomId", async (req, res) => { getTracesByRoom(req, res); }); + /** + * @swagger + * /traces/unique-runs: + * get: + * summary: Fetch all unique RUN values + * description: Retrieves a list of all unique RUN values from the traces table. + * responses: + * 200: + * description: A JSON array of unique RUN values. + * content: + * application/json: + * schema: + * type: object + * properties: + * unique_room_ids: + * type: array + * items: + * type: string + * 500: + * description: Server error + */ + router.get("/traces/unique-runs", async (req, res) => { + getUniqueRuns(req, res); + }); + + /** + * @swagger + * /traces/by-agent/{agentId}: + * get: + * summary: Fetch traces by Agent ID + * description: Retrieves traces filtered by a specific Agent ID with optional filters. + * parameters: + * - in: path + * name: agentId + * required: true + * schema: + * type: string + * description: The Agent ID to filter traces. + * - in: query + * name: name + * schema: + * type: string + * description: Filter by trace name (optional). + * - in: query + * name: start_date + * schema: + * type: string + * format: date + * description: Filter by start date (YYYY-MM-DD) (optional). + * - in: query + * name: end_date + * schema: + * type: string + * format: date + * description: Filter by end date (YYYY-MM-DD) (optional). + * responses: + * 200: + * description: A JSON array of traces for the specified Agent ID. + * content: + * application/json: + * schema: + * type: object + * properties: + * agent_id: + * type: string + * description: The Agent ID used for filtering. + * total_records: + * type: integer + * description: Total number of matching records. + * data: + * type: array + * items: + * type: object + * properties: + * id: + * type: integer + * description: Unique ID of the trace. + * run: + * type: string + * description: UUID of the RUN. + * time: + * type: string + * format: date-time + * description: Timestamp of the trace event. + * name: + * type: string + * description: Name of the trace event. + * data: + * type: object + * description: JSON data associated with the trace event. + * agentId: + * type: string + * nullable: true + * description: The agent ID associated with the trace. + * roomId: + * type: string + * nullable: true + * description: The room ID associated with the trace (optional). + * 400: + * description: Missing or invalid Agent ID. + * 500: + * description: Server error. + */ router.get("/traces/by-agent/:agentId", async (req, res) => { getTracesByAgentId(req, res); }); + /** + * @swagger + * /templates/characters: + * get: + * summary: Fetch all characters + * description: Retrieves a list of all characters. + */ + router.get("/templates/characters", async (req, res) => { + getCharacters(req, res); + }); + + /** + * @swagger + * /templates/{characterName}: + * get: + * summary: Get all prompt templates for a character + * description: Retrieves all saved prompt templates for the specified character. + * parameters: + * - in: path + * name: characterName + * required: true + * schema: + * type: string + * description: The name of the character. + * responses: + * 200: + * description: Returns a list of all templates. + * 404: + * description: Character not found. + */ router.get("/templates/:characterName", async (req, res) => { console.log("get template called with request", req); getTemplates(req, res); }); + /** + * @swagger + * /templates/{characterName}: + * post: + * summary: Add a new prompt template + * description: Creates a new prompt template and stores it in the character's JSON file. + * parameters: + * - in: path + * name: characterName + * required: true + * schema: + * type: string + * description: The name of the character. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * templateName: + * type: string + * content: + * type: string + * responses: + * 201: + * description: Template added successfully. + * 400: + * description: Invalid request body. + * 404: + * description: Character not found. + */ router.post("/templates/:characterName", async (req, res) => { addTemplate(req, res); }); + /** + * @swagger + * /templates/{characterName}: + * put: + * summary: Update an existing template + * description: Modifies an existing template in the character JSON file. + * parameters: + * - in: path + * name: characterName + * required: true + * schema: + * type: string + * description: The name of the character. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * templateName: + * type: string + * content: + * type: string + * responses: + * 200: + * description: Template updated successfully. + * 404: + * description: Template or character not found. + */ router.put("/templates/:characterName", async (req, res) => { updateTemplate(req, res); }); + /** + * @swagger + * /templates/{characterName}/{templateName}: + * delete: + * summary: Delete a template + * description: Removes a prompt template from the character's JSON file. + * parameters: + * - in: path + * name: characterName + * required: true + * schema: + * type: string + * description: The name of the character. + * - in: path + * name: templateName + * required: true + * schema: + * type: string + * description: The name of the template to delete. + * responses: + * 200: + * description: Template deleted successfully. + * 404: + * description: Template or character not found. + */ router.delete("/templates/:characterName/:templateName", async (req, res) => { deleteTemplate(req, res); }); + /** + * @swagger + * /templates/{characterName}/batch-update: + * post: + * summary: Batch update character data + * description: Updates templates, lore, bio, and knowledge in a single API call. + * parameters: + * - in: path + * name: characterName + * required: true + * schema: + * type: string + * description: The name of the character. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * templates: + * type: object + * description: Templates to add or update. + * lore: + * type: array + * items: + * type: string + * description: Lore entries to append. + * bio: + * type: array + * items: + * type: string + * description: Bio entries to append. + * knowledge: + * type: array + * items: + * type: string + * description: Knowledge entries to append. + * responses: + * 200: + * description: Character data updated successfully. + * 400: + * description: No valid updates provided. + * 404: + * description: Character not found. + */ router.post("/templates/:characterName/batch-update", async (req, res) => { batchUpdateCharacterData(req, res); }); diff --git a/clients/client-direct/src/config/swagger.ts b/clients/client-direct/src/config/swagger.ts index 908d2e7f6..d101166f1 100644 --- a/clients/client-direct/src/config/swagger.ts +++ b/clients/client-direct/src/config/swagger.ts @@ -1,7 +1,9 @@ -import { Express, type Router } from "express"; +import type { Application } from "express"; import swaggerJSDoc from "swagger-jsdoc"; import swaggerUi from "swagger-ui-express"; +const filesPath = new URL("../", import.meta.url).pathname; + const options: swaggerJSDoc.Options = { definition: { openapi: "3.0.0", @@ -16,12 +18,11 @@ const options: swaggerJSDoc.Options = { }, ], }, - apis: ["**/*.ts"], // Path to API routes - // Make sure these paths are correct + apis: [`${filesPath}**/*.ts`], // Path to API routes }; const swaggerSpec = swaggerJSDoc(options); -export const setupSwagger = (router: Router) => { - router.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); +export const setupSwagger = (app: Application) => { + app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); }; diff --git a/clients/client-direct/src/controllers/templateController.ts b/clients/client-direct/src/controllers/templateController.ts index 5cc2582a7..584d5a856 100644 --- a/clients/client-direct/src/controllers/templateController.ts +++ b/clients/client-direct/src/controllers/templateController.ts @@ -1,18 +1,37 @@ import fs from "node:fs"; import path from "node:path"; +import { fileURLToPath } from "node:url"; import type { Request, Response } from "express"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); // Function to get dynamic character file path based on request parameter +const charactersDir = path.join(__dirname, "../../../characters"); + +// Function to get a dynamic character file path const getCharacterFilePath = (characterName: string) => { - const filePath = path.join( - __dirname, - "../../../characters", - `${characterName}.character.json`, - ); - console.log("Resolved File Path:", filePath); - return filePath; + return path.join(charactersDir, `${characterName}.character.json`); +}; + +// Function to get available characters dynamically +export const getCharacters = (_req: Request, res: Response) => { + fs.readdir(charactersDir, (err, files) => { + if (err) { + return res + .status(500) + .json({ error: "Failed to read characters directory" }); + } + + const characterNames = files + .filter((file) => file.endsWith(".character.json")) + .map((file) => file.replace(".character.json", "")); // Remove extension + + res.json({ characters: characterNames }); + }); }; +// Register the route + // Function to read character JSON file const readCharacterFile = (characterName: string) => { try { diff --git a/clients/client-direct/src/controllers/tracesController.ts b/clients/client-direct/src/controllers/tracesController.ts index 431ffe906..d7696108f 100644 --- a/clients/client-direct/src/controllers/tracesController.ts +++ b/clients/client-direct/src/controllers/tracesController.ts @@ -119,9 +119,31 @@ export const getTracesByRoom = async (req: Request, res: Response) => { return res.status(400).json({ message: "Missing or invalid ROOM ID" }); } - const result = await pool.query("SELECT * FROM traces WHERE room_id = $1", [ - roomId, - ]); + const { name, start_date, end_date } = req.query; + + let query = "SELECT * FROM traces WHERE room_id = $1"; + // biome-ignore lint/suspicious/noExplicitAny: + const queryParams: any[] = [roomId]; + + let paramIndex = 2; // Next index for query placeholders ($2, $3, ...) + + // Optional Filters + if (name) { + query += ` AND name ILIKE $${paramIndex}`; + queryParams.push(`%${name}%`); + paramIndex++; + } + + if (start_date && end_date) { + query += ` AND DATE(start_time) >= $${paramIndex} AND DATE(end_time) <= $${paramIndex + 1}`; + queryParams.push(start_date, end_date); + paramIndex += 2; + } + + // Order results by `start_time` + query += " ORDER BY start_time DESC"; + + const result = await pool.query(query, queryParams); res.status(200).json({ room_id: roomId, diff --git a/clients/client-direct/src/index.ts b/clients/client-direct/src/index.ts index a37518d71..eed98109f 100644 --- a/clients/client-direct/src/index.ts +++ b/clients/client-direct/src/index.ts @@ -43,8 +43,6 @@ const storage = multer.diskStorage({ cb(null, `${uniqueSuffix}-${file.originalname}`); }, }); -import templateRoutes from "./routes/templateRoutes"; -import tracesRoutes from "./routes/tracesRoutes"; // some people have more memory than disk.io const upload = multer({ storage /*: multer.memoryStorage() */ }); @@ -145,9 +143,6 @@ export class DirectClient { const apiRouter = createApiRouter(this.agents, this); this.app.use(apiRouter); - this.app.use("/api/templates", templateRoutes); - - this.app.use("/api/traces", tracesRoutes); setupSwagger(this.app); const apiLogRouter = createVerifiableLogApiRouter(this.agents); @@ -199,6 +194,62 @@ export class DirectClient { }, ); + /** + * @swagger + * /{agentId}/message: + * post: + * summary: Send a message to an agent + * description: Send a message to a specific agent and get their response + * parameters: + * - in: path + * name: agentId + * required: true + * schema: + * type: string + * description: ID of the agent to message + * requestBody: + * required: true + * content: + * multipart/form-data: + * schema: + * type: object + * properties: + * text: + * type: string + * description: Message text to send + * roomId: + * type: string + * description: Optional room ID for the conversation + * userId: + * type: string + * description: Optional user ID for the sender + * file: + * type: string + * format: binary + * description: Optional file attachment + * responses: + * 200: + * description: Message processed successfully + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * text: + * type: string + * action: + * type: string + * attachments: + * type: array + * items: + * type: object + * 404: + * description: Agent not found + * 500: + * description: Server error + */ this.app.post( "/:agentId/message", upload.single("file"), @@ -710,6 +761,50 @@ export class DirectClient { }, ); + /** + * @swagger + * /{agentId}/speak: + * post: + * summary: Convert agent's response to speech + * description: Send a message to an agent and receive an audio response + * parameters: + * - in: path + * name: agentId + * required: true + * schema: + * type: string + * description: ID of the agent + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - text + * properties: + * text: + * type: string + * description: Text to convert to speech + * roomId: + * type: string + * userId: + * type: string + * responses: + * 200: + * description: Audio response + * content: + * audio/mpeg: + * schema: + * type: string + * format: binary + * 400: + * description: No text provided + * 404: + * description: Agent not found + * 500: + * description: Server error or ElevenLabs API error + */ this.app.post("/:agentId/speak", async (req, res) => { const agentId = req.params.agentId; const roomId = stringToUuid(req.body.roomId ?? `default-room-${agentId}`); @@ -874,6 +969,44 @@ export class DirectClient { } }); + /** + * @swagger + * /{agentId}/tts: + * post: + * summary: Text-to-speech conversion + * description: Convert text to speech using ElevenLabs API + * parameters: + * - in: path + * name: agentId + * required: true + * schema: + * type: string + * description: ID of the agent + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - text + * properties: + * text: + * type: string + * description: Text to convert to speech + * responses: + * 200: + * description: Audio response + * content: + * audio/mpeg: + * schema: + * type: string + * format: binary + * 400: + * description: No text provided + * 500: + * description: ElevenLabs API error + */ this.app.post("/:agentId/tts", async (req, res) => { const text = req.body.text; diff --git a/clients/client-direct/src/routes/templateRoutes.ts b/clients/client-direct/src/routes/templateRoutes.ts deleted file mode 100644 index 4f586d063..000000000 --- a/clients/client-direct/src/routes/templateRoutes.ts +++ /dev/null @@ -1,188 +0,0 @@ -import express, { type Router } from "express"; -import { - addTemplate, - batchUpdateCharacterData, - deleteTemplate, - getTemplates, - updateTemplate, -} from "../controllers/templateController"; - -const router: Router = express.Router(); - -/** ========================== Templates API ========================== **/ - -/** - * @swagger - * /api/templates/{characterName}: - * get: - * summary: Get all prompt templates for a character - * description: Retrieves all saved prompt templates for the specified character. - * parameters: - * - in: path - * name: characterName - * required: true - * schema: - * type: string - * description: The name of the character. - * responses: - * 200: - * description: Returns a list of all templates. - * 404: - * description: Character not found. - */ -router.post("/:characterName", async (req, res) => { - getTemplates(req, res); -}); - -/** - * @swagger - * /api/templates/{characterName}: - * post: - * summary: Add a new prompt template - * description: Creates a new prompt template and stores it in the character's JSON file. - * parameters: - * - in: path - * name: characterName - * required: true - * schema: - * type: string - * description: The name of the character. - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * templateName: - * type: string - * content: - * type: string - * responses: - * 201: - * description: Template added successfully. - * 400: - * description: Invalid request body. - * 404: - * description: Character not found. - */ -router.post("/:characterName", async (req, res) => { - addTemplate(req, res); -}); - -/** - * @swagger - * /api/templates/{characterName}: - * put: - * summary: Update an existing template - * description: Modifies an existing template in the character JSON file. - * parameters: - * - in: path - * name: characterName - * required: true - * schema: - * type: string - * description: The name of the character. - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * templateName: - * type: string - * content: - * type: string - * responses: - * 200: - * description: Template updated successfully. - * 404: - * description: Template or character not found. - */ -router.post("/:characterName", async (req, res) => { - updateTemplate(req, res); -}); - -/** - * @swagger - * /api/templates/{characterName}/{templateName}: - * delete: - * summary: Delete a template - * description: Removes a prompt template from the character's JSON file. - * parameters: - * - in: path - * name: characterName - * required: true - * schema: - * type: string - * description: The name of the character. - * - in: path - * name: templateName - * required: true - * schema: - * type: string - * description: The name of the template to delete. - * responses: - * 200: - * description: Template deleted successfully. - * 404: - * description: Template or character not found. - */ -router.post("/:characterName/:templateName", async (req, res) => { - deleteTemplate(req, res); -}); - -/** ========================== Batch Update API ========================== **/ - -/** - * @swagger - * /api/templates/{characterName}/batch-update: - * put: - * summary: Batch update character data - * description: Updates templates, lore, bio, and knowledge in a single API call. - * parameters: - * - in: path - * name: characterName - * required: true - * schema: - * type: string - * description: The name of the character. - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * templates: - * type: object - * description: Templates to add or update. - * lore: - * type: array - * items: - * type: string - * description: Lore entries to append. - * bio: - * type: array - * items: - * type: string - * description: Bio entries to append. - * knowledge: - * type: array - * items: - * type: string - * description: Knowledge entries to append. - * responses: - * 200: - * description: Character data updated successfully. - * 400: - * description: No valid updates provided. - * 404: - * description: Character not found. - */ -router.post("/:characterName/batch-update", async (req, res) => { - batchUpdateCharacterData(req, res); -}); - -export default router; diff --git a/clients/client-direct/src/routes/tracesRoutes.ts b/clients/client-direct/src/routes/tracesRoutes.ts deleted file mode 100644 index bc612cea6..000000000 --- a/clients/client-direct/src/routes/tracesRoutes.ts +++ /dev/null @@ -1,278 +0,0 @@ -import express, { type Router } from "express"; -import { - getAllTraces, - getTracesByAgentId, - getTracesByRoom, - getUniqueAgentId, - getUniqueRoomIdByAgent, - getUniqueRuns, -} from "../controllers/tracesController"; - -const router: Router = express.Router(); - -/** - * @swagger - * /api/traces: - * get: - * summary: Fetch all traces - * description: Retrieves all traces from the database. - * responses: - * 200: - * description: A JSON array of traces. - * content: - * application/json: - * schema: - * type: object - * properties: - * total_records: - * type: integer - * data: - * type: array - * items: - * type: object - * 500: - * description: Server error - */ -router.get("/", getAllTraces); - -/** - * @swagger - * /api/traces/unique-agent-ids: - * get: - * summary: Fetch all unique AgentId values - * description: Retrieves a list of all unique agentId values from the traces table. - * responses: - * 200: - * description: A JSON array of unique agentId values. - * content: - * application/json: - * schema: - * type: object - * properties: - * unique_agentId: - * type: array - * items: - * type: string - * 500: - * description: Server error - */ -router.get("/unique-agent-ids", getUniqueAgentId); - -/** - * @swagger - * /api/traces/unique-room_id/by-agent/{agent_id}: - * get: - * summary: Fetch unique RoomId values for a specific Agent ID - * description: Retrieves a list of distinct RoomId values where the given agent_id exists in the traces table. - * parameters: - * - in: path - * name: agent_id - * required: true - * schema: - * type: string - * description: The Agent ID to filter unique room_id. - * responses: - * 200: - * description: A JSON array of unique RUN values linked to the given agent_id. - * content: - * application/json: - * schema: - * type: object - * properties: - * agent_id: - * type: string - * unique_room_id: - * type: array - * items: - * type: string - * 400: - * description: Missing or invalid Agent ID - * 500: - * description: Server error - */ -router.post("/unique-room_id/by-agent/:agent_id", async (req, res) => { - getUniqueRoomIdByAgent(req, res); -}); - -/** - * @swagger - * /api/traces/by-room/{roomId}: - * get: - * summary: Fetch traces by ROOM ID - * description: Retrieves traces filtered by a specific ROOM ID. - * parameters: - * - in: path - * name: roomId - * required: true - * schema: - * type: string - * description: The ROOM ID to filter traces. - * - in: query - * name: name - * schema: - * type: string - * description: Filter by name field (optional). - * - in: query - * name: start_date - * schema: - * type: string - * format: date - * description: Filter by start date (YYYY-MM-DD) (optional). - * - in: query - * name: end_date - * schema: - * type: string - * format: date - * description: Filter by end date (YYYY-MM-DD) (optional). - * responses: - * 200: - * description: A JSON array of traces for the specified ROOM ID. - * content: - * application/json: - * schema: - * type: object - * properties: - * room_id: - * type: string - * total_records: - * type: integer - * data: - * type: array - * items: - * type: object - * properties: - * id: - * type: integer - * description: Unique ID of the trace. - * room_id: - * type: string - * description: UUID of the ROOM. - * start_time: - * type: string - * format: date-time - * description: Start time of the trace event (YYYY-MM-DD HH:MM:SS). - * end_time: - * type: string - * format: date-time - * description: End time of the trace event (YYYY-MM-DD HH:MM:SS). - * name: - * type: string - * description: Name of the trace event. - * data: - * type: object - * description: JSON data associated with the trace event. - * 400: - * description: Missing or invalid ROOM ID. - * 500: - * description: Server error. - */ -router.post("/by-room/:roomId", async (req, res) => { - getTracesByRoom(req, res); -}); - -/** - * @swagger - * /api/traces/unique-runs: - * get: - * summary: Fetch all unique RUN values - * description: Retrieves a list of all unique RUN values from the traces table. - * responses: - * 200: - * description: A JSON array of unique RUN values. - * content: - * application/json: - * schema: - * type: object - * properties: - * unique_room_ids: - * type: array - * items: - * type: string - * 500: - * description: Server error - */ -router.get("/unique-runs", getUniqueRuns); - -/** - * @swagger - * /api/traces/by-agent/{agentId}: - * get: - * summary: Fetch traces by Agent ID - * description: Retrieves traces filtered by a specific Agent ID with optional filters. - * parameters: - * - in: path - * name: agentId - * required: true - * schema: - * type: string - * description: The Agent ID to filter traces. - * - in: query - * name: name - * schema: - * type: string - * description: Filter by trace name (optional). - * - in: query - * name: start_date - * schema: - * type: string - * format: date - * description: Filter by start date (YYYY-MM-DD) (optional). - * - in: query - * name: end_date - * schema: - * type: string - * format: date - * description: Filter by end date (YYYY-MM-DD) (optional). - * responses: - * 200: - * description: A JSON array of traces for the specified Agent ID. - * content: - * application/json: - * schema: - * type: object - * properties: - * agent_id: - * type: string - * description: The Agent ID used for filtering. - * total_records: - * type: integer - * description: Total number of matching records. - * data: - * type: array - * items: - * type: object - * properties: - * id: - * type: integer - * description: Unique ID of the trace. - * run: - * type: string - * description: UUID of the RUN. - * time: - * type: string - * format: date-time - * description: Timestamp of the trace event. - * name: - * type: string - * description: Name of the trace event. - * data: - * type: object - * description: JSON data associated with the trace event. - * agentId: - * type: string - * nullable: true - * description: The agent ID associated with the trace. - * roomId: - * type: string - * nullable: true - * description: The room ID associated with the trace (optional). - * 400: - * description: Missing or invalid Agent ID. - * 500: - * description: Server error. - */ -router.post("/by-room/:agentId", async (req, res) => { - getTracesByAgentId(req, res); -}); - -export default router; diff --git a/clients/client-direct/src/verifiable-log-api.ts b/clients/client-direct/src/verifiable-log-api.ts index 50cb3c3ed..411a1d4f4 100644 --- a/clients/client-direct/src/verifiable-log-api.ts +++ b/clients/client-direct/src/verifiable-log-api.ts @@ -8,13 +8,12 @@ import type { VerifiableLogQuery, VerifiableLogService, } from "@elizaos/plugin-tee-verifiable-log"; -import { setupSwagger } from "./config/swagger"; export function createVerifiableLogApiRouter( agents: Map, ): Router { const router = express.Router(); - setupSwagger(router); + router.use(cors()); router.use(bodyParser.json()); router.use(bodyParser.urlencoded({ extended: true })); diff --git a/package.json b/package.json index 22277c4d7..535bd211f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "zod": "3.23.8" }, "devDependencies": { - "@types/node": "^20.0.0", + "@types/node": "^20.17.19", "@types/pg": "^8.11.11", "husky": "^9.0.11", "prettier": "^3.4.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e8b0003b..8d39dd4e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,7 @@ importers: version: 1.9.4 '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) csv-parse: specifier: 5.6.0 version: 5.6.0 @@ -44,7 +43,7 @@ importers: version: 3.23.8 devDependencies: '@types/node': - specifier: ^20.0.0 + specifier: ^20.17.19 version: 20.17.19 '@types/pg': specifier: ^8.11.11 @@ -127,16 +126,13 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) - version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -149,8 +145,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-0x': specifier: workspace:* version: link:../../plugins/plugin-0x @@ -196,8 +191,7 @@ importers: version: 5.0.10 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) @@ -275,6 +269,9 @@ importers: '@types/multer': specifier: ^1.4.12 version: 1.4.12 + '@types/node': + specifier: ^22.13.4 + version: 22.13.4 '@types/pg': specifier: ^8.11.11 version: 8.11.11 @@ -287,8 +284,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/rest': specifier: 20.1.1 version: 20.1.1 @@ -326,8 +322,7 @@ importers: version: 2.1.1(@types/express@5.0.0)(@types/node@20.17.19)(encoding@0.1.13) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: specifier: 2.21.58 version: 2.21.58(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -359,8 +354,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-email': specifier: workspace:^ version: link:../plugin-email @@ -398,12 +392,10 @@ importers: dependencies: '@elizaos/adapter-postgres': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) mail-notifier: specifier: ^0.5.0 version: 0.5.0 @@ -431,16 +423,13 @@ importers: version: 6.4.17 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.17.19) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) ts-jest-mock-import-meta: specifier: ^1.2.1 - version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) - version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) + version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -453,8 +442,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/graphql': specifier: 8.2.0 version: 8.2.0 @@ -491,8 +479,7 @@ importers: version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.1) eslint-plugin-vitest: specifier: 0.5.4 - version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) - version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) + version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -502,8 +489,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) agent-twitter-client: specifier: 0.0.18 version: 0.0.18(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -523,8 +509,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@radix-ui/react-avatar': specifier: ^1.1.2 version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -785,10 +770,8 @@ packages: zod: optional: true - '@ai-sdk/provider-utils@2.1.0': - resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} - '@ai-sdk/provider-utils@2.1.0': - resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} + '@ai-sdk/provider-utils@2.1.2': + resolution: {integrity: sha512-ezpQT6kzy/2O4yyn/2YigMqynBYjZIOam3/EMNVzju+Ogj+Z+pf27c/Th78ce0A2ltgrXx6xN14sal/HHZNOOw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -812,6 +795,10 @@ packages: resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} engines: {node: '>=18'} + '@ai-sdk/provider@1.0.6': + resolution: {integrity: sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==} + engines: {node: '>=18'} + '@ai-sdk/react@0.0.70': resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} @@ -7227,6 +7214,7 @@ packages: strnum@1.1.0: resolution: {integrity: sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==} + deprecated: This version introduces bugs sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -8210,10 +8198,8 @@ snapshots: '@ai-sdk/amazon-bedrock@1.1.0(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.4 - '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) - '@ai-sdk/provider': 1.0.4 - '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) + '@ai-sdk/provider': 1.0.6 + '@ai-sdk/provider-utils': 2.1.2(zod@3.23.8) '@aws-sdk/client-bedrock-runtime': 3.751.0 zod: 3.23.8 transitivePeerDependencies: @@ -8292,11 +8278,9 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': - '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': + '@ai-sdk/provider-utils@2.1.2(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.4 - '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider': 1.0.6 eventsource-parser: 3.0.0 nanoid: 3.3.8 secure-json-parse: 2.7.0 @@ -8319,6 +8303,10 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@1.0.6': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/react@0.0.70(react@19.0.0)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) @@ -9148,11 +9136,9 @@ snapshots: - bufferutil - utf-8-validate - '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@types/pg': 8.11.10 pg: 8.13.1 transitivePeerDependencies: @@ -9319,8 +9305,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9332,8 +9317,65 @@ snapshots: '@fal-ai/client': 1.2.0 '@tavily/core': 0.0.2 '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) + anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) + dotenv: 16.4.5 + fastembed: 1.14.1 + fastestsmallesttextencoderdecoder: 1.0.22 + gaxios: 6.7.1(encoding@0.1.13) + glob: 11.0.0 + handlebars: 4.7.8 + js-sha1: 0.7.0 + js-tiktoken: 1.0.15 + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ollama-ai-provider: 0.16.1(zod@3.23.8) + openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) + pino: 9.6.0 + pino-pretty: 13.0.0 + tinyld: 1.3.4 + together-ai: 0.7.0(encoding@0.1.13) + unique-names-generator: 4.7.1 + uuid: 11.0.3 + zod: 3.23.8 + transitivePeerDependencies: + - '@google-cloud/vertexai' + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cohere' + - '@langchain/core' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - aws-crt + - axios + - cheerio + - debug + - encoding + - peggy + - react + - solid-js + - sswr + - supports-color + - svelte + - typeorm + - vue + - ws + + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) + '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) + '@ai-sdk/google': 0.0.55(zod@3.23.8) + '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) + '@ai-sdk/groq': 0.0.3(zod@3.23.8) + '@ai-sdk/mistral': 1.0.9(zod@3.23.8) + '@ai-sdk/openai': 1.0.5(zod@3.23.8) + '@fal-ai/client': 1.2.0 + '@tavily/core': 0.0.2 + '@types/uuid': 10.0.0 + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) dotenv: 16.4.5 fastembed: 1.14.1 @@ -9379,8 +9421,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9402,8 +9443,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9439,8 +9479,65 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) + '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) + '@ai-sdk/google': 0.0.55(zod@3.23.8) + '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) + '@ai-sdk/groq': 0.0.3(zod@3.23.8) + '@ai-sdk/mistral': 1.0.9(zod@3.23.8) + '@ai-sdk/openai': 1.0.5(zod@3.23.8) + '@fal-ai/client': 1.2.0 + '@tavily/core': 0.0.2 + '@types/uuid': 10.0.0 + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) + anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) + dotenv: 16.4.5 + fastembed: 1.14.1 + fastestsmallesttextencoderdecoder: 1.0.22 + gaxios: 6.7.1(encoding@0.1.13) + glob: 11.0.0 + handlebars: 4.7.8 + js-sha1: 0.7.0 + js-tiktoken: 1.0.15 + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ollama-ai-provider: 0.16.1(zod@3.23.8) + openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) + pino: 9.6.0 + pino-pretty: 13.0.0 + tinyld: 1.3.4 + together-ai: 0.7.0(encoding@0.1.13) + unique-names-generator: 4.7.1 + uuid: 11.0.3 + zod: 3.23.8 + transitivePeerDependencies: + - '@google-cloud/vertexai' + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cohere' + - '@langchain/core' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - aws-crt + - axios + - cheerio + - debug + - encoding + - peggy + - react + - solid-js + - sswr + - supports-color + - svelte + - typeorm + - vue + - ws + + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9462,8 +9559,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -10137,8 +10233,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': + '@jest/core@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10152,8 +10247,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10174,8 +10268,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10189,8 +10282,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10211,8 +10303,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10226,8 +10317,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10415,6 +10505,40 @@ snapshots: transitivePeerDependencies: - openai + '@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.19 + langsmith: 0.3.10(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + transitivePeerDependencies: + - openai + + '@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.19 + langsmith: 0.3.10(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + transitivePeerDependencies: + - openai + '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) @@ -10437,11 +10561,43 @@ snapshots: - encoding - ws + '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + js-tiktoken: 1.0.15 + openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - ws + + '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + js-tiktoken: 1.0.15 + openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + transitivePeerDependencies: + - encoding + - ws + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + js-tiktoken: 1.0.15 + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + js-tiktoken: 1.0.15 + '@msgpack/msgpack@3.0.1': {} '@noble/ciphers@1.2.1': {} @@ -11686,7 +11842,7 @@ snapshots: '@types/better-sqlite3@7.6.12': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/bn.js@4.11.6': dependencies: @@ -11699,17 +11855,17 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.76 + '@types/node': 20.17.19 '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.76 + '@types/node': 20.17.19 '@types/cookie@0.6.0': {} '@types/cors@2.8.17': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/diff-match-patch@1.0.36': {} @@ -11717,14 +11873,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 18.19.76 + '@types/node': 20.17.19 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -11746,7 +11902,7 @@ snapshots: '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/graceful-fs@4.1.9': dependencies: @@ -11801,7 +11957,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 18.19.76 + '@types/node': 20.17.19 form-data: 4.0.2 '@types/node@12.12.54': {} @@ -11840,7 +11996,7 @@ snapshots: '@types/pg@8.11.11': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 pg-protocol: 1.7.1 pg-types: 4.0.2 @@ -11867,12 +12023,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.76 + '@types/node': 20.17.19 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.19.76 + '@types/node': 20.17.19 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -11888,11 +12044,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/ws@8.5.14': dependencies: - '@types/node': 22.13.4 + '@types/node': 20.17.19 '@types/yargs-parser@21.0.3': {} @@ -12988,15 +13144,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): - create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@20.17.19): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13005,15 +13159,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13481,7 +13633,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: @@ -13503,7 +13655,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.20.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13579,14 +13731,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): - eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): + eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3) eslint: 9.13.0(jiti@1.21.7) optionalDependencies: - vitest: 1.6.1(@types/node@20.17.19) - vitest: 1.6.1(@types/node@20.17.19) + vitest: 2.1.9(@types/node@20.17.19) transitivePeerDependencies: - supports-color - typescript @@ -14660,20 +14810,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): - jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@20.17.19): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@20.17.19) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14683,20 +14829,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14737,8 +14879,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14764,14 +14905,11 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14797,14 +14935,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14830,70 +14966,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - dependencies: - '@babel/core': 7.26.9 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.13.4 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - dependencies: - '@babel/core': 7.26.9 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.13.4 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15080,7 +15153,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.4 + '@types/node': 20.17.19 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15125,30 +15198,24 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): - jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest@29.7.0(@types/node@20.17.19): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@20.17.19) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): - jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15336,6 +15403,52 @@ snapshots: - openai - ws + langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) + js-tiktoken: 1.0.15 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.7.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + optionalDependencies: + axios: 1.7.9 + handlebars: 4.7.8 + transitivePeerDependencies: + - encoding + - openai + - ws + + langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) + '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) + js-tiktoken: 1.0.15 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.7.0 + zod: 3.23.8 + zod-to-json-schema: 3.24.2(zod@3.23.8) + optionalDependencies: + axios: 1.7.9 + handlebars: 4.7.8 + transitivePeerDependencies: + - encoding + - openai + - ws + langsmith@0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@types/uuid': 10.0.0 @@ -15359,6 +15472,30 @@ snapshots: optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) + langsmith@0.3.10(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.12.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + + langsmith@0.3.10(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 4.1.2 + console-table-printer: 2.12.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -17160,20 +17297,16 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): - ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): + ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)): dependencies: - ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) - ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) - jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17188,14 +17321,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) - jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17208,17 +17339,13 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) - esbuild: 0.24.2 - esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) - jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.19) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17231,8 +17358,6 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) - esbuild: 0.24.2 - esbuild: 0.24.2 ts-mixer@6.0.4: {} @@ -17275,8 +17400,6 @@ snapshots: yn: 3.1.1 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) - optional: true - optional: true ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3): dependencies: @@ -17299,46 +17422,6 @@ snapshots: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true - ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.4 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.7.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.10.18(@swc/helpers@0.5.15) - - ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.4 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.7.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.10.18(@swc/helpers@0.5.15) - tsconfck@3.1.5(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 diff --git a/tsconfig.json b/tsconfig.json index 81823c705..ba895983a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,8 @@ "noEmitOnError": false, "moduleDetection": "force", "allowArbitraryExtensions": true, - "customConditions": ["@realityspiral/source"] + "customConditions": ["@realityspiral/source"], + "types": ["node"] }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "src/**/*.d.ts", "types/**/*.test.ts"] diff --git a/ui/src/components/ui/templatesManager/hooks/index.ts b/ui/src/components/ui/templatesManager/hooks/index.ts index 07161f5ac..293c815c2 100644 --- a/ui/src/components/ui/templatesManager/hooks/index.ts +++ b/ui/src/components/ui/templatesManager/hooks/index.ts @@ -3,6 +3,7 @@ import { useState } from "react"; export const use = () => { const API_BASE_URL = `${import.meta.env.VITE_SERVER_URL}/templates`; + const [characters, setCharacters] = useState([]); const [character, setCharacter] = useState("prosper"); const [templates, setTemplates] = useState<{ [key: string]: string }>({}); const [newTemplateName, setNewTemplateName] = useState(""); @@ -10,14 +11,20 @@ export const use = () => { const [selectedTemplate, setSelectedTemplate] = useState(null); const [updatedTemplateContent, setUpdatedTemplateContent] = useState(""); + const fetchCharacters = async () => { + try { + const response = await fetch(`${API_BASE_URL}/characters`); + const data = await response.json(); + setCharacters(data.characters || []); + fetchTemplates(); + } catch (error) { + console.error("❌ Error fetching characters:", error); + } + }; + const fetchTemplates = async () => { try { - const response = await fetch(`${API_BASE_URL}/${character}`, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); + const response = await fetch(`${API_BASE_URL}/${character}`); const data = await response.json(); setTemplates(data.templates || {}); } catch (error) { @@ -116,6 +123,7 @@ export const use = () => { }; return { + fetchCharacters, fetchTemplates, addTemplate, updateTemplate, @@ -125,6 +133,7 @@ export const use = () => { newTemplateContent, character, setCharacter, + characters, selectedTemplate, setSelectedTemplate, updatedTemplateContent, diff --git a/ui/src/components/ui/templatesManager/index.tsx b/ui/src/components/ui/templatesManager/index.tsx index 566df58c4..28a190ebd 100644 --- a/ui/src/components/ui/templatesManager/index.tsx +++ b/ui/src/components/ui/templatesManager/index.tsx @@ -4,7 +4,7 @@ import { use } from "./hooks"; function TemplateManager() { const { - fetchTemplates, + fetchCharacters, addTemplate, updateTemplate, deleteTemplate, @@ -13,6 +13,7 @@ function TemplateManager() { newTemplateContent, character, setCharacter, + characters, selectedTemplate, setSelectedTemplate, updatedTemplateContent, @@ -23,7 +24,7 @@ function TemplateManager() { // biome-ignore lint/correctness/useExhaustiveDependencies: useEffect(() => { - fetchTemplates(); + fetchCharacters(); }, [character]); return ( @@ -53,27 +54,23 @@ function TemplateManager() { onChange={(e) => setCharacter(e.target.value)} className="p-3 rounded-lg text-white border border-gray-600 w-full shadow-md transition hover:bg-gray-600 focus:ring focus:ring-blue-500 appearance-none cursor-pointer" > - {[ - "c3po", - "chronis", - "cosmosHelper", - "dobby", - "eternalai", - "logging-addict", - "prosper", - "staff-engineer", - "tate", - "trump", - ].map((char) => ( - + )) + ) : ( + - ))} + )} +
@@ -124,10 +121,8 @@ function TemplateManager() { {Object.keys(templates).length > 0 ? (
    {Object.entries(templates).map(([name, content]) => ( -
    @@ -156,7 +151,7 @@ function TemplateManager() { Delete
    -
    + ))}
) : ( From 02b70abbe65fc48f59ae6bdb8684602d4f9a199e Mon Sep 17 00:00:00 2001 From: mihai169 <42907887+mihai169@users.noreply.github.com> Date: Sat, 22 Feb 2025 18:53:16 +0200 Subject: [PATCH 11/22] Update index.ts with bridging instructions (#46) --- clients/client-coinbase/src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index c3e70a2fe..8085bd187 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -851,9 +851,10 @@ const stakingLiquidityPoolingProvider = { get: async (runtime: IAgentRuntime, _message: Memory) => { return `How to stake on BASE: 1. Go to uniswap v2 (https://app.uniswap.org/positions/create/v2) and add liquidity to ${runtime.character.username.toUpperCase()} / ETH and receive the LP token - 2. Go to staking website (https://stakeprosper.com/) and stake your LP tokens and receive rewards + 2. If you need to bridge RSP accross networks: Solana and Base, go to portalbridge (https://portalbridge.com) to send and receive tokens across networks + and follow the instructions in this video (https://x.com/reality_spiral/status/1858612836102222045) + 3. Go to staking website (https://stakeprosper.com/) and stake your LP tokens and receive rewards Notes you can claim rewards whenever and there is a 7 day lockup period for unstaking. - How to pool on SOL: Go to raydium (https://raydium.io/liquidity-pools/?token=${runtime.getSetting("COINBASE_TOKEN_ADDRESS_SOL")}) and add liquidity to ${runtime.character.username.toUpperCase()} / ETH and receive rewards you can withdraw anytime`; }, }; From 56e5b27d18cb87f77a2ddd1c27d087ab016392b0 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Wed, 19 Feb 2025 20:10:17 -0800 Subject: [PATCH 12/22] only sell what you have bought --- clients/client-coinbase/src/index.ts | 61 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 8085bd187..31e154e94 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -46,41 +46,42 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; + private initialBuyAmountInCurrency: number | null; private initialBuyAmountInCurrency: number | null; - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.runtime.providers.push(baseTokenAddressProvider); - this.runtime.providers.push(solTokenAddressProvider); - this.runtime.providers.push(stakingLiquidityPoolingProvider); - this.runtime.providers.push(currentPriceProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - this.initialBuyAmountInCurrency = null; + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; + } } - } private setupWebhookEndpoint() { this.server.use(express.json()); From f235d616e4dd829f1b86c98cc1c1db9eee931cf4 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Thu, 20 Feb 2025 17:10:52 -0800 Subject: [PATCH 13/22] add trade specific pnl --- pnpm-lock.yaml | 471 ++++++++++++++----------------------------------- 1 file changed, 133 insertions(+), 338 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d39dd4e6..d71c09822 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 1.9.4 '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) csv-parse: specifier: 5.6.0 version: 5.6.0 @@ -25,7 +25,7 @@ importers: version: 16.4.5 framer-motion: specifier: ^12.4.3 - version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) pg: specifier: ^8.13.3 version: 8.13.3 @@ -126,13 +126,13 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -145,7 +145,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-0x': specifier: workspace:* version: link:../../plugins/plugin-0x @@ -191,7 +191,7 @@ importers: version: 5.0.10 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: ^10.9.1 version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) @@ -284,7 +284,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/rest': specifier: 20.1.1 version: 20.1.1 @@ -322,7 +322,7 @@ importers: version: 2.1.1(@types/express@5.0.0)(@types/node@20.17.19)(encoding@0.1.13) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: specifier: 2.21.58 version: 2.21.58(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -354,7 +354,7 @@ importers: version: 0.15.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@realityspiral/plugin-email': specifier: workspace:^ version: link:../plugin-email @@ -392,10 +392,10 @@ importers: dependencies: '@elizaos/adapter-postgres': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) mail-notifier: specifier: ^0.5.0 version: 0.5.0 @@ -423,13 +423,13 @@ importers: version: 6.4.17 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.19) + version: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) ts-jest-mock-import-meta: specifier: ^1.2.1 - version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)) + version: 1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -442,7 +442,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@octokit/graphql': specifier: 8.2.0 version: 8.2.0 @@ -479,7 +479,7 @@ importers: version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.1) eslint-plugin-vitest: specifier: 0.5.4 - version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)) + version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) @@ -489,7 +489,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) agent-twitter-client: specifier: 0.0.18 version: 0.0.18(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -509,7 +509,7 @@ importers: dependencies: '@elizaos/core': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@radix-ui/react-avatar': specifier: ^1.1.2 version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -557,7 +557,7 @@ importers: version: 1.11.13 framer-motion: specifier: ^12.4.3 - version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.0.0) @@ -770,8 +770,8 @@ packages: zod: optional: true - '@ai-sdk/provider-utils@2.1.2': - resolution: {integrity: sha512-ezpQT6kzy/2O4yyn/2YigMqynBYjZIOam3/EMNVzju+Ogj+Z+pf27c/Th78ce0A2ltgrXx6xN14sal/HHZNOOw==} + '@ai-sdk/provider-utils@2.1.0': + resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -795,10 +795,6 @@ packages: resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} engines: {node: '>=18'} - '@ai-sdk/provider@1.0.6': - resolution: {integrity: sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==} - engines: {node: '>=18'} - '@ai-sdk/react@0.0.70': resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} @@ -4922,8 +4918,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.7: - resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} + framer-motion@12.4.5: + resolution: {integrity: sha512-9+8wglyIJFeUpVg4U8Ohvoo5x7zmvRqawWXhEUThcYdwL/5A1/OkLvQo68Zz5taUE11HKG/Ex+LPaN2+fMkRdA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -8198,8 +8194,8 @@ snapshots: '@ai-sdk/amazon-bedrock@1.1.0(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.6 - '@ai-sdk/provider-utils': 2.1.2(zod@3.23.8) + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) '@aws-sdk/client-bedrock-runtime': 3.751.0 zod: 3.23.8 transitivePeerDependencies: @@ -8278,9 +8274,9 @@ snapshots: optionalDependencies: zod: 3.23.8 - '@ai-sdk/provider-utils@2.1.2(zod@3.23.8)': + '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 1.0.6 + '@ai-sdk/provider': 1.0.4 eventsource-parser: 3.0.0 nanoid: 3.3.8 secure-json-parse: 2.7.0 @@ -8303,10 +8299,6 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@1.0.6': - dependencies: - json-schema: 0.4.0 - '@ai-sdk/react@0.0.70(react@19.0.0)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) @@ -9136,9 +9128,9 @@ snapshots: - bufferutil - utf-8-validate - '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/adapter-postgres@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: - '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@types/pg': 8.11.10 pg: 8.13.1 transitivePeerDependencies: @@ -9305,7 +9297,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9317,65 +9309,7 @@ snapshots: '@fal-ai/client': 1.2.0 '@tavily/core': 0.0.2 '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) - anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) - dotenv: 16.4.5 - fastembed: 1.14.1 - fastestsmallesttextencoderdecoder: 1.0.22 - gaxios: 6.7.1(encoding@0.1.13) - glob: 11.0.0 - handlebars: 4.7.8 - js-sha1: 0.7.0 - js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ollama-ai-provider: 0.16.1(zod@3.23.8) - openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - pino: 9.6.0 - pino-pretty: 13.0.0 - tinyld: 1.3.4 - together-ai: 0.7.0(encoding@0.1.13) - unique-names-generator: 4.7.1 - uuid: 11.0.3 - zod: 3.23.8 - transitivePeerDependencies: - - '@google-cloud/vertexai' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/core' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - aws-crt - - axios - - cheerio - - debug - - encoding - - peggy - - react - - solid-js - - sswr - - supports-color - - svelte - - typeorm - - vue - - ws - - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) - '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) - '@ai-sdk/google': 0.0.55(zod@3.23.8) - '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) - '@ai-sdk/groq': 0.0.3(zod@3.23.8) - '@ai-sdk/mistral': 1.0.9(zod@3.23.8) - '@ai-sdk/openai': 1.0.5(zod@3.23.8) - '@fal-ai/client': 1.2.0 - '@tavily/core': 0.0.2 - '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(zod@3.23.8) + ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) dotenv: 16.4.5 fastembed: 1.14.1 @@ -9421,7 +9355,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9443,65 +9377,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ollama-ai-provider: 0.16.1(zod@3.23.8) - openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - pino: 9.6.0 - pino-pretty: 13.0.0 - tinyld: 1.3.4 - together-ai: 0.7.0(encoding@0.1.13) - unique-names-generator: 4.7.1 - uuid: 11.0.3 - zod: 3.23.8 - transitivePeerDependencies: - - '@google-cloud/vertexai' - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/core' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - aws-crt - - axios - - cheerio - - debug - - encoding - - peggy - - react - - solid-js - - sswr - - supports-color - - svelte - - typeorm - - vue - - ws - - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) - '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) - '@ai-sdk/google': 0.0.55(zod@3.23.8) - '@ai-sdk/google-vertex': 0.0.43(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(zod@3.23.8) - '@ai-sdk/groq': 0.0.3(zod@3.23.8) - '@ai-sdk/mistral': 1.0.9(zod@3.23.8) - '@ai-sdk/openai': 1.0.5(zod@3.23.8) - '@fal-ai/client': 1.2.0 - '@tavily/core': 0.0.2 - '@types/uuid': 10.0.0 - ai: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) - anthropic-vertex-ai: 1.0.2(encoding@0.1.13)(zod@3.23.8) - dotenv: 16.4.5 - fastembed: 1.14.1 - fastestsmallesttextencoderdecoder: 1.0.22 - gaxios: 6.7.1(encoding@0.1.13) - glob: 11.0.0 - handlebars: 4.7.8 - js-sha1: 0.7.0 - js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -9537,7 +9413,7 @@ snapshots: - vue - ws - '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@elizaos/core@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ai-sdk/amazon-bedrock': 1.1.0(zod@3.23.8) '@ai-sdk/anthropic': 0.0.56(zod@3.23.8) @@ -9559,7 +9435,7 @@ snapshots: handlebars: 4.7.8 js-sha1: 0.7.0 js-tiktoken: 1.0.15 - langchain: 0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + langchain: 0.3.6(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ollama-ai-provider: 0.16.1(zod@3.23.8) openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) pino: 9.6.0 @@ -10233,7 +10109,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10247,7 +10123,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10268,7 +10144,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10282,7 +10158,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10303,7 +10179,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10317,7 +10193,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10505,40 +10381,6 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.19 - langsmith: 0.3.10(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - transitivePeerDependencies: - - openai - - '@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.19 - langsmith: 0.3.10(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - transitivePeerDependencies: - - openai - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) @@ -10561,43 +10403,11 @@ snapshots: - encoding - ws - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - transitivePeerDependencies: - - encoding - - ws - - '@langchain/openai@0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - transitivePeerDependencies: - - encoding - - ws - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))': dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))': - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - js-tiktoken: 1.0.15 - '@msgpack/msgpack@3.0.1': {} '@noble/ciphers@1.2.1': {} @@ -13144,13 +12954,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.19): + create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13159,13 +12969,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13633,7 +13443,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: @@ -13655,7 +13465,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.20.1(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13731,12 +13541,12 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@2.1.9(@types/node@20.17.19)): + eslint-plugin-vitest@0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3) eslint: 9.13.0(jiti@1.21.7) optionalDependencies: - vitest: 2.1.9(@types/node@20.17.19) + vitest: 1.6.1(@types/node@20.17.19) transitivePeerDependencies: - supports-color - typescript @@ -14157,7 +13967,7 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: motion-dom: 12.4.5 motion-dom: 12.4.5 @@ -14810,16 +14620,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.19): + jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19) + create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14829,16 +14639,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14879,7 +14689,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14905,11 +14715,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14935,12 +14746,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14966,7 +14777,38 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.9 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.9) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.13.4 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -15198,24 +15040,24 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.17.19): + jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19) + jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)): + jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15403,52 +15245,6 @@ snapshots: - openai - ws - langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) - js-tiktoken: 1.0.15 - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.7.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - optionalDependencies: - axios: 1.7.9 - handlebars: 4.7.8 - transitivePeerDependencies: - - encoding - - openai - - ws - - langchain@0.3.6(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - '@langchain/core': 0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)) - '@langchain/openai': 0.3.17(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.40(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8))) - js-tiktoken: 1.0.15 - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - langsmith: 0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.7.0 - zod: 3.23.8 - zod-to-json-schema: 3.24.2(zod@3.23.8) - optionalDependencies: - axios: 1.7.9 - handlebars: 4.7.8 - transitivePeerDependencies: - - encoding - - openai - - ws - langsmith@0.2.15(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@types/uuid': 10.0.0 @@ -15472,30 +15268,6 @@ snapshots: optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) - langsmith@0.3.10(openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.12.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.7.1 - uuid: 10.0.0 - optionalDependencies: - openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - - langsmith@0.3.10(openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.12.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.7.1 - uuid: 10.0.0 - optionalDependencies: - openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) - language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -17297,16 +17069,16 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3)): + ts-jest-mock-import-meta@1.2.1(ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3)): dependencies: - ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3) + ts-jest: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3) - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) + jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17321,12 +17093,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.76)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@18.19.76)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@20.17.19)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17339,13 +17111,14 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) + esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(jest@29.7.0(@types/node@20.17.19))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.19) + jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17358,6 +17131,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.9) + esbuild: 0.24.2 ts-mixer@6.0.4: {} @@ -17400,6 +17174,7 @@ snapshots: yn: 3.1.1 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) + optional: true ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3): dependencies: @@ -17422,6 +17197,26 @@ snapshots: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true + ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.4 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.18(@swc/helpers@0.5.15) + tsconfck@3.1.5(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 From 834672fd24f4ece7da4eb7caefec11b98a0dad99 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 13:10:49 -0800 Subject: [PATCH 14/22] clean up --- clients/client-coinbase/src/index.ts | 61 ++-- pnpm-lock.yaml | 524 ++++++++++++--------------- 2 files changed, 257 insertions(+), 328 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 31e154e94..b47f1a266 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -46,42 +46,41 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; - private initialBuyAmountInCurrency: number | null; + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; private initialBuyAmountInCurrency: number | null; - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.runtime.providers.push(baseTokenAddressProvider); - this.runtime.providers.push(solTokenAddressProvider); - this.runtime.providers.push(stakingLiquidityPoolingProvider); - this.runtime.providers.push(currentPriceProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - this.initialBuyAmountInCurrency = null; + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; - } + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; } + } private setupWebhookEndpoint() { this.server.use(express.json()); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d71c09822..22939a4ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 16.4.5 framer-motion: specifier: ^12.4.3 - version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) pg: specifier: ^8.13.3 version: 8.13.3 @@ -53,7 +53,7 @@ importers: version: 9.1.7 prettier: specifier: ^3.4.2 - version: 3.5.1 + version: 3.5.2 turbo: specifier: ^2.4.0 version: 2.4.2 @@ -126,17 +126,16 @@ importers: version: 29.5.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + version: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)))(typescript@5.7.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + version: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-coinbase: dependencies: @@ -198,7 +197,6 @@ importers: tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -211,15 +209,12 @@ importers: '@elizaos/plugin-image-generation': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) '@elizaos/plugin-tee-log': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@elizaos/plugin-tee-verifiable-log': specifier: ^0.1.9 - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) + version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@realityspiral/client-coinbase': specifier: workspace:* version: link:../client-coinbase @@ -271,14 +266,13 @@ importers: version: 1.4.12 '@types/node': specifier: ^22.13.4 - version: 22.13.4 + version: 22.13.5 '@types/pg': specifier: ^8.11.11 version: 8.11.11 tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-github: dependencies: @@ -310,10 +304,9 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.2.1 - version: 1.6.1(@types/node@22.13.4) + version: 1.6.1(@types/node@22.13.5) plugins/plugin-0x: dependencies: @@ -342,7 +335,6 @@ importers: tsup: specifier: ^8.0.1 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^2.1.5 version: 2.1.9(@types/node@20.17.19) @@ -360,7 +352,7 @@ importers: version: link:../plugin-email '@types/jsonwebtoken': specifier: ^9.0.7 - version: 9.0.8 + version: 9.0.9 coinbase-advanced-sdk: specifier: file:../../plugins/plugin-coinbase/advanced-sdk-ts version: '@coinbase-samples/advanced-sdk-ts@file:plugins/plugin-coinbase/advanced-sdk-ts(encoding@0.1.13)' @@ -383,7 +375,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.0.0 version: 1.6.1(@types/node@20.17.19) @@ -433,7 +424,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -476,14 +466,13 @@ importers: version: 9.1.0(eslint@9.13.0(jiti@1.21.7)) eslint-plugin-prettier: specifier: 5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.1) + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.2) eslint-plugin-vitest: specifier: 0.5.4 version: 0.5.4(eslint@9.13.0(jiti@1.21.7))(typescript@5.7.3)(vitest@1.6.1(@types/node@20.17.19)) tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) plugins/plugin-twitter: dependencies: @@ -496,14 +485,13 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) devDependencies: '@biomejs/biome': specifier: 1.5.3 version: 1.5.3 vitest: specifier: ^1.0.0 - version: 1.6.1(@types/node@22.13.4) + version: 1.6.1(@types/node@22.13.5) ui: dependencies: @@ -542,7 +530,7 @@ importers: version: 9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query': specifier: ^5.63.0 - version: 5.66.8(react@19.0.0) + version: 5.66.9(react@19.0.0) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -557,7 +545,7 @@ importers: version: 1.11.13 framer-motion: specifier: ^12.4.3 - version: 12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.0.0) @@ -584,17 +572,17 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3))) vite-plugin-compression: specifier: ^0.5.1 - version: 0.5.1(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)) + version: 0.5.1(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0)) devDependencies: '@eslint/js': specifier: ^9.17.0 - version: 9.20.0 + version: 9.21.0 '@types/node': specifier: ^22.10.5 - version: 22.13.4 + version: 22.13.5 '@types/react': specifier: ^19.0.3 version: 19.0.10 @@ -606,63 +594,61 @@ importers: version: 7.5.8 '@typescript-eslint/eslint-plugin': specifier: ^8.19.1 - version: 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + version: 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) '@typescript-eslint/parser': specifier: ^8.19.1 - version: 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + version: 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.8.0(@swc/helpers@0.5.15)(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)) + version: 3.8.0(@swc/helpers@0.5.15)(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0)) autoprefixer: specifier: ^10.4.19 version: 10.4.20(postcss@8.5.3) - version: 10.4.20(postcss@8.5.3) eslint: specifier: ^9.17.0 - version: 9.20.1(jiti@1.21.7) + version: 9.21.0(jiti@1.21.7) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) + version: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-import: specifier: ^2.28.1 - version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) + version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-jsx-a11y: specifier: ^6.7.1 - version: 6.10.2(eslint@9.20.1(jiti@1.21.7)) + version: 6.10.2(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-react: specifier: ^7.33.2 - version: 7.37.4(eslint@9.20.1(jiti@1.21.7)) + version: 7.37.4(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-react-hooks: specifier: ^5.0.0 - version: 5.1.0(eslint@9.20.1(jiti@1.21.7)) + version: 5.1.0(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-react-refresh: specifier: ^0.4.16 - version: 0.4.19(eslint@9.20.1(jiti@1.21.7)) + version: 0.4.19(eslint@9.21.0(jiti@1.21.7)) globals: specifier: ^15.14.0 version: 15.15.0 postcss: specifier: ^8.4.38 version: 8.5.3 - version: 8.5.3 rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.34.8) tailwindcss: specifier: ^3.4.4 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)) typescript: specifier: ~5.6.3 version: 5.6.3 typescript-eslint: specifier: ^8.18.2 - version: 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + version: 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) vite: specifier: ^6.0.5 - version: 6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0) + version: 6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.6.3)(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)) + version: 5.1.4(typescript@5.6.3)(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0)) packages: @@ -1683,32 +1669,32 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.7.0': resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.13.0': resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.6': - resolution: {integrity: sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fal-ai/client@1.2.0': @@ -1753,8 +1739,6 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} '@humanwhocodes/retry@0.4.2': resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} @@ -1999,8 +1983,8 @@ packages: peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' - '@msgpack/msgpack@3.0.1': - resolution: {integrity: sha512-9qysoVTITLcOFIIJeXbdtUgvvY25ojUp+WWfLc0O4H4KKWeamUNAqkjS5mej/PnVDnH70llWKNa7pzv5U4TqVQ==} + '@msgpack/msgpack@3.1.0': + resolution: {integrity: sha512-igBxaq5JHWdJ0lDyKkCo00pDu+bNVuBAs/cHra6a3ndCw6vlZK9BGLuG7Fvmar/DXK2uJ25zvgcAZEl+AvLpjQ==} engines: {node: '>= 18'} '@noble/ciphers@1.2.1': @@ -3076,8 +3060,8 @@ packages: '@tanstack/query-core@5.66.4': resolution: {integrity: sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==} - '@tanstack/react-query@5.66.8': - resolution: {integrity: sha512-LqYHYArmM7ycyT1I/Txc/n6KzI8S/hBFw2SQ9Uj1GpbZ89AvZLEvetquiQEHkZ5rFEm+iVNpZ6zYjTiPmJ9N5Q==} + '@tanstack/react-query@5.66.9': + resolution: {integrity: sha512-NRI02PHJsP5y2gAuWKP+awamTIBFBSKMnO6UVzi03GTclmHHHInH5UzVgzi5tpu4+FmGfsdT7Umqegobtsp23A==} peerDependencies: react: ^18 || ^19 @@ -3188,8 +3172,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.8': - resolution: {integrity: sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==} + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} '@types/mail-notifier@0.5.2': resolution: {integrity: sha512-1xPmiWlkGz38n+9Ly7G7XFuhir6WyBzPidiCKK9yWNVJxAq+j/92NLySosKX6mdu1GB1ymJ4tZAAF98I+qEABA==} @@ -3224,8 +3208,8 @@ packages: '@types/node@20.17.19': resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} - '@types/node@22.13.4': - resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} + '@types/node@22.13.5': + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -4418,8 +4402,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.102: - resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} + electron-to-chromium@1.5.103: + resolution: {integrity: sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -4657,8 +4641,8 @@ packages: jiti: optional: true - eslint@9.20.1: - resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4918,8 +4902,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.5: - resolution: {integrity: sha512-9+8wglyIJFeUpVg4U8Ohvoo5x7zmvRqawWXhEUThcYdwL/5A1/OkLvQo68Zz5taUE11HKG/Ex+LPaN2+fMkRdA==} + framer-motion@12.4.7: + resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -4984,8 +4968,8 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: @@ -5088,8 +5072,8 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} - h3@1.15.0: - resolution: {integrity: sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==} + h3@1.15.1: + resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} @@ -5436,8 +5420,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.3: - resolution: {integrity: sha512-oSwM7q8PTHQWuZAlp995iPpPJ4Vkl7qT0ZRD+9duL9j2oBy6KcTfyxc8mEuHJYC+z/kbps80aJLkaNzTOrf/kw==} + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} engines: {node: 20 || >=22} jake@10.9.2: @@ -6025,8 +6009,6 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - motion-dom@12.4.5: - resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} motion-dom@12.4.5: resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} @@ -6202,9 +6184,6 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - ohash@1.1.4: - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} - ollama-ai-provider@0.16.1: resolution: {integrity: sha512-0vSQVz5Y/LguyzfO4bi1JrrVGF/k2JvO8/uFR0wYmqDFp8KPp4+AhdENSynGBr1oRhMWOM4F1l6cv7UNDgRMjw==} engines: {node: '>=18'} @@ -6253,8 +6232,8 @@ packages: zod: optional: true - openai@4.85.3: - resolution: {integrity: sha512-KTMXAK6FPd2IvsPtglMt0J1GyVrjMxCYzu/mVbCPabzzquSJoZlYpHtE0p0ScZPyt11XTc757xSO4j39j5g+Xw==} + openai@4.85.4: + resolution: {integrity: sha512-Nki51PBSu+Aryo7WKbdXvfm0X/iKkQS2fq3O0Uqb/O3b4exOZFid2te1BZ52bbO5UwxQZ5eeHJDCTqtrJLPw0w==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -6557,8 +6536,6 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -6611,8 +6588,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.5.1: - resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} engines: {node: '>=14'} hasBin: true @@ -7208,9 +7185,8 @@ packages: strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - strnum@1.1.0: - resolution: {integrity: sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==} - deprecated: This version introduces bugs + strnum@1.1.1: + resolution: {integrity: sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==} sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} @@ -7345,8 +7321,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} tinyglobby@0.2.12: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} @@ -9504,12 +9478,10 @@ snapshots: - vue - ws - '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9573,13 +9545,11 @@ snapshots: - vue - ws - '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-sgx': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) better-sqlite3: 11.6.0 elliptic: 6.6.1 transitivePeerDependencies: @@ -9621,19 +9591,16 @@ snapshots: - yaml - zod - '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': - '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': + '@elizaos/plugin-tee-verifiable-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) dompurify: 3.2.2 elliptic: 6.6.1 ethereum-cryptography: 3.1.0 tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) uuid: 11.0.3 - vitest: 2.1.5(@types/node@22.13.4) + vitest: 2.1.5(@types/node@22.13.5) whatwg-url: 7.1.0 transitivePeerDependencies: - '@edge-runtime/vm' @@ -9687,7 +9654,6 @@ snapshots: - yaml - zod - '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -9699,7 +9665,6 @@ snapshots: node-cache: 5.1.2 pumpdotfun-sdk: 1.3.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(rollup@4.34.8)(typescript@5.7.3)(utf-8-validate@5.0.10) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9893,9 +9858,9 @@ snapshots: eslint: 9.13.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -9916,13 +9881,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.11.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/core@0.7.0': {} - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -9938,18 +9903,18 @@ snapshots: '@eslint/js@9.13.0': {} - '@eslint/js@9.20.0': {} + '@eslint/js@9.21.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.6': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.11.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@fal-ai/client@1.2.0': dependencies: - '@msgpack/msgpack': 3.0.1 + '@msgpack/msgpack': 3.1.0 eventsource-parser: 1.1.2 robot3: 0.4.1 @@ -9990,7 +9955,6 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': @@ -10179,7 +10143,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -10193,7 +10157,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10385,7 +10349,7 @@ snapshots: dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - openai: 4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + openai: 4.85.4(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: @@ -10396,7 +10360,7 @@ snapshots: dependencies: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - openai: 4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) + openai: 4.85.4(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: @@ -10408,7 +10372,7 @@ snapshots: '@langchain/core': 0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 - '@msgpack/msgpack@3.0.1': {} + '@msgpack/msgpack@3.1.0': {} '@noble/ciphers@1.2.1': {} @@ -11601,7 +11565,7 @@ snapshots: '@tanstack/query-core@5.66.4': {} - '@tanstack/react-query@5.66.8(react@19.0.0)': + '@tanstack/react-query@5.66.9(react@19.0.0)': dependencies: '@tanstack/query-core': 5.66.4 react: 19.0.0 @@ -11652,7 +11616,7 @@ snapshots: '@types/better-sqlite3@7.6.12': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/bn.js@4.11.6': dependencies: @@ -11665,17 +11629,17 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/cookie@0.6.0': {} '@types/cors@2.8.17': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/diff-match-patch@1.0.36': {} @@ -11683,14 +11647,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -11712,7 +11676,7 @@ snapshots: '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/graceful-fs@4.1.9': dependencies: @@ -11743,7 +11707,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.8': + '@types/jsonwebtoken@9.0.9': dependencies: '@types/ms': 2.1.0 '@types/node': 20.17.19 @@ -11767,7 +11731,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 form-data: 4.0.2 '@types/node@12.12.54': {} @@ -11782,7 +11746,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.13.4': + '@types/node@22.13.5': dependencies: undici-types: 6.20.0 @@ -11806,7 +11770,7 @@ snapshots: '@types/pg@8.11.11': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 pg-protocol: 1.7.1 pg-types: 4.0.2 @@ -11833,12 +11797,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -11854,11 +11818,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/ws@8.5.14': dependencies: - '@types/node': 20.17.19 + '@types/node': 22.13.5 '@types/yargs-parser@21.0.3': {} @@ -11866,15 +11830,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -11883,14 +11847,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3)': + '@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.24.1 '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -11905,12 +11869,12 @@ snapshots: '@typescript-eslint/types': 8.24.1 '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) debug: 4.4.0 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) ts-api-utils: 2.0.1(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: @@ -11960,13 +11924,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3)': + '@typescript-eslint/utils@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.24.1 '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.6.3) - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -11986,10 +11950,10 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@vitejs/plugin-react-swc@3.8.0(@swc/helpers@0.5.15)(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0))': + '@vitejs/plugin-react-swc@3.8.0(@swc/helpers@0.5.15)(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0))': dependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) - vite: 6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0) transitivePeerDependencies: - '@swc/helpers' @@ -12013,13 +11977,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.5(vite@5.4.14(@types/node@22.13.4))': + '@vitest/mocker@2.1.5(vite@5.4.14(@types/node@22.13.5))': dependencies: '@vitest/spy': 2.1.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.14(@types/node@22.13.4) + vite: 5.4.14(@types/node@22.13.5) '@vitest/mocker@2.1.9(vite@5.4.14(@types/node@20.17.19))': dependencies: @@ -12127,7 +12091,6 @@ snapshots: estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 - postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -12360,7 +12323,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array-union@2.1.0: {} @@ -12412,7 +12375,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 assertion-error@1.1.0: {} @@ -12433,7 +12396,6 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.5.3): autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 @@ -12442,7 +12404,6 @@ snapshots: normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.3 - postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12635,7 +12596,7 @@ snapshots: browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001700 - electron-to-chromium: 1.5.102 + electron-to-chromium: 1.5.103 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -12715,13 +12676,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 call-me-maybe@1.0.2: {} @@ -12969,13 +12930,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + create-jest@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -13194,7 +13155,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.102: {} + electron-to-chromium@1.5.103: {} elliptic@6.5.4: dependencies: @@ -13261,7 +13222,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -13312,7 +13273,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -13331,7 +13292,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -13427,34 +13388,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 enhanced-resolve: 5.18.1 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) get-tsconfig: 4.10.0 is-bun-module: 1.3.0 stable-hash: 0.0.4 tinyglobby: 0.2.12 - tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)))(eslint@9.21.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) - eslint: 9.20.1(jiti@1.21.7) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -13463,9 +13423,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.20.1(jiti@1.21.7)))(eslint@9.20.1(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)))(eslint@9.21.0(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13477,13 +13437,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -13493,7 +13453,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -13502,24 +13462,24 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.1): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.7)))(eslint@9.13.0(jiti@1.21.7))(prettier@3.5.2): dependencies: eslint: 9.13.0(jiti@1.21.7) - prettier: 3.5.1 + prettier: 3.5.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@1.21.7)) - eslint-plugin-react-hooks@5.1.0(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react-refresh@0.4.19(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-react-refresh@0.4.19(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react@7.37.4(eslint@9.20.1(jiti@1.21.7)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -13527,7 +13487,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.1(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -13566,9 +13526,9 @@ snapshots: '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.7.0 - '@eslint/eslintrc': 3.2.0 + '@eslint/eslintrc': 3.3.0 '@eslint/js': 9.13.0 - '@eslint/plugin-kit': 0.2.6 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.1 @@ -13602,19 +13562,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.20.1(jiti@1.21.7): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.6 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -13863,7 +13822,7 @@ snapshots: fast-xml-parser@4.4.1: dependencies: - strnum: 1.1.0 + strnum: 1.1.1 fastembed@1.14.1: dependencies: @@ -13967,9 +13926,8 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 12.4.5 motion-dom: 12.4.5 motion-utils: 12.0.0 tslib: 2.8.1 @@ -14035,7 +13993,7 @@ snapshots: get-func-name@2.0.2: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -14065,7 +14023,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.10.0: dependencies: @@ -14093,7 +14051,7 @@ snapshots: glob@11.0.0: dependencies: foreground-child: 3.3.0 - jackspeak: 4.0.3 + jackspeak: 4.1.0 minimatch: 10.0.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 @@ -14167,7 +14125,7 @@ snapshots: - encoding - supports-color - h3@1.15.0: + h3@1.15.1: dependencies: cookie-es: 1.2.2 crossws: 0.3.4 @@ -14175,7 +14133,6 @@ snapshots: destr: 2.0.3 iron-webcrypto: 1.2.1 node-mock-http: 1.0.0 - ohash: 1.1.4 radix3: 1.1.2 ufo: 1.5.4 uncrypto: 0.1.3 @@ -14326,7 +14283,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -14368,7 +14325,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -14455,7 +14412,7 @@ snapshots: is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-wsl@2.2.0: dependencies: @@ -14529,7 +14486,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -14540,7 +14497,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.3: + jackspeak@4.1.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -14639,16 +14596,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + create-jest: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14751,7 +14708,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@20.17.19)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14777,12 +14734,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.19 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest-config@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)): dependencies: '@babel/core': 7.26.9 '@jest/test-sequencer': 29.7.0 @@ -14807,8 +14764,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.13.4 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3) + '@types/node': 22.13.5 + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -14995,7 +14952,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.19 + '@types/node': 22.13.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15052,12 +15009,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)): + jest@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest-cli: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15486,7 +15443,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 - motion-dom@12.4.5: motion-dom@12.4.5: dependencies: motion-utils: 12.0.0 @@ -15657,8 +15613,6 @@ snapshots: obuf@1.1.2: {} - ohash@1.1.4: {} - ollama-ai-provider@0.16.1(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.26 @@ -15711,7 +15665,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.85.3(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): + openai@4.85.4(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): dependencies: '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 @@ -15726,7 +15680,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.85.3(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): + openai@4.85.4(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8): dependencies: '@types/node': 18.19.76 '@types/node-fetch': 2.6.12 @@ -15758,7 +15712,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -15996,46 +15950,36 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.3 postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 postcss: 8.5.3 - postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.3 - postcss: 8.5.3 - ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.3 - postcss: 8.5.3 yaml: 2.7.0 - postcss-nested@6.2.0(postcss@8.5.3): postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.3 postcss: 8.5.3 postcss-selector-parser: 6.1.2 @@ -16046,7 +15990,6 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: postcss@8.5.3: dependencies: nanoid: 3.3.8 @@ -16096,7 +16039,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.5.1: {} + prettier@3.5.2: {} pretty-format@29.7.0: dependencies: @@ -16295,7 +16238,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -16412,7 +16355,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -16501,7 +16444,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -16570,14 +16513,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -16718,7 +16661,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -16788,7 +16731,7 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@1.1.0: {} + strnum@1.1.1: {} sucrase@3.35.0: dependencies: @@ -16884,11 +16827,11 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)) - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -16907,12 +16850,7 @@ snapshots: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) - postcss-nested: 6.2.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -16990,7 +16928,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) @@ -17049,7 +16986,7 @@ snapshots: dependencies: '@trpc/server': 10.40.0 co-body: 6.2.0 - h3: 1.15.0 + h3: 1.15.1 lodash.clonedeep: 4.5.0 node-mocks-http: 1.16.2(@types/express@5.0.0)(@types/node@20.17.19) openapi-types: 12.1.3 @@ -17113,12 +17050,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.24.2 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)))(typescript@5.7.3): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)))(typescript@5.7.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3)) + jest: 29.7.0(@types/node@22.13.5)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -17176,14 +17113,14 @@ snapshots: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true - ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.4 + '@types/node': 22.13.5 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -17197,14 +17134,14 @@ snapshots: '@swc/core': 1.10.18(@swc/helpers@0.5.15) optional: true - ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.4)(typescript@5.7.3): + ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.4 + '@types/node': 22.13.5 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -17232,7 +17169,6 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) @@ -17244,19 +17180,16 @@ snapshots: joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 tinyglobby: 0.2.12 - tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) postcss: 8.5.3 - postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -17351,12 +17284,12 @@ snapshots: typeforce@1.18.0: {} - typescript-eslint@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3): + typescript-eslint@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3))(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@1.21.7))(typescript@5.6.3) - eslint: 9.20.1(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) + '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -17513,13 +17446,13 @@ snapshots: - supports-color - terser - vite-node@1.6.1(@types/node@22.13.4): + vite-node@1.6.1(@types/node@22.13.5): dependencies: cac: 6.7.14 debug: 4.4.0 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.14(@types/node@22.13.4) + vite: 5.4.14(@types/node@22.13.5) transitivePeerDependencies: - '@types/node' - less @@ -17531,13 +17464,13 @@ snapshots: - supports-color - terser - vite-node@2.1.5(@types/node@22.13.4): + vite-node@2.1.5(@types/node@22.13.5): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@22.13.4) + vite: 5.4.14(@types/node@22.13.5) transitivePeerDependencies: - '@types/node' - less @@ -17567,22 +17500,22 @@ snapshots: - supports-color - terser - vite-plugin-compression@0.5.1(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)): + vite-plugin-compression@0.5.1(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0)): dependencies: chalk: 4.1.2 debug: 4.4.0 fs-extra: 10.1.0 - vite: 6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.6.3) optionalDependencies: - vite: 6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript @@ -17591,30 +17524,27 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 20.17.19 fsevents: 2.3.3 - vite@5.4.14(@types/node@22.13.4): + vite@5.4.14(@types/node@22.13.5): dependencies: esbuild: 0.21.5 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.5 fsevents: 2.3.3 - vite@6.1.1(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0): + vite@6.1.1(@types/node@22.13.5)(jiti@1.21.7)(yaml@2.7.0): dependencies: esbuild: 0.24.2 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.5 fsevents: 2.3.3 jiti: 1.21.7 yaml: 2.7.0 @@ -17653,7 +17583,7 @@ snapshots: - supports-color - terser - vitest@1.6.1(@types/node@22.13.4): + vitest@1.6.1(@types/node@22.13.5): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -17672,11 +17602,11 @@ snapshots: strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.14(@types/node@22.13.4) - vite-node: 1.6.1(@types/node@22.13.4) + vite: 5.4.14(@types/node@22.13.5) + vite-node: 1.6.1(@types/node@22.13.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.5 transitivePeerDependencies: - less - lightningcss @@ -17687,10 +17617,10 @@ snapshots: - supports-color - terser - vitest@2.1.5(@types/node@22.13.4): + vitest@2.1.5(@types/node@22.13.5): dependencies: '@vitest/expect': 2.1.5 - '@vitest/mocker': 2.1.5(vite@5.4.14(@types/node@22.13.4)) + '@vitest/mocker': 2.1.5(vite@5.4.14(@types/node@22.13.5)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.5 '@vitest/snapshot': 2.1.5 @@ -17706,11 +17636,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@22.13.4) - vite-node: 2.1.5(@types/node@22.13.4) + vite: 5.4.14(@types/node@22.13.5) + vite-node: 2.1.5(@types/node@22.13.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.5 transitivePeerDependencies: - less - lightningcss From 3e8fc90dea693a4afffa25f71fbc67f7d0a5b7d7 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 13:17:34 -0800 Subject: [PATCH 15/22] add wiining streak --- clients/client-coinbase/src/index.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index b47f1a266..f2ed5ed14 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -51,6 +51,7 @@ export class CoinbaseClient implements Client { private port: number; private wallets: CoinbaseWallet[]; private initialBuyAmountInCurrency: number | null; + private winningStreak: number; constructor(runtime: IAgentRuntime) { this.runtime = runtime; @@ -67,6 +68,7 @@ export class CoinbaseClient implements Client { this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; this.wallets = []; this.initialBuyAmountInCurrency = null; + this.winningStreak = 0; } async initialize(): Promise { @@ -260,7 +262,7 @@ Generate only the tweet text, no commentary or markdown.`; ) : ""; const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} ${blockExplorerBaseTxUrl(hash)}`; + const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; return finalContent.length > 280 ? `${finalContent.substring(0, 277)}...` : finalContent; @@ -330,6 +332,15 @@ Generate only the tweet text, no commentary or markdown.`; 1000, ); elizaLogger.info("pnl ", pnl); + + // Check if the PNL is positive or negative + if (Number.parseFloat(pnl) > 0) { + this.winningStreak++; + } else { + this.winningStreak = 0; + } + elizaLogger.info("winningStreak ", this.winningStreak); + elizaLogger.info("amountInCurrency ", amountInCurrency); const enoughBalance = await hasEnoughBalance( this.runtime, From 669f9b1ade656866ec5889dc452c7807a07d0f98 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 13:17:57 -0800 Subject: [PATCH 16/22] formatting --- clients/client-coinbase/src/index.ts | 797 +++++++++++++-------------- 1 file changed, 396 insertions(+), 401 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index f2ed5ed14..dda3474fc 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -46,170 +46,167 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; - private initialBuyAmountInCurrency: number | null; - private winningStreak: number; - - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.runtime.providers.push(baseTokenAddressProvider); - this.runtime.providers.push(solTokenAddressProvider); - this.runtime.providers.push(stakingLiquidityPoolingProvider); - this.runtime.providers.push(currentPriceProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - this.initialBuyAmountInCurrency = null; - this.winningStreak = 0; - } + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; + private initialBuyAmountInCurrency: number | null; + private winningStreak: number; + + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; + this.winningStreak = 0; + } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; - } + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; } + } - private setupWebhookEndpoint() { - this.server.use(express.json()); - - // Add CORS middleware to allow external requests - this.server.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST"); - res.header("Access-Control-Allow-Headers", "Content-Type"); - if (req.method === "OPTIONS") { - return res.sendStatus(200); - } - next(); - }); - - // Add webhook validation middleware - const _validateWebhook = ( - req: express.Request, - res: express.Response, - next: express.NextFunction, - ) => { - const event = req.body as WebhookEvent; - elizaLogger.info("event ", JSON.stringify(event)); - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } - next(); - }; + private setupWebhookEndpoint() { + this.server.use(express.json()); - // Add health check endpoint - this.server.get("/health", (_req, res) => { - res.status(200).json({ status: "ok" }); - }); + // Add CORS middleware to allow external requests + this.server.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "POST"); + res.header("Access-Control-Allow-Headers", "Content-Type"); + if (req.method === "OPTIONS") { + return res.sendStatus(200); + } + next(); + }); + + // Add webhook validation middleware + const _validateWebhook = ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { + const event = req.body as WebhookEvent; + elizaLogger.info("event ", JSON.stringify(event)); + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } + next(); + }; - this.server.get("/webhook/coinbase/health", (_req, res) => { - elizaLogger.info("Health check received"); - res.status(200).json({ status: "ok" }); - }); + // Add health check endpoint + this.server.get("/health", (_req, res) => { + res.status(200).json({ status: "ok" }); + }); - this.server.post("/webhook/coinbase/:agentId", async (req, res) => { - elizaLogger.info("Webhook received for agent:", req.params.agentId); - const runtime = this.runtime; + this.server.get("/webhook/coinbase/health", (_req, res) => { + elizaLogger.info("Health check received"); + res.status(200).json({ status: "ok" }); + }); - if (!runtime) { - res.status(404).json({ error: "Agent not found" }); - return; - } + this.server.post("/webhook/coinbase/:agentId", async (req, res) => { + elizaLogger.info("Webhook received for agent:", req.params.agentId); + const runtime = this.runtime; - // Validate the webhook payload - const event = req.body as WebhookEvent; - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } + if (!runtime) { + res.status(404).json({ error: "Agent not found" }); + return; + } - try { - // Forward the webhook event to the client's handleWebhookEvent method - await this.handleWebhookEvent(event); - res.status(200).json({ status: "success" }); - } catch (error) { - elizaLogger.error( - "Error processing Coinbase webhook:", - error.message, - ); - res.status(500).json({ error: "Internal Server Error" }); - } - }); + // Validate the webhook payload + const event = req.body as WebhookEvent; + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } - return new Promise((resolve, reject) => { - try { - this.server.listen(this.port, "0.0.0.0", () => { - elizaLogger.info(`Webhook server listening on port ${this.port}`); - resolve(); - }); - } catch (error) { - reject(error); - } - }); - } + try { + // Forward the webhook event to the client's handleWebhookEvent method + await this.handleWebhookEvent(event); + res.status(200).json({ status: "success" }); + } catch (error) { + elizaLogger.error("Error processing Coinbase webhook:", error.message); + res.status(500).json({ error: "Internal Server Error" }); + } + }); - private async initializeWallets() { - Coinbase.configure({ - apiKeyName: - this.runtime.getSetting("COINBASE_API_KEY") ?? - process.env.COINBASE_API_KEY, - privateKey: - this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? - process.env.COINBASE_PRIVATE_KEY, - }); - const walletTypes: WalletType[] = [ - "short_term_trading", - "long_term_trading", - "dry_powder", - "operational_capital", - ]; - const networkId = Coinbase.networks.BaseMainnet; - for (const walletType of walletTypes) { - elizaLogger.info("walletType ", walletType); - const wallet = await initializeWallet( - this.runtime, - networkId, - walletType, - ); - elizaLogger.info("Successfully loaded wallet ", wallet.wallet.getId()); - this.wallets.push(wallet); + return new Promise((resolve, reject) => { + try { + this.server.listen(this.port, "0.0.0.0", () => { + elizaLogger.info(`Webhook server listening on port ${this.port}`); + resolve(); + }); + } catch (error) { + reject(error); } + }); + } + + private async initializeWallets() { + Coinbase.configure({ + apiKeyName: + this.runtime.getSetting("COINBASE_API_KEY") ?? + process.env.COINBASE_API_KEY, + privateKey: + this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? + process.env.COINBASE_PRIVATE_KEY, + }); + const walletTypes: WalletType[] = [ + "short_term_trading", + "long_term_trading", + "dry_powder", + "operational_capital", + ]; + const networkId = Coinbase.networks.BaseMainnet; + for (const walletType of walletTypes) { + elizaLogger.info("walletType ", walletType); + const wallet = await initializeWallet( + this.runtime, + networkId, + walletType, + ); + elizaLogger.info("Successfully loaded wallet ", wallet.wallet.getId()); + this.wallets.push(wallet); } + } - private async generateMediaContent( - event: WebhookEvent, - amountInCurrency: number, - pnl: string, - formattedTimestamp: string, - state: State, - hash: string | null, - ): Promise { - try { - const tradeTweetTemplate = ` + private async generateMediaContent( + event: WebhookEvent, + amountInCurrency: number, + pnl: string, + formattedTimestamp: string, + state: State, + hash: string | null, + ): Promise { + try { + const tradeTweetTemplate = ` # Task Craft a compelling and concise tweet to announce a Coinbase trade. Aim for creativity and professionalism. @@ -229,144 +226,223 @@ Guidelines: Sample buy tweets: "📈 Added $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "🎯 Strategic ${event.ticker} buy: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Sample sell tweets: "💫 Sold ${event.ticker}: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "📊 Sold $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Generate only the tweet text, no commentary or markdown.`; - const context = composeContext({ - template: tradeTweetTemplate, - state, - }); + const context = composeContext({ + template: tradeTweetTemplate, + state, + }); - const tweetContent = await generateText({ - runtime: this.runtime, - context, - modelClass: ModelClass.LARGE, - }); - const isSellTrade = event.event.toUpperCase() === "SELL"; - const sellTradePNL = isSellTrade - ? await calculateSellTradePNL( - this.runtime, - this.initialBuyAmountInCurrency, - ) - : ""; - const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; - return finalContent.length > 280 - ? `${finalContent.substring(0, 277)}...` - : finalContent; - } catch (error) { - elizaLogger.error("Error generating tweet content:", error); - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( - 2, - )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; - return fallbackTweet; - } + const tweetContent = await generateText({ + runtime: this.runtime, + context, + modelClass: ModelClass.LARGE, + }); + const isSellTrade = event.event.toUpperCase() === "SELL"; + const sellTradePNL = isSellTrade + ? await calculateSellTradePNL( + this.runtime, + this.initialBuyAmountInCurrency, + ) + : ""; + const trimmedContent = tweetContent.trim(); + const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; + return finalContent.length > 280 + ? `${finalContent.substring(0, 277)}...` + : finalContent; + } catch (error) { + elizaLogger.error("Error generating tweet content:", error); + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( + 2, + )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; + return fallbackTweet; } + } - private async handleWebhookEvent(event: WebhookEvent) { - // for now just support ETH - if (!supportedTickers.includes(event.ticker)) { - elizaLogger.info("Unsupported ticker:", event.ticker); - return; - } - // Set up room and ensure participation - const roomId = stringToUuid("coinbase-trading"); - await this.setupRoom(roomId); + private async handleWebhookEvent(event: WebhookEvent) { + // for now just support ETH + if (!supportedTickers.includes(event.ticker)) { + elizaLogger.info("Unsupported ticker:", event.ticker); + return; + } + // Set up room and ensure participation + const roomId = stringToUuid("coinbase-trading"); + await this.setupRoom(roomId); + + // Get trading amount from settings + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + + // Create and store memory of trade + const memory = this.createTradeMemory(event, amount, roomId); + await this.runtime.messageManager.createMemory(memory); + + // Generate state and format timestamp + const state = await this.runtime.composeState(memory); + const formattedTimestamp = this.getFormattedTimestamp(); + + // Execute token swap + const buy = event.event.toUpperCase() === "BUY"; + if (buy) { + this.initialBuyAmountInCurrency = amount / Number(event.price); + } + // if sell, use the initial buy amount in currency instead of the current price + let amountInCurrency: number; + const tokenMetadata = getTokenMetadata(event.ticker); + const usdcMetadata = getTokenMetadata("USDC"); + const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found + const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found + + amountInCurrency = Math.floor( + buy + ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units + : (amount / Number(event.price)) * 10 ** tokenDecimals, // Convert to token base units + ); + if (buy) { + this.initialBuyAmountInCurrency = amountInCurrency; + } + if (this.initialBuyAmountInCurrency != null) { + amountInCurrency = this.initialBuyAmountInCurrency; + } + elizaLogger.info( + "amountInCurrency non base units ", + amount / Number(event.price), + ); + const pnl = await calculateOverallPNL( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + 1000, + ); + elizaLogger.info("pnl ", pnl); - // Get trading amount from settings - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + // Check if the PNL is positive or negative + if (Number.parseFloat(pnl) > 0) { + this.winningStreak++; + } else { + this.winningStreak = 0; + } + elizaLogger.info("winningStreak ", this.winningStreak); + + elizaLogger.info("amountInCurrency ", amountInCurrency); + const enoughBalance = await hasEnoughBalance( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + buy ? "USDC" : event.ticker, + amountInCurrency, + ); + elizaLogger.info("enoughBalance ", enoughBalance); + if (!enoughBalance) { + elizaLogger.error("Not enough balance to trade"); + return; + } + const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); + if (txHash == null) { + elizaLogger.error("txHash is null"); + return; + } + elizaLogger.info("txHash ", txHash); + console.log("buy ", buy); + console.log( + "this.initialBuyAmountInCurrency ", + this.initialBuyAmountInCurrency, + ); - // Create and store memory of trade - const memory = this.createTradeMemory(event, amount, roomId); - await this.runtime.messageManager.createMemory(memory); + // Generate and post tweet + await this.handleMediaPosting( + event, + amount, + pnl, + formattedTimestamp, + state, + txHash, + ); + } - // Generate state and format timestamp - const state = await this.runtime.composeState(memory); - const formattedTimestamp = this.getFormattedTimestamp(); + private async setupRoom(roomId: UUID) { + await this.runtime.ensureRoomExists(roomId); + await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); + } - // Execute token swap - const buy = event.event.toUpperCase() === "BUY"; - if (buy) { - this.initialBuyAmountInCurrency = amount / Number(event.price); - } - // if sell, use the initial buy amount in currency instead of the current price - let amountInCurrency: number; - const tokenMetadata = getTokenMetadata(event.ticker); - const usdcMetadata = getTokenMetadata("USDC"); - const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found - const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found - - amountInCurrency = Math.floor( - buy - ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units - : (amount / Number(event.price)) * 10 ** tokenDecimals, // Convert to token base units - ); - if (buy) { - this.initialBuyAmountInCurrency = amountInCurrency; - } - if (this.initialBuyAmountInCurrency != null) { - amountInCurrency = this.initialBuyAmountInCurrency; - } - elizaLogger.info( - "amountInCurrency non base units ", - amount / Number(event.price), - ); - const pnl = await calculateOverallPNL( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - 1000, - ); - elizaLogger.info("pnl ", pnl); + private createTradeMemory( + event: WebhookEvent, + amount: number, + roomId: UUID, + ): Memory { + return { + id: stringToUuid(`coinbase-${event.timestamp}`), + userId: this.runtime.agentId, + agentId: this.runtime.agentId, + roomId, + content: { + text: `${event.event.toUpperCase()} $${amount} worth of ${ + event.ticker + }`, + action: "SWAP", + source: "coinbase", + metadata: { + ticker: event.ticker, + side: event.event.toUpperCase(), + price: event.price, + amount: amount, + timestamp: event.timestamp, + walletType: "short_term_trading", + }, + }, + createdAt: Date.now(), + }; + } - // Check if the PNL is positive or negative - if (Number.parseFloat(pnl) > 0) { - this.winningStreak++; - } else { - this.winningStreak = 0; - } - elizaLogger.info("winningStreak ", this.winningStreak); + private getFormattedTimestamp(): string { + return new Intl.DateTimeFormat("en-US", { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(new Date()); + } - elizaLogger.info("amountInCurrency ", amountInCurrency); - const enoughBalance = await hasEnoughBalance( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - buy ? "USDC" : event.ticker, - amountInCurrency, - ); - elizaLogger.info("enoughBalance ", enoughBalance); - if (!enoughBalance) { - elizaLogger.error("Not enough balance to trade"); - return; - } - const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); - if (txHash == null) { - elizaLogger.error("txHash is null"); - return; - } - elizaLogger.info("txHash ", txHash); - console.log("buy ", buy); - console.log( - "this.initialBuyAmountInCurrency ", - this.initialBuyAmountInCurrency, - ); + private async executeTokenSwap( + event: WebhookEvent, + amount: number, + buy: boolean, + ): Promise { + return await tokenSwap( + this.runtime, + amount, + buy ? "USDC" : event.ticker, + buy ? event.ticker : "USDC", + this.runtime.getSetting("WALLET_PUBLIC_KEY"), + this.runtime.getSetting("WALLET_PRIVATE_KEY"), + "base", + ); + } - // Generate and post tweet - await this.handleMediaPosting( + private async handleMediaPosting( + event: WebhookEvent, + amount: number, + pnl: string, + formattedTimestamp: string, + state: State, + txHash: string, + ) { + let mediaContent = ""; + try { + mediaContent = await this.generateMediaContent( event, amount, pnl, @@ -374,151 +450,70 @@ Generate only the tweet text, no commentary or markdown.`; state, txHash, ); - } + elizaLogger.info("Generated media content:", mediaContent); - private async setupRoom(roomId: UUID) { - await this.runtime.ensureRoomExists(roomId); - await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); - } - - private createTradeMemory( - event: WebhookEvent, - amount: number, - roomId: UUID, - ): Memory { - return { - id: stringToUuid(`coinbase-${event.timestamp}`), - userId: this.runtime.agentId, - agentId: this.runtime.agentId, - roomId, - content: { - text: `${event.event.toUpperCase()} $${amount} worth of ${ - event.ticker - }`, - action: "SWAP", - source: "coinbase", - metadata: { - ticker: event.ticker, - side: event.event.toUpperCase(), - price: event.price, - amount: amount, - timestamp: event.timestamp, - walletType: "short_term_trading", - }, - }, - createdAt: Date.now(), - }; - } - - private getFormattedTimestamp(): string { - return new Intl.DateTimeFormat("en-US", { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - timeZoneName: "short", - }).format(new Date()); - } - - private async executeTokenSwap( - event: WebhookEvent, - amount: number, - buy: boolean, - ): Promise { - return await tokenSwap( - this.runtime, - amount, - buy ? "USDC" : event.ticker, - buy ? event.ticker : "USDC", - this.runtime.getSetting("WALLET_PUBLIC_KEY"), - this.runtime.getSetting("WALLET_PRIVATE_KEY"), - "base", - ); + if (this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true") { + elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); + } else { + // post tweet to twitter + const response = await postTweet(this.runtime, mediaContent); + elizaLogger.info("Tweet response:", response); + } + } catch (error) { + elizaLogger.error("Failed to post tweet:", error); } - - private async handleMediaPosting( - event: WebhookEvent, - amount: number, - pnl: string, - formattedTimestamp: string, - state: State, - txHash: string, - ) { - let mediaContent = ""; - try { - mediaContent = await this.generateMediaContent( - event, - amount, - pnl, - formattedTimestamp, - state, - txHash, + try { + if ( + this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === + "true" && + this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null + ) { + elizaLogger.info( + "Telegram client disabled. Skipping telegram posting.", ); - elizaLogger.info("Generated media content:", mediaContent); - - if ( - this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true" - ) { - elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); - } else { - // post tweet to twitter - const response = await postTweet(this.runtime, mediaContent); - elizaLogger.info("Tweet response:", response); - } - } catch (error) { - elizaLogger.error("Failed to post tweet:", error); - } - try { - if ( - this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === - "true" && - this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null - ) { - elizaLogger.info( - "Telegram client disabled. Skipping telegram posting.", + } else { + // post message to telegram + if (mediaContent.length > 0) { + await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( + this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), + mediaContent, ); - } else { - // post message to telegram - if (mediaContent.length > 0) { - await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( - this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), - mediaContent, - ); - } } - } catch (error) { - elizaLogger.error("Failed to post telegram:", error); } + } catch (error) { + elizaLogger.error("Failed to post telegram:", error); } + } - async stop(): Promise { - try { - if (this.server?.listen) { - await new Promise((resolve, reject) => { - this.server.listen().close((err: Error | undefined) => { - if (err) reject(err); - else resolve(); - }); + async stop(): Promise { + try { + if (this.server?.listen) { + await new Promise((resolve, reject) => { + this.server.listen().close((err: Error | undefined) => { + if (err) reject(err); + else resolve(); }); - } - elizaLogger.info("Coinbase client stopped successfully"); - } catch (error) { - elizaLogger.error("Error stopping Coinbase client:", error); - throw error; + }); } + elizaLogger.info("Coinbase client stopped successfully"); + } catch (error) { + elizaLogger.error("Error stopping Coinbase client:", error); + throw error; } + } - getType(): string { - return "coinbase"; - } + getType(): string { + return "coinbase"; + } - getName(): string { - return "coinbase"; - } + getName(): string { + return "coinbase"; + } - async start(): Promise { - await this.initialize(); - } + async start(): Promise { + await this.initialize(); } +} export const CoinbaseClientInterface: Client = { start: async (runtime: IAgentRuntime) => { From 8723085540ad8c0b491dc22adb4bd824cf1a86fa Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 13:31:03 -0800 Subject: [PATCH 17/22] clean up --- clients/client-coinbase/src/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index dda3474fc..b73ebed6f 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -356,11 +356,8 @@ Generate only the tweet text, no commentary or markdown.`; return; } elizaLogger.info("txHash ", txHash); - console.log("buy ", buy); - console.log( - "this.initialBuyAmountInCurrency ", - this.initialBuyAmountInCurrency, - ); + elizaLogger.info("buy ", buy); + elizaLogger.info("this.initialBuyAmountInCurrency ", this.initialBuyAmountInCurrency); // Generate and post tweet await this.handleMediaPosting( From 8349644013a0004faa03996d67da28ad79dbe9d2 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 13:31:20 -0800 Subject: [PATCH 18/22] clean up --- clients/client-coinbase/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index b73ebed6f..43155a471 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -357,7 +357,10 @@ Generate only the tweet text, no commentary or markdown.`; } elizaLogger.info("txHash ", txHash); elizaLogger.info("buy ", buy); - elizaLogger.info("this.initialBuyAmountInCurrency ", this.initialBuyAmountInCurrency); + elizaLogger.info( + "this.initialBuyAmountInCurrency ", + this.initialBuyAmountInCurrency, + ); // Generate and post tweet await this.handleMediaPosting( From 53b47a9a697d1df63f5accfda2f7fc1a685010f0 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 20:16:40 -0800 Subject: [PATCH 19/22] get sell pnl winning streak original amount bought working --- clients/client-coinbase/src/index.ts | 815 ++++++++++++++------------- 1 file changed, 413 insertions(+), 402 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 43155a471..8beed6918 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -46,167 +46,171 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; - private initialBuyAmountInCurrency: number | null; - private winningStreak: number; - - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.runtime.providers.push(baseTokenAddressProvider); - this.runtime.providers.push(solTokenAddressProvider); - this.runtime.providers.push(stakingLiquidityPoolingProvider); - this.runtime.providers.push(currentPriceProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - this.initialBuyAmountInCurrency = null; - this.winningStreak = 0; - } + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; + private initialBuyAmountInCurrency: number | null; + private winningStreak: number; + + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; + this.winningStreak = 0; + } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; + } } - } - private setupWebhookEndpoint() { - this.server.use(express.json()); + private setupWebhookEndpoint() { + this.server.use(express.json()); - // Add CORS middleware to allow external requests - this.server.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST"); - res.header("Access-Control-Allow-Headers", "Content-Type"); - if (req.method === "OPTIONS") { - return res.sendStatus(200); - } - next(); - }); - - // Add webhook validation middleware - const _validateWebhook = ( - req: express.Request, - res: express.Response, - next: express.NextFunction, - ) => { - const event = req.body as WebhookEvent; - elizaLogger.info("event ", JSON.stringify(event)); - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } - next(); - }; + // Add CORS middleware to allow external requests + this.server.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "POST"); + res.header("Access-Control-Allow-Headers", "Content-Type"); + if (req.method === "OPTIONS") { + return res.sendStatus(200); + } + next(); + }); - // Add health check endpoint - this.server.get("/health", (_req, res) => { - res.status(200).json({ status: "ok" }); - }); + // Add webhook validation middleware + const _validateWebhook = ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { + const event = req.body as WebhookEvent; + elizaLogger.info(`event ${JSON.stringify(event)}`); + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } + next(); + }; - this.server.get("/webhook/coinbase/health", (_req, res) => { - elizaLogger.info("Health check received"); - res.status(200).json({ status: "ok" }); - }); + // Add health check endpoint + this.server.get("/health", (_req, res) => { + res.status(200).json({ status: "ok" }); + }); - this.server.post("/webhook/coinbase/:agentId", async (req, res) => { - elizaLogger.info("Webhook received for agent:", req.params.agentId); - const runtime = this.runtime; + this.server.get("/webhook/coinbase/health", (_req, res) => { + elizaLogger.info("Health check received"); + res.status(200).json({ status: "ok" }); + }); - if (!runtime) { - res.status(404).json({ error: "Agent not found" }); - return; - } + this.server.post("/webhook/coinbase/:agentId", async (req, res) => { + elizaLogger.info("Webhook received for agent:", req.params.agentId); + const runtime = this.runtime; - // Validate the webhook payload - const event = req.body as WebhookEvent; - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } + if (!runtime) { + res.status(404).json({ error: "Agent not found" }); + return; + } - try { - // Forward the webhook event to the client's handleWebhookEvent method - await this.handleWebhookEvent(event); - res.status(200).json({ status: "success" }); - } catch (error) { - elizaLogger.error("Error processing Coinbase webhook:", error.message); - res.status(500).json({ error: "Internal Server Error" }); - } - }); + // Validate the webhook payload + const event = req.body as WebhookEvent; + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } - return new Promise((resolve, reject) => { - try { - this.server.listen(this.port, "0.0.0.0", () => { - elizaLogger.info(`Webhook server listening on port ${this.port}`); - resolve(); - }); - } catch (error) { - reject(error); - } - }); - } + try { + // Forward the webhook event to the client's handleWebhookEvent method + await this.handleWebhookEvent(event); + res.status(200).json({ status: "success" }); + } catch (error) { + elizaLogger.error( + "Error processing Coinbase webhook:", + error.message, + ); + res.status(500).json({ error: "Internal Server Error" }); + } + }); - private async initializeWallets() { - Coinbase.configure({ - apiKeyName: - this.runtime.getSetting("COINBASE_API_KEY") ?? - process.env.COINBASE_API_KEY, - privateKey: - this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? - process.env.COINBASE_PRIVATE_KEY, - }); - const walletTypes: WalletType[] = [ - "short_term_trading", - "long_term_trading", - "dry_powder", - "operational_capital", - ]; - const networkId = Coinbase.networks.BaseMainnet; - for (const walletType of walletTypes) { - elizaLogger.info("walletType ", walletType); - const wallet = await initializeWallet( - this.runtime, - networkId, - walletType, - ); - elizaLogger.info("Successfully loaded wallet ", wallet.wallet.getId()); - this.wallets.push(wallet); + return new Promise((resolve, reject) => { + try { + this.server.listen(this.port, "0.0.0.0", () => { + elizaLogger.info(`Webhook server listening on port ${this.port}`); + resolve(); + }); + } catch (error) { + reject(error); + } + }); } - } - private async generateMediaContent( - event: WebhookEvent, - amountInCurrency: number, - pnl: string, - formattedTimestamp: string, - state: State, - hash: string | null, - ): Promise { - try { - const tradeTweetTemplate = ` + private async initializeWallets() { + Coinbase.configure({ + apiKeyName: + this.runtime.getSetting("COINBASE_API_KEY") ?? + process.env.COINBASE_API_KEY, + privateKey: + this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? + process.env.COINBASE_PRIVATE_KEY, + }); + const walletTypes: WalletType[] = [ + "short_term_trading", + "long_term_trading", + "dry_powder", + "operational_capital", + ]; + const networkId = Coinbase.networks.BaseMainnet; + for (const walletType of walletTypes) { + elizaLogger.info(`walletType ${walletType}`); + const wallet = await initializeWallet( + this.runtime, + networkId, + walletType, + ); + elizaLogger.info(`Successfully loaded wallet ${wallet.wallet.getId()}`); + this.wallets.push(wallet); + } + } + + private async generateMediaContent( + event: WebhookEvent, + amountInCurrency: number, + pnl: string, + sellTradePNL: string, + formattedTimestamp: string, + state: State, + hash: string | null, + ): Promise { + try { + const tradeTweetTemplate = ` # Task Craft a compelling and concise tweet to announce a Coinbase trade. Aim for creativity and professionalism. @@ -226,294 +230,301 @@ Guidelines: Sample buy tweets: "📈 Added $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "🎯 Strategic ${event.ticker} buy: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Sample sell tweets: "💫 Sold ${event.ticker}: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "📊 Sold $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Generate only the tweet text, no commentary or markdown.`; - const context = composeContext({ - template: tradeTweetTemplate, - state, - }); - - const tweetContent = await generateText({ - runtime: this.runtime, - context, - modelClass: ModelClass.LARGE, - }); - const isSellTrade = event.event.toUpperCase() === "SELL"; - const sellTradePNL = isSellTrade - ? await calculateSellTradePNL( - this.runtime, - this.initialBuyAmountInCurrency, - ) - : ""; - const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; - return finalContent.length > 280 - ? `${finalContent.substring(0, 277)}...` - : finalContent; - } catch (error) { - elizaLogger.error("Error generating tweet content:", error); - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( - 2, - )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; - return fallbackTweet; - } - } - - private async handleWebhookEvent(event: WebhookEvent) { - // for now just support ETH - if (!supportedTickers.includes(event.ticker)) { - elizaLogger.info("Unsupported ticker:", event.ticker); - return; - } - // Set up room and ensure participation - const roomId = stringToUuid("coinbase-trading"); - await this.setupRoom(roomId); - - // Get trading amount from settings - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - - // Create and store memory of trade - const memory = this.createTradeMemory(event, amount, roomId); - await this.runtime.messageManager.createMemory(memory); - - // Generate state and format timestamp - const state = await this.runtime.composeState(memory); - const formattedTimestamp = this.getFormattedTimestamp(); - - // Execute token swap - const buy = event.event.toUpperCase() === "BUY"; - if (buy) { - this.initialBuyAmountInCurrency = amount / Number(event.price); - } - // if sell, use the initial buy amount in currency instead of the current price - let amountInCurrency: number; - const tokenMetadata = getTokenMetadata(event.ticker); - const usdcMetadata = getTokenMetadata("USDC"); - const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found - const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found - - amountInCurrency = Math.floor( - buy - ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units - : (amount / Number(event.price)) * 10 ** tokenDecimals, // Convert to token base units - ); - if (buy) { - this.initialBuyAmountInCurrency = amountInCurrency; - } - if (this.initialBuyAmountInCurrency != null) { - amountInCurrency = this.initialBuyAmountInCurrency; - } - elizaLogger.info( - "amountInCurrency non base units ", - amount / Number(event.price), - ); - const pnl = await calculateOverallPNL( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - 1000, - ); - elizaLogger.info("pnl ", pnl); + const context = composeContext({ + template: tradeTweetTemplate, + state, + }); - // Check if the PNL is positive or negative - if (Number.parseFloat(pnl) > 0) { - this.winningStreak++; - } else { - this.winningStreak = 0; - } - elizaLogger.info("winningStreak ", this.winningStreak); - - elizaLogger.info("amountInCurrency ", amountInCurrency); - const enoughBalance = await hasEnoughBalance( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - buy ? "USDC" : event.ticker, - amountInCurrency, - ); - elizaLogger.info("enoughBalance ", enoughBalance); - if (!enoughBalance) { - elizaLogger.error("Not enough balance to trade"); - return; - } - const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); - if (txHash == null) { - elizaLogger.error("txHash is null"); - return; + const tweetContent = await generateText({ + runtime: this.runtime, + context, + modelClass: ModelClass.LARGE, + }); + const isSellTrade = event.event.toUpperCase() === "SELL"; + const trimmedContent = tweetContent.trim(); + const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; + return finalContent.length > 280 + ? `${finalContent.substring(0, 277)}...` + : finalContent; + } catch (error) { + elizaLogger.error("Error generating tweet content:", error); + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( + 2, + )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; + return fallbackTweet; + } } - elizaLogger.info("txHash ", txHash); - elizaLogger.info("buy ", buy); - elizaLogger.info( - "this.initialBuyAmountInCurrency ", - this.initialBuyAmountInCurrency, - ); - // Generate and post tweet - await this.handleMediaPosting( - event, - amount, - pnl, - formattedTimestamp, - state, - txHash, - ); - } + private async handleWebhookEvent(event: WebhookEvent) { + // for now just support ETH + if (!supportedTickers.includes(event.ticker)) { + elizaLogger.info("Unsupported ticker:", event.ticker); + return; + } + // Set up room and ensure participation + const roomId = stringToUuid("coinbase-trading"); + await this.setupRoom(roomId); - private async setupRoom(roomId: UUID) { - await this.runtime.ensureRoomExists(roomId); - await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); - } + // Get trading amount from settings + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - private createTradeMemory( - event: WebhookEvent, - amount: number, - roomId: UUID, - ): Memory { - return { - id: stringToUuid(`coinbase-${event.timestamp}`), - userId: this.runtime.agentId, - agentId: this.runtime.agentId, - roomId, - content: { - text: `${event.event.toUpperCase()} $${amount} worth of ${ - event.ticker - }`, - action: "SWAP", - source: "coinbase", - metadata: { - ticker: event.ticker, - side: event.event.toUpperCase(), - price: event.price, - amount: amount, - timestamp: event.timestamp, - walletType: "short_term_trading", - }, - }, - createdAt: Date.now(), - }; - } + // Create and store memory of trade + const memory = this.createTradeMemory(event, amount, roomId); + await this.runtime.messageManager.createMemory(memory); + + // Generate state and format timestamp + const state = await this.runtime.composeState(memory); + const formattedTimestamp = this.getFormattedTimestamp(); + + // Execute token swap + const buy = event.event.toUpperCase() === "BUY"; + const price = event.price; + // if sell, use the initial buy amount in currency instead of the current price + let amountInCurrency: number; + const tokenMetadata = getTokenMetadata(event.ticker); + const usdcMetadata = getTokenMetadata("USDC"); + const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found + const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found + const amountSellInCurrencyInBaseUnits = Math.floor( + (amount / Number(event.price)) * 10 ** tokenDecimals, + ); - private getFormattedTimestamp(): string { - return new Intl.DateTimeFormat("en-US", { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - timeZoneName: "short", - }).format(new Date()); - } + amountInCurrency = Math.floor( + buy + ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units + : amountSellInCurrencyInBaseUnits, // Convert to token base units + ); + if (buy) { + this.initialBuyAmountInCurrency = amountSellInCurrencyInBaseUnits; + } + if (!buy && this.initialBuyAmountInCurrency !== null) { + amountInCurrency = this.initialBuyAmountInCurrency; + } + elizaLogger.info(`buy ${buy}`); + elizaLogger.info( + `this.initialBuyAmountInCurrency ${this.initialBuyAmountInCurrency}`, + ); - private async executeTokenSwap( - event: WebhookEvent, - amount: number, - buy: boolean, - ): Promise { - return await tokenSwap( - this.runtime, - amount, - buy ? "USDC" : event.ticker, - buy ? event.ticker : "USDC", - this.runtime.getSetting("WALLET_PUBLIC_KEY"), - this.runtime.getSetting("WALLET_PRIVATE_KEY"), - "base", - ); - } + const pnl = await calculateOverallPNL( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + 1000, + ); + const sellTradePNL = await calculateSellTradePNL( + this.runtime, + this.initialBuyAmountInCurrency !== null + ? this.initialBuyAmountInCurrency + : amountSellInCurrencyInBaseUnits, + amountSellInCurrencyInBaseUnits, + ); + elizaLogger.info(`pnl ${pnl}`); - private async handleMediaPosting( - event: WebhookEvent, - amount: number, - pnl: string, - formattedTimestamp: string, - state: State, - txHash: string, - ) { - let mediaContent = ""; - try { - mediaContent = await this.generateMediaContent( + // Check if the PNL is positive or negative + if (Number.parseFloat(sellTradePNL) > 0) { + this.winningStreak++; + } else { + this.winningStreak = 0; + } + elizaLogger.info(`winningStreak ${this.winningStreak}`); + const enoughBalance = await hasEnoughBalance( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + buy ? "USDC" : event.ticker, + amountInCurrency, + ); + elizaLogger.info(`enoughBalance ${enoughBalance}`); + if (!enoughBalance) { + elizaLogger.error("Not enough balance to trade"); + return; + } + const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); + if (txHash == null) { + elizaLogger.error("txHash is null"); + return; + } + elizaLogger.info(`txHash ${txHash}`); + let amountInUSD; + if (buy) { + amountInUSD = amount; + } else { + amountInUSD = amountInCurrency / (10 ** tokenDecimals) * price; + } + elizaLogger.info(`amountInUSD ${amountInUSD}`) + // Generate and post tweet + await this.handleMediaPosting( event, - amount, + amountInUSD, pnl, + sellTradePNL, formattedTimestamp, state, txHash, ); - elizaLogger.info("Generated media content:", mediaContent); + } - if (this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true") { - elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); - } else { - // post tweet to twitter - const response = await postTweet(this.runtime, mediaContent); - elizaLogger.info("Tweet response:", response); - } - } catch (error) { - elizaLogger.error("Failed to post tweet:", error); + private async setupRoom(roomId: UUID) { + await this.runtime.ensureRoomExists(roomId); + await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); } - try { - if ( - this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === - "true" && - this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null - ) { - elizaLogger.info( - "Telegram client disabled. Skipping telegram posting.", + + private createTradeMemory( + event: WebhookEvent, + amount: number, + roomId: UUID, + ): Memory { + return { + id: stringToUuid(`coinbase-${event.timestamp}`), + userId: this.runtime.agentId, + agentId: this.runtime.agentId, + roomId, + content: { + text: `${event.event.toUpperCase()} $${amount} worth of ${ + event.ticker + }`, + action: "SWAP", + source: "coinbase", + metadata: { + ticker: event.ticker, + side: event.event.toUpperCase(), + price: event.price, + amount: amount, + timestamp: event.timestamp, + walletType: "short_term_trading", + }, + }, + createdAt: Date.now(), + }; + } + + private getFormattedTimestamp(): string { + return new Intl.DateTimeFormat("en-US", { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(new Date()); + } + + private async executeTokenSwap( + event: WebhookEvent, + amount: number, + buy: boolean, + ): Promise { + return await tokenSwap( + this.runtime, + amount, + buy ? "USDC" : event.ticker, + buy ? event.ticker : "USDC", + this.runtime.getSetting("WALLET_PUBLIC_KEY"), + this.runtime.getSetting("WALLET_PRIVATE_KEY"), + "base", + ); + } + + private async handleMediaPosting( + event: WebhookEvent, + amountInUSD: number, + pnl: string, + sellTradePNL: string, + formattedTimestamp: string, + state: State, + txHash: string, + ) { + let mediaContent = ""; + try { + mediaContent = await this.generateMediaContent( + event, + amountInUSD, + pnl, + sellTradePNL, + formattedTimestamp, + state, + txHash, ); - } else { - // post message to telegram - if (mediaContent.length > 0) { - await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( - this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), - mediaContent, + elizaLogger.info(`Generated media content: ${mediaContent}`); + + if ( + this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true" + ) { + elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); + } else { + // post tweet to twitter + const response = await postTweet(this.runtime, mediaContent); + elizaLogger.info(`Tweet response: ${response}`); + } + } catch (error) { + elizaLogger.error("Failed to post tweet:", error); + } + try { + if ( + this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === + "true" && + this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null + ) { + elizaLogger.info( + "Telegram client disabled. Skipping telegram posting.", ); + } else { + // post message to telegram + if (mediaContent.length > 0) { + await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( + this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), + mediaContent, + ); + } } + } catch (error) { + elizaLogger.error("Failed to post telegram:", error); } - } catch (error) { - elizaLogger.error("Failed to post telegram:", error); } - } - async stop(): Promise { - try { - if (this.server?.listen) { - await new Promise((resolve, reject) => { - this.server.listen().close((err: Error | undefined) => { - if (err) reject(err); - else resolve(); + async stop(): Promise { + try { + if (this.server?.listen) { + await new Promise((resolve, reject) => { + this.server.listen().close((err: Error | undefined) => { + if (err) reject(err); + else resolve(); + }); }); - }); + } + elizaLogger.info("Coinbase client stopped successfully"); + } catch (error) { + elizaLogger.error("Error stopping Coinbase client:", error); + throw error; } - elizaLogger.info("Coinbase client stopped successfully"); - } catch (error) { - elizaLogger.error("Error stopping Coinbase client:", error); - throw error; } - } - getType(): string { - return "coinbase"; - } + getType(): string { + return "coinbase"; + } - getName(): string { - return "coinbase"; - } + getName(): string { + return "coinbase"; + } - async start(): Promise { - await this.initialize(); + async start(): Promise { + await this.initialize(); + } } -} export const CoinbaseClientInterface: Client = { start: async (runtime: IAgentRuntime) => { @@ -560,9 +571,9 @@ export const calculateOverallPNL = async ( export const calculateSellTradePNL = async ( runtime: IAgentRuntime, initialBuyAmountInCurrency: number, + amountSellInCurrencyInBaseUnits: number, ): Promise => { - const tradingAmount = Number(runtime.getSetting("COINBASE_TRADING_AMOUNT")); - const pnlUSD = initialBuyAmountInCurrency - tradingAmount; + const pnlUSD = initialBuyAmountInCurrency - amountSellInCurrencyInBaseUnits; elizaLogger.info(`Sell Trade pnlUSD ${pnlUSD}`); const absoluteValuePNL = Math.abs(pnlUSD); elizaLogger.info(`Sell Trade absoluteValuePNL ${absoluteValuePNL}`); @@ -738,7 +749,7 @@ export const pnlProvider: Provider = { runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, 1000, ); - elizaLogger.info("pnl ", pnl); + elizaLogger.info(`pnl ${pnl}`); return `PNL: ${pnl}`; } catch (error) { elizaLogger.error("Error in pnlProvider: ", error.message); From 21fc1a80f3d663e05ba0da3f66e634c28fb12689 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 20:16:56 -0800 Subject: [PATCH 20/22] get sell pnl winning streak original amount bought working --- clients/client-coinbase/src/index.ts | 813 +++++++++++++-------------- 1 file changed, 404 insertions(+), 409 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 8beed6918..9698e2258 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -46,171 +46,168 @@ export type WalletType = | "operational_capital"; export class CoinbaseClient implements Client { - private runtime: IAgentRuntime; - private server: express.Application; - private port: number; - private wallets: CoinbaseWallet[]; - private initialBuyAmountInCurrency: number | null; - private winningStreak: number; - - constructor(runtime: IAgentRuntime) { - this.runtime = runtime; - // add providers to runtime - this.runtime.providers.push(pnlProvider); - this.runtime.providers.push(balanceProvider); - this.runtime.providers.push(addressProvider); - this.runtime.providers.push(tradingSignalBackTestProvider); - this.runtime.providers.push(baseTokenAddressProvider); - this.runtime.providers.push(solTokenAddressProvider); - this.runtime.providers.push(stakingLiquidityPoolingProvider); - this.runtime.providers.push(currentPriceProvider); - this.server = express(); - this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; - this.wallets = []; - this.initialBuyAmountInCurrency = null; - this.winningStreak = 0; - } + private runtime: IAgentRuntime; + private server: express.Application; + private port: number; + private wallets: CoinbaseWallet[]; + private initialBuyAmountInCurrency: number | null; + private winningStreak: number; + + constructor(runtime: IAgentRuntime) { + this.runtime = runtime; + // add providers to runtime + this.runtime.providers.push(pnlProvider); + this.runtime.providers.push(balanceProvider); + this.runtime.providers.push(addressProvider); + this.runtime.providers.push(tradingSignalBackTestProvider); + this.runtime.providers.push(baseTokenAddressProvider); + this.runtime.providers.push(solTokenAddressProvider); + this.runtime.providers.push(stakingLiquidityPoolingProvider); + this.runtime.providers.push(currentPriceProvider); + this.server = express(); + this.port = Number(runtime.getSetting("COINBASE_WEBHOOK_PORT")) || 3001; + this.wallets = []; + this.initialBuyAmountInCurrency = null; + this.winningStreak = 0; + } - async initialize(): Promise { - elizaLogger.info("Initializing Coinbase client"); - try { - // await this.initializeWallets(); - elizaLogger.info("Wallets initialized successfully"); - await this.setupWebhookEndpoint(); - elizaLogger.info("Webhook endpoint setup successfully"); - } catch (error) { - elizaLogger.error("Failed to initialize Coinbase client:", error); - throw error; - } + async initialize(): Promise { + elizaLogger.info("Initializing Coinbase client"); + try { + // await this.initializeWallets(); + elizaLogger.info("Wallets initialized successfully"); + await this.setupWebhookEndpoint(); + elizaLogger.info("Webhook endpoint setup successfully"); + } catch (error) { + elizaLogger.error("Failed to initialize Coinbase client:", error); + throw error; } + } - private setupWebhookEndpoint() { - this.server.use(express.json()); - - // Add CORS middleware to allow external requests - this.server.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "POST"); - res.header("Access-Control-Allow-Headers", "Content-Type"); - if (req.method === "OPTIONS") { - return res.sendStatus(200); - } - next(); - }); - - // Add webhook validation middleware - const _validateWebhook = ( - req: express.Request, - res: express.Response, - next: express.NextFunction, - ) => { - const event = req.body as WebhookEvent; - elizaLogger.info(`event ${JSON.stringify(event)}`); - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } - next(); - }; + private setupWebhookEndpoint() { + this.server.use(express.json()); - // Add health check endpoint - this.server.get("/health", (_req, res) => { - res.status(200).json({ status: "ok" }); - }); + // Add CORS middleware to allow external requests + this.server.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "POST"); + res.header("Access-Control-Allow-Headers", "Content-Type"); + if (req.method === "OPTIONS") { + return res.sendStatus(200); + } + next(); + }); + + // Add webhook validation middleware + const _validateWebhook = ( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ) => { + const event = req.body as WebhookEvent; + elizaLogger.info(`event ${JSON.stringify(event)}`); + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } + next(); + }; - this.server.get("/webhook/coinbase/health", (_req, res) => { - elizaLogger.info("Health check received"); - res.status(200).json({ status: "ok" }); - }); + // Add health check endpoint + this.server.get("/health", (_req, res) => { + res.status(200).json({ status: "ok" }); + }); - this.server.post("/webhook/coinbase/:agentId", async (req, res) => { - elizaLogger.info("Webhook received for agent:", req.params.agentId); - const runtime = this.runtime; + this.server.get("/webhook/coinbase/health", (_req, res) => { + elizaLogger.info("Health check received"); + res.status(200).json({ status: "ok" }); + }); - if (!runtime) { - res.status(404).json({ error: "Agent not found" }); - return; - } + this.server.post("/webhook/coinbase/:agentId", async (req, res) => { + elizaLogger.info("Webhook received for agent:", req.params.agentId); + const runtime = this.runtime; - // Validate the webhook payload - const event = req.body as WebhookEvent; - if (!event.event || !event.ticker || !event.timestamp || !event.price) { - res.status(400).json({ error: "Invalid webhook payload" }); - return; - } - if (event.event !== "buy" && event.event !== "sell") { - res.status(400).json({ error: "Invalid event type" }); - return; - } + if (!runtime) { + res.status(404).json({ error: "Agent not found" }); + return; + } - try { - // Forward the webhook event to the client's handleWebhookEvent method - await this.handleWebhookEvent(event); - res.status(200).json({ status: "success" }); - } catch (error) { - elizaLogger.error( - "Error processing Coinbase webhook:", - error.message, - ); - res.status(500).json({ error: "Internal Server Error" }); - } - }); + // Validate the webhook payload + const event = req.body as WebhookEvent; + if (!event.event || !event.ticker || !event.timestamp || !event.price) { + res.status(400).json({ error: "Invalid webhook payload" }); + return; + } + if (event.event !== "buy" && event.event !== "sell") { + res.status(400).json({ error: "Invalid event type" }); + return; + } - return new Promise((resolve, reject) => { - try { - this.server.listen(this.port, "0.0.0.0", () => { - elizaLogger.info(`Webhook server listening on port ${this.port}`); - resolve(); - }); - } catch (error) { - reject(error); - } - }); - } + try { + // Forward the webhook event to the client's handleWebhookEvent method + await this.handleWebhookEvent(event); + res.status(200).json({ status: "success" }); + } catch (error) { + elizaLogger.error("Error processing Coinbase webhook:", error.message); + res.status(500).json({ error: "Internal Server Error" }); + } + }); - private async initializeWallets() { - Coinbase.configure({ - apiKeyName: - this.runtime.getSetting("COINBASE_API_KEY") ?? - process.env.COINBASE_API_KEY, - privateKey: - this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? - process.env.COINBASE_PRIVATE_KEY, - }); - const walletTypes: WalletType[] = [ - "short_term_trading", - "long_term_trading", - "dry_powder", - "operational_capital", - ]; - const networkId = Coinbase.networks.BaseMainnet; - for (const walletType of walletTypes) { - elizaLogger.info(`walletType ${walletType}`); - const wallet = await initializeWallet( - this.runtime, - networkId, - walletType, - ); - elizaLogger.info(`Successfully loaded wallet ${wallet.wallet.getId()}`); - this.wallets.push(wallet); + return new Promise((resolve, reject) => { + try { + this.server.listen(this.port, "0.0.0.0", () => { + elizaLogger.info(`Webhook server listening on port ${this.port}`); + resolve(); + }); + } catch (error) { + reject(error); } + }); + } + + private async initializeWallets() { + Coinbase.configure({ + apiKeyName: + this.runtime.getSetting("COINBASE_API_KEY") ?? + process.env.COINBASE_API_KEY, + privateKey: + this.runtime.getSetting("COINBASE_PRIVATE_KEY") ?? + process.env.COINBASE_PRIVATE_KEY, + }); + const walletTypes: WalletType[] = [ + "short_term_trading", + "long_term_trading", + "dry_powder", + "operational_capital", + ]; + const networkId = Coinbase.networks.BaseMainnet; + for (const walletType of walletTypes) { + elizaLogger.info(`walletType ${walletType}`); + const wallet = await initializeWallet( + this.runtime, + networkId, + walletType, + ); + elizaLogger.info(`Successfully loaded wallet ${wallet.wallet.getId()}`); + this.wallets.push(wallet); } + } - private async generateMediaContent( - event: WebhookEvent, - amountInCurrency: number, - pnl: string, - sellTradePNL: string, - formattedTimestamp: string, - state: State, - hash: string | null, - ): Promise { - try { - const tradeTweetTemplate = ` + private async generateMediaContent( + event: WebhookEvent, + amountInCurrency: number, + pnl: string, + sellTradePNL: string, + formattedTimestamp: string, + state: State, + hash: string | null, + ): Promise { + try { + const tradeTweetTemplate = ` # Task Craft a compelling and concise tweet to announce a Coinbase trade. Aim for creativity and professionalism. @@ -230,301 +227,299 @@ Guidelines: Sample buy tweets: "📈 Added $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "🎯 Strategic ${event.ticker} buy: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Sample sell tweets: "💫 Sold ${event.ticker}: $${amountInCurrency.toFixed(2)} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." "📊 Sold $${amountInCurrency.toFixed(2)} of ${event.ticker} at $${Number( - event.price, - ).toFixed(2)}." + event.price, + ).toFixed(2)}." Generate only the tweet text, no commentary or markdown.`; - const context = composeContext({ - template: tradeTweetTemplate, - state, - }); + const context = composeContext({ + template: tradeTweetTemplate, + state, + }); - const tweetContent = await generateText({ - runtime: this.runtime, - context, - modelClass: ModelClass.LARGE, - }); - const isSellTrade = event.event.toUpperCase() === "SELL"; - const trimmedContent = tweetContent.trim(); - const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; - return finalContent.length > 280 - ? `${finalContent.substring(0, 277)}...` - : finalContent; - } catch (error) { - elizaLogger.error("Error generating tweet content:", error); - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; - const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( - 2, - )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; - return fallbackTweet; - } + const tweetContent = await generateText({ + runtime: this.runtime, + context, + modelClass: ModelClass.LARGE, + }); + const isSellTrade = event.event.toUpperCase() === "SELL"; + const trimmedContent = tweetContent.trim(); + const finalContent = `${trimmedContent} ${isSellTrade ? `Trade PNL: ${sellTradePNL}` : ""} Overall PNL: ${pnl} Winning Streak: ${this.winningStreak} ${blockExplorerBaseTxUrl(hash)}`; + return finalContent.length > 280 + ? `${finalContent.substring(0, 277)}...` + : finalContent; + } catch (error) { + elizaLogger.error("Error generating tweet content:", error); + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + const fallbackTweet = `🚀 ${event.event.toUpperCase()}: $${amount.toFixed( + 2, + )} of ${event.ticker} at $${Number(event.price).toFixed(2)}`; + return fallbackTweet; } + } - private async handleWebhookEvent(event: WebhookEvent) { - // for now just support ETH - if (!supportedTickers.includes(event.ticker)) { - elizaLogger.info("Unsupported ticker:", event.ticker); - return; - } - // Set up room and ensure participation - const roomId = stringToUuid("coinbase-trading"); - await this.setupRoom(roomId); + private async handleWebhookEvent(event: WebhookEvent) { + // for now just support ETH + if (!supportedTickers.includes(event.ticker)) { + elizaLogger.info("Unsupported ticker:", event.ticker); + return; + } + // Set up room and ensure participation + const roomId = stringToUuid("coinbase-trading"); + await this.setupRoom(roomId); + + // Get trading amount from settings + const amount = + Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + + // Create and store memory of trade + const memory = this.createTradeMemory(event, amount, roomId); + await this.runtime.messageManager.createMemory(memory); + + // Generate state and format timestamp + const state = await this.runtime.composeState(memory); + const formattedTimestamp = this.getFormattedTimestamp(); + + // Execute token swap + const buy = event.event.toUpperCase() === "BUY"; + const price = event.price; + // if sell, use the initial buy amount in currency instead of the current price + let amountInCurrency: number; + const tokenMetadata = getTokenMetadata(event.ticker); + const usdcMetadata = getTokenMetadata("USDC"); + const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found + const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found + const amountSellInCurrencyInBaseUnits = Math.floor( + (amount / Number(event.price)) * 10 ** tokenDecimals, + ); - // Get trading amount from settings - const amount = - Number(this.runtime.getSetting("COINBASE_TRADING_AMOUNT")) ?? 1; + amountInCurrency = Math.floor( + buy + ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units + : amountSellInCurrencyInBaseUnits, // Convert to token base units + ); + if (buy) { + this.initialBuyAmountInCurrency = amountSellInCurrencyInBaseUnits; + } + if (!buy && this.initialBuyAmountInCurrency !== null) { + amountInCurrency = this.initialBuyAmountInCurrency; + } + elizaLogger.info(`buy ${buy}`); + elizaLogger.info( + `this.initialBuyAmountInCurrency ${this.initialBuyAmountInCurrency}`, + ); - // Create and store memory of trade - const memory = this.createTradeMemory(event, amount, roomId); - await this.runtime.messageManager.createMemory(memory); - - // Generate state and format timestamp - const state = await this.runtime.composeState(memory); - const formattedTimestamp = this.getFormattedTimestamp(); - - // Execute token swap - const buy = event.event.toUpperCase() === "BUY"; - const price = event.price; - // if sell, use the initial buy amount in currency instead of the current price - let amountInCurrency: number; - const tokenMetadata = getTokenMetadata(event.ticker); - const usdcMetadata = getTokenMetadata("USDC"); - const tokenDecimals = tokenMetadata?.decimals || 18; // Default to 18 if not found - const usdcDecimals = usdcMetadata?.decimals || 6; // Default to 6 if not found - const amountSellInCurrencyInBaseUnits = Math.floor( - (amount / Number(event.price)) * 10 ** tokenDecimals, - ); + const pnl = await calculateOverallPNL( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + 1000, + ); + const sellTradePNL = await calculateSellTradePNL( + this.runtime, + this.initialBuyAmountInCurrency !== null + ? this.initialBuyAmountInCurrency + : amountSellInCurrencyInBaseUnits, + amountSellInCurrencyInBaseUnits, + ); + elizaLogger.info(`pnl ${pnl}`); - amountInCurrency = Math.floor( - buy - ? amount * 10 ** usdcDecimals // Convert USD amount to USDC base units - : amountSellInCurrencyInBaseUnits, // Convert to token base units - ); - if (buy) { - this.initialBuyAmountInCurrency = amountSellInCurrencyInBaseUnits; - } - if (!buy && this.initialBuyAmountInCurrency !== null) { - amountInCurrency = this.initialBuyAmountInCurrency; - } - elizaLogger.info(`buy ${buy}`); - elizaLogger.info( - `this.initialBuyAmountInCurrency ${this.initialBuyAmountInCurrency}`, - ); + // Check if the PNL is positive or negative + if (Number.parseFloat(sellTradePNL) > 0) { + this.winningStreak++; + } else { + this.winningStreak = 0; + } + elizaLogger.info(`winningStreak ${this.winningStreak}`); + const enoughBalance = await hasEnoughBalance( + this.runtime, + this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, + buy ? "USDC" : event.ticker, + amountInCurrency, + ); + elizaLogger.info(`enoughBalance ${enoughBalance}`); + if (!enoughBalance) { + elizaLogger.error("Not enough balance to trade"); + return; + } + const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); + if (txHash == null) { + elizaLogger.error("txHash is null"); + return; + } + elizaLogger.info(`txHash ${txHash}`); + let amountInUSD; + if (buy) { + amountInUSD = amount; + } else { + amountInUSD = (amountInCurrency / 10 ** tokenDecimals) * price; + } + elizaLogger.info(`amountInUSD ${amountInUSD}`); + // Generate and post tweet + await this.handleMediaPosting( + event, + amountInUSD, + pnl, + sellTradePNL, + formattedTimestamp, + state, + txHash, + ); + } - const pnl = await calculateOverallPNL( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - 1000, - ); - const sellTradePNL = await calculateSellTradePNL( - this.runtime, - this.initialBuyAmountInCurrency !== null - ? this.initialBuyAmountInCurrency - : amountSellInCurrencyInBaseUnits, - amountSellInCurrencyInBaseUnits, - ); - elizaLogger.info(`pnl ${pnl}`); + private async setupRoom(roomId: UUID) { + await this.runtime.ensureRoomExists(roomId); + await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); + } - // Check if the PNL is positive or negative - if (Number.parseFloat(sellTradePNL) > 0) { - this.winningStreak++; - } else { - this.winningStreak = 0; - } - elizaLogger.info(`winningStreak ${this.winningStreak}`); - const enoughBalance = await hasEnoughBalance( - this.runtime, - this.runtime.getSetting("WALLET_PUBLIC_KEY") as `0x${string}`, - buy ? "USDC" : event.ticker, - amountInCurrency, - ); - elizaLogger.info(`enoughBalance ${enoughBalance}`); - if (!enoughBalance) { - elizaLogger.error("Not enough balance to trade"); - return; - } - const txHash = await this.executeTokenSwap(event, amountInCurrency, buy); - if (txHash == null) { - elizaLogger.error("txHash is null"); - return; - } - elizaLogger.info(`txHash ${txHash}`); - let amountInUSD; - if (buy) { - amountInUSD = amount; - } else { - amountInUSD = amountInCurrency / (10 ** tokenDecimals) * price; - } - elizaLogger.info(`amountInUSD ${amountInUSD}`) - // Generate and post tweet - await this.handleMediaPosting( + private createTradeMemory( + event: WebhookEvent, + amount: number, + roomId: UUID, + ): Memory { + return { + id: stringToUuid(`coinbase-${event.timestamp}`), + userId: this.runtime.agentId, + agentId: this.runtime.agentId, + roomId, + content: { + text: `${event.event.toUpperCase()} $${amount} worth of ${ + event.ticker + }`, + action: "SWAP", + source: "coinbase", + metadata: { + ticker: event.ticker, + side: event.event.toUpperCase(), + price: event.price, + amount: amount, + timestamp: event.timestamp, + walletType: "short_term_trading", + }, + }, + createdAt: Date.now(), + }; + } + + private getFormattedTimestamp(): string { + return new Intl.DateTimeFormat("en-US", { + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }).format(new Date()); + } + + private async executeTokenSwap( + event: WebhookEvent, + amount: number, + buy: boolean, + ): Promise { + return await tokenSwap( + this.runtime, + amount, + buy ? "USDC" : event.ticker, + buy ? event.ticker : "USDC", + this.runtime.getSetting("WALLET_PUBLIC_KEY"), + this.runtime.getSetting("WALLET_PRIVATE_KEY"), + "base", + ); + } + + private async handleMediaPosting( + event: WebhookEvent, + amountInUSD: number, + pnl: string, + sellTradePNL: string, + formattedTimestamp: string, + state: State, + txHash: string, + ) { + let mediaContent = ""; + try { + mediaContent = await this.generateMediaContent( event, - amountInUSD, + amountInUSD, pnl, sellTradePNL, formattedTimestamp, state, txHash, ); - } - - private async setupRoom(roomId: UUID) { - await this.runtime.ensureRoomExists(roomId); - await this.runtime.ensureParticipantInRoom(this.runtime.agentId, roomId); - } - - private createTradeMemory( - event: WebhookEvent, - amount: number, - roomId: UUID, - ): Memory { - return { - id: stringToUuid(`coinbase-${event.timestamp}`), - userId: this.runtime.agentId, - agentId: this.runtime.agentId, - roomId, - content: { - text: `${event.event.toUpperCase()} $${amount} worth of ${ - event.ticker - }`, - action: "SWAP", - source: "coinbase", - metadata: { - ticker: event.ticker, - side: event.event.toUpperCase(), - price: event.price, - amount: amount, - timestamp: event.timestamp, - walletType: "short_term_trading", - }, - }, - createdAt: Date.now(), - }; - } - - private getFormattedTimestamp(): string { - return new Intl.DateTimeFormat("en-US", { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - timeZoneName: "short", - }).format(new Date()); - } + elizaLogger.info(`Generated media content: ${mediaContent}`); - private async executeTokenSwap( - event: WebhookEvent, - amount: number, - buy: boolean, - ): Promise { - return await tokenSwap( - this.runtime, - amount, - buy ? "USDC" : event.ticker, - buy ? event.ticker : "USDC", - this.runtime.getSetting("WALLET_PUBLIC_KEY"), - this.runtime.getSetting("WALLET_PRIVATE_KEY"), - "base", - ); + if (this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true") { + elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); + } else { + // post tweet to twitter + const response = await postTweet(this.runtime, mediaContent); + elizaLogger.info(`Tweet response: ${response}`); + } + } catch (error) { + elizaLogger.error("Failed to post tweet:", error); } - - private async handleMediaPosting( - event: WebhookEvent, - amountInUSD: number, - pnl: string, - sellTradePNL: string, - formattedTimestamp: string, - state: State, - txHash: string, - ) { - let mediaContent = ""; - try { - mediaContent = await this.generateMediaContent( - event, - amountInUSD, - pnl, - sellTradePNL, - formattedTimestamp, - state, - txHash, + try { + if ( + this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === + "true" && + this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null + ) { + elizaLogger.info( + "Telegram client disabled. Skipping telegram posting.", ); - elizaLogger.info(`Generated media content: ${mediaContent}`); - - if ( - this.runtime.getSetting("TWITTER_DRY_RUN").toLowerCase() === "true" - ) { - elizaLogger.info("Dry run mode enabled. Skipping tweet posting."); - } else { - // post tweet to twitter - const response = await postTweet(this.runtime, mediaContent); - elizaLogger.info(`Tweet response: ${response}`); - } - } catch (error) { - elizaLogger.error("Failed to post tweet:", error); - } - try { - if ( - this.runtime.getSetting("TELEGRAM_CLIENT_DISABLED").toLowerCase() === - "true" && - this.runtime.getSetting("TELEGRAM_BOT_TOKEN") !== null - ) { - elizaLogger.info( - "Telegram client disabled. Skipping telegram posting.", + } else { + // post message to telegram + if (mediaContent.length > 0) { + await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( + this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), + mediaContent, ); - } else { - // post message to telegram - if (mediaContent.length > 0) { - await this.runtime.clients.telegram.messageManager.bot.telegram.sendMessage( - this.runtime.getSetting("TELEGRAM_CHANNEL_ID"), - mediaContent, - ); - } } - } catch (error) { - elizaLogger.error("Failed to post telegram:", error); } + } catch (error) { + elizaLogger.error("Failed to post telegram:", error); } + } - async stop(): Promise { - try { - if (this.server?.listen) { - await new Promise((resolve, reject) => { - this.server.listen().close((err: Error | undefined) => { - if (err) reject(err); - else resolve(); - }); + async stop(): Promise { + try { + if (this.server?.listen) { + await new Promise((resolve, reject) => { + this.server.listen().close((err: Error | undefined) => { + if (err) reject(err); + else resolve(); }); - } - elizaLogger.info("Coinbase client stopped successfully"); - } catch (error) { - elizaLogger.error("Error stopping Coinbase client:", error); - throw error; + }); } + elizaLogger.info("Coinbase client stopped successfully"); + } catch (error) { + elizaLogger.error("Error stopping Coinbase client:", error); + throw error; } + } - getType(): string { - return "coinbase"; - } + getType(): string { + return "coinbase"; + } - getName(): string { - return "coinbase"; - } + getName(): string { + return "coinbase"; + } - async start(): Promise { - await this.initialize(); - } + async start(): Promise { + await this.initialize(); } +} export const CoinbaseClientInterface: Client = { start: async (runtime: IAgentRuntime) => { From e5661fc5e25a4b8edad0d1ce0dd68cc4d8b0fae8 Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 21:57:00 -0800 Subject: [PATCH 21/22] get trade pnl working --- clients/client-coinbase/src/index.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/clients/client-coinbase/src/index.ts b/clients/client-coinbase/src/index.ts index 9698e2258..5154c8808 100644 --- a/clients/client-coinbase/src/index.ts +++ b/clients/client-coinbase/src/index.ts @@ -331,6 +331,8 @@ Generate only the tweet text, no commentary or markdown.`; ? this.initialBuyAmountInCurrency : amountSellInCurrencyInBaseUnits, amountSellInCurrencyInBaseUnits, + Number(price), + tokenDecimals, ); elizaLogger.info(`pnl ${pnl}`); @@ -567,8 +569,20 @@ export const calculateSellTradePNL = async ( runtime: IAgentRuntime, initialBuyAmountInCurrency: number, amountSellInCurrencyInBaseUnits: number, + price: number, + tokenDecimals: number, ): Promise => { - const pnlUSD = initialBuyAmountInCurrency - amountSellInCurrencyInBaseUnits; + elizaLogger.info("calculateSellTradePNL"); + elizaLogger.info(`initialBuyAmountInCurrency ${initialBuyAmountInCurrency}`); + elizaLogger.info( + `amountSellInCurrencyInBaseUnits ${amountSellInCurrencyInBaseUnits}`, + ); + // its in base units + const pnlCurrencyInBaseUnits = + initialBuyAmountInCurrency - amountSellInCurrencyInBaseUnits; + elizaLogger.info(`pnlCurrencyInBaseUnits ${pnlCurrencyInBaseUnits}`); + const pnlUSD = (pnlCurrencyInBaseUnits / 10 ** tokenDecimals) * price; + elizaLogger.info(`pnlUSD ${pnlUSD}`); elizaLogger.info(`Sell Trade pnlUSD ${pnlUSD}`); const absoluteValuePNL = Math.abs(pnlUSD); elizaLogger.info(`Sell Trade absoluteValuePNL ${absoluteValuePNL}`); @@ -579,7 +593,7 @@ export const calculateSellTradePNL = async ( maximumFractionDigits: 2, }).format(absoluteValuePNL); elizaLogger.info(`Sell Trade formattedPNL ${formattedPNL}`); - const formattedPNLUSD = `${pnlUSD < 0 ? "-" : ""}${formattedPNL}`; + const formattedPNLUSD = `${pnlUSD <= -0.005 ? "-" : ""}${formattedPNL}`; elizaLogger.info(`Sell Trade formattedPNLUSD ${formattedPNLUSD}`); return formattedPNLUSD; }; From 7494da8e82d50bbb337d7a6a7a0d26efb1b1f2ca Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 22 Feb 2025 22:23:08 -0800 Subject: [PATCH 22/22] fix lockfile --- pnpm-lock.yaml | 88 +------------------------------------------------- 1 file changed, 1 insertion(+), 87 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff6d470c8..626d63e52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,7 +26,6 @@ importers: framer-motion: specifier: ^12.4.3 version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) pg: specifier: ^8.13.3 version: 8.13.3 @@ -44,7 +43,6 @@ importers: version: 3.23.8 devDependencies: '@types/node': - specifier: ^20.17.19 specifier: ^20.17.19 version: 20.17.19 '@types/pg': @@ -53,9 +51,6 @@ importers: husky: specifier: ^9.0.11 version: 9.1.7 - husky: - specifier: ^9.0.11 - version: 9.1.7 prettier: specifier: ^3.4.2 version: 3.5.2 @@ -141,7 +136,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-coinbase: dependencies: @@ -203,7 +197,6 @@ importers: tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -216,11 +209,9 @@ importers: '@elizaos/plugin-image-generation': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0) '@elizaos/plugin-tee-log': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) '@elizaos/plugin-tee-verifiable-log': specifier: ^0.1.9 version: 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) @@ -282,7 +273,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) clients/client-github: dependencies: @@ -314,7 +304,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.2.1 version: 1.6.1(@types/node@22.13.5) @@ -346,7 +335,6 @@ importers: tsup: specifier: ^8.0.1 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^2.1.5 version: 2.1.9(@types/node@20.17.19) @@ -387,7 +375,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) vitest: specifier: ^1.0.0 version: 1.6.1(@types/node@20.17.19) @@ -437,7 +424,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) typescript: specifier: ^5.0.0 version: 5.7.3 @@ -487,7 +473,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) plugins/plugin-twitter: dependencies: @@ -500,7 +485,6 @@ importers: tsup: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - version: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) devDependencies: '@biomejs/biome': specifier: 1.5.3 @@ -562,7 +546,6 @@ importers: framer-motion: specifier: ^12.4.3 version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - version: 12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@19.0.0) @@ -621,7 +604,6 @@ importers: autoprefixer: specifier: ^10.4.19 version: 10.4.20(postcss@8.5.3) - version: 10.4.20(postcss@8.5.3) eslint: specifier: ^9.17.0 version: 9.21.0(jiti@1.21.7) @@ -649,7 +631,6 @@ importers: postcss: specifier: ^8.4.38 version: 8.5.3 - version: 8.5.3 rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.34.8) @@ -1758,8 +1739,6 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} '@humanwhocodes/retry@0.4.2': resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} @@ -2071,8 +2050,6 @@ packages: resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} engines: {node: '>= 18'} - '@octokit/graphql@7.1.1': - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} '@octokit/graphql@7.1.1': resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} engines: {node: '>= 18'} @@ -4548,8 +4525,6 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.3: - resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} eslint-import-resolver-typescript@3.8.3: resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4927,8 +4902,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.4.7: - resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} framer-motion@12.4.7: resolution: {integrity: sha512-VhrcbtcAMXfxlrjeHPpWVu2+mkcoR31e02aNSR7OUS/hZAciKa8q6o3YN2mA1h+jjscRsSyKvX6E1CiY/7OLMw==} peerDependencies: @@ -5184,11 +5157,6 @@ packages: engines: {node: '>=18'} hasBin: true - husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} - hasBin: true - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6041,8 +6009,6 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - motion-dom@12.4.5: - resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} motion-dom@12.4.5: resolution: {integrity: sha512-Q2xmhuyYug1CGTo0jdsL05EQ4RhIYXlggFS/yPhQQRNzbrhjKQ1tbjThx5Plv68aX31LsUQRq4uIkuDxdO5vRQ==} @@ -6570,8 +6536,6 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -7357,8 +7321,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} tinyglobby@0.2.12: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} @@ -8138,8 +8100,6 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod-to-json-schema@3.24.2: - resolution: {integrity: sha512-pNUqrcSxuuB3/+jBbU8qKUbTbDqYUaG1vf5cXFjbhGgoUuA1amO/y4Q8lzfOhHU8HNPK6VFJ18lBDKj3OHyDsg==} zod-to-json-schema@3.24.2: resolution: {integrity: sha512-pNUqrcSxuuB3/+jBbU8qKUbTbDqYUaG1vf5cXFjbhGgoUuA1amO/y4Q8lzfOhHU8HNPK6VFJ18lBDKj3OHyDsg==} peerDependencies: @@ -8347,7 +8307,6 @@ snapshots: json-schema: 0.4.0 secure-json-parse: 2.7.0 zod-to-json-schema: 3.24.2(zod@3.23.8) - zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: zod: 3.23.8 @@ -9519,12 +9478,10 @@ snapshots: - vue - ws - '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': '@elizaos/plugin-image-generation@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(encoding@0.1.13)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -9588,13 +9545,11 @@ snapshots: - vue - ws - '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee-log@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-sgx': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) better-sqlite3: 11.6.0 elliptic: 6.6.1 transitivePeerDependencies: @@ -9640,12 +9595,10 @@ snapshots: dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) - '@elizaos/plugin-tee': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8) dompurify: 3.2.2 elliptic: 6.6.1 ethereum-cryptography: 3.1.0 tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) uuid: 11.0.3 vitest: 2.1.5(@types/node@22.13.5) whatwg-url: 7.1.0 @@ -9701,7 +9654,6 @@ snapshots: - yaml - zod - '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': '@elizaos/plugin-tee@0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(@swc/core@1.10.18(@swc/helpers@0.5.15))(axios@1.7.9)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(jiti@1.21.7)(postcss@8.5.3)(react@19.0.0)(rollup@4.34.8)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(typescript@5.7.3)(utf-8-validate@5.0.10)(vue@3.5.13(typescript@5.7.3))(whatwg-url@7.1.0)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(yaml@2.7.0)(zod@3.23.8)': dependencies: '@elizaos/core': 0.1.9(@google-cloud/vertexai@1.9.3(encoding@0.1.13))(@langchain/core@0.3.40(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.9)(encoding@0.1.13)(react@19.0.0)(sswr@2.1.0(svelte@5.20.2))(svelte@5.20.2)(vue@3.5.13(typescript@5.7.3))(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -9713,7 +9665,6 @@ snapshots: node-cache: 5.1.2 pumpdotfun-sdk: 1.3.2(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(rollup@4.34.8)(typescript@5.7.3)(utf-8-validate@5.0.10) tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) - tsup: 8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0) whatwg-url: 7.1.0 transitivePeerDependencies: - '@google-cloud/vertexai' @@ -10004,7 +9955,6 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': @@ -10402,7 +10352,6 @@ snapshots: openai: 4.85.4(encoding@0.1.13)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.24.2(zod@3.23.8) - zod-to-json-schema: 3.24.2(zod@3.23.8) transitivePeerDependencies: - encoding - ws @@ -10467,7 +10416,6 @@ snapshots: dependencies: '@octokit/auth-token': 4.0.0 '@octokit/graphql': 7.1.1 - '@octokit/graphql': 7.1.1 '@octokit/request': 8.4.1 '@octokit/request-error': 5.1.1 '@octokit/types': 13.8.0 @@ -10484,7 +10432,6 @@ snapshots: '@octokit/types': 13.8.0 universal-user-agent: 6.0.1 - '@octokit/graphql@7.1.1': '@octokit/graphql@7.1.1': dependencies: '@octokit/request': 8.4.1 @@ -11784,7 +11731,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.13.5 + '@types/node': 20.17.19 form-data: 4.0.2 '@types/node@12.12.54': {} @@ -12144,7 +12091,6 @@ snapshots: estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 - postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -12267,7 +12213,6 @@ snapshots: jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 zod-to-json-schema: 3.24.2(zod@3.23.8) - zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) react: 19.0.0 @@ -12293,7 +12238,6 @@ snapshots: jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 zod-to-json-schema: 3.24.2(zod@3.23.8) - zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) react: 19.0.0 @@ -12452,7 +12396,6 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.5.3): autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 @@ -12461,7 +12404,6 @@ snapshots: normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.3 - postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -13456,7 +13398,6 @@ snapshots: is-bun-module: 1.3.0 stable-hash: 0.0.4 tinyglobby: 0.2.12 - tinyglobby: 0.2.12 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: @@ -13633,7 +13574,6 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -13986,10 +13926,8 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): framer-motion@12.4.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - motion-dom: 12.4.5 motion-dom: 12.4.5 motion-utils: 12.0.0 tslib: 2.8.1 @@ -14285,8 +14223,6 @@ snapshots: husky@9.1.7: {} - husky@9.1.7: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -15235,7 +15171,6 @@ snapshots: yaml: 2.7.0 zod: 3.23.8 zod-to-json-schema: 3.24.2(zod@3.23.8) - zod-to-json-schema: 3.24.2(zod@3.23.8) optionalDependencies: axios: 1.7.9 handlebars: 4.7.8 @@ -15508,7 +15443,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 - motion-dom@12.4.5: motion-dom@12.4.5: dependencies: motion-utils: 12.0.0 @@ -16016,21 +15950,17 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.3 postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 postcss: 8.5.3 - postcss: 8.5.3 postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)): dependencies: @@ -16040,20 +15970,16 @@ snapshots: postcss: 8.5.3 ts-node: 10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.3 - postcss: 8.5.3 yaml: 2.7.0 - postcss-nested@6.2.0(postcss@8.5.3): postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.3 postcss: 8.5.3 postcss-selector-parser: 6.1.2 @@ -16064,7 +15990,6 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: postcss@8.5.3: dependencies: nanoid: 3.3.8 @@ -17003,7 +16928,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) @@ -17068,7 +16992,6 @@ snapshots: openapi-types: 12.1.3 zod: 3.22.4 zod-to-json-schema: 3.24.2(zod@3.22.4) - zod-to-json-schema: 3.24.2(zod@3.22.4) transitivePeerDependencies: - '@types/express' - '@types/node' @@ -17246,7 +17169,6 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): tsup@8.3.5(@swc/core@1.10.18(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.3)(typescript@5.7.3)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) @@ -17258,19 +17180,16 @@ snapshots: joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.34.8 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 tinyglobby: 0.2.12 - tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.10.18(@swc/helpers@0.5.15) postcss: 8.5.3 - postcss: 8.5.3 typescript: 5.7.3 transitivePeerDependencies: - jiti @@ -17605,7 +17524,6 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 20.17.19 @@ -17615,7 +17533,6 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.5 @@ -17625,7 +17542,6 @@ snapshots: dependencies: esbuild: 0.24.2 postcss: 8.5.3 - postcss: 8.5.3 rollup: 4.34.8 optionalDependencies: '@types/node': 22.13.5 @@ -17957,12 +17873,10 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.24.2(zod@3.22.4): zod-to-json-schema@3.24.2(zod@3.22.4): dependencies: zod: 3.22.4 - zod-to-json-schema@3.24.2(zod@3.23.8): zod-to-json-schema@3.24.2(zod@3.23.8): dependencies: zod: 3.23.8