diff --git a/README.md b/README.md index 39c039f3d02..9a6bc01a6b7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Eliza -Eliza Banner +Eliza Banner _As seen powering [@DegenSpartanAI](https://x.com/degenspartanai) and [@MarcAIndreessen](https://x.com/pmairca)_ diff --git a/core/package.json b/core/package.json index a1da1771518..5d9416f0af9 100644 --- a/core/package.json +++ b/core/package.json @@ -169,14 +169,5 @@ "onnxruntime-node": "1.19.0", "@discordjs/opus": "github:discordjs/opus", "sharp": "^0.33.5" - }, - "optionalDependencies": { - "sharp": "0.33.5", - "sqlite-vss-darwin-arm64": "0.1.2", - "sqlite-vss-darwin-x64": "0.1.2", - "sqlite-vss-linux-arm64": "^0.1.2", - "sqlite-vss-linux-x64": "0.1.2", - "sqlite-vss-win32-arm64": "^0.1.2", - "sqlite-vss-win32-x64": "^0.1.2" } } diff --git a/core/src/actions/ask_claude.ts b/core/src/actions/askClaude.ts similarity index 99% rename from core/src/actions/ask_claude.ts rename to core/src/actions/askClaude.ts index df2966f6c16..5312297c528 100644 --- a/core/src/actions/ask_claude.ts +++ b/core/src/actions/askClaude.ts @@ -19,7 +19,7 @@ export const claudeHandlerTemplate = `{{attachments}} # Instructions: Claude, I need your help in assisting the user with their last request. Please provide a helpful, thorough response. I have no arms, so you'll have to write out any implements and take care not to omit or leave TODOs for later. Also, please don't acknowledge the request, just do it.`; -export default { +export const askClaude: Action = { name: "ASK_CLAUDE", similes: ["CLAUDE", "CALL_CLAUDE", "ANTHROPIC", "SONNET", "OPUS"], description: diff --git a/core/src/actions/continue.ts b/core/src/actions/continue.ts index 5445a78f4dc..b53c1ff6f73 100644 --- a/core/src/actions/continue.ts +++ b/core/src/actions/continue.ts @@ -30,7 +30,7 @@ Based on the following conversation, should {{agentName}} continue? YES or NO Should {{agentName}} continue? ` + booleanFooter; -export default { +export const continueAction: Action = { name: "CONTINUE", similes: ["ELABORATE", "KEEP_TALKING"], description: diff --git a/core/src/actions/follow_room.ts b/core/src/actions/followRoom.ts similarity index 99% rename from core/src/actions/follow_room.ts rename to core/src/actions/followRoom.ts index 6265b0c485d..87a9e4ea8f7 100644 --- a/core/src/actions/follow_room.ts +++ b/core/src/actions/followRoom.ts @@ -24,7 +24,7 @@ Respond with YES if: Otherwise, respond with NO. ` + booleanFooter; -export default { +export const followRoom: Action = { name: "FOLLOW_ROOM", similes: [ "FOLLOW_CHAT", diff --git a/core/src/actions/ignore.ts b/core/src/actions/ignore.ts index 398b907e7df..fde41a04f9b 100644 --- a/core/src/actions/ignore.ts +++ b/core/src/actions/ignore.ts @@ -5,7 +5,7 @@ import { type Action, } from "../core/types.ts"; -export default { +export const ignore: Action = { name: "IGNORE", similes: ["STOP_TALKING", "STOP_CHATTING", "STOP_CONVERSATION"], validate: async (_runtime: IAgentRuntime, _message: Memory) => { diff --git a/core/src/actions/imageGeneration.ts b/core/src/actions/imageGeneration.ts index 5b1551b7e1a..0ee3c879b65 100644 --- a/core/src/actions/imageGeneration.ts +++ b/core/src/actions/imageGeneration.ts @@ -7,7 +7,7 @@ import { } from "../core/types.ts"; import { generateCaption, generateImage } from "./imageGenerationUtils.ts"; -export default { +export const imageGeneration: Action = { name: "IMAGE_GEN", similes: ["GENERATE_IMAGE", "CREATE_IMAGE", "MAKE_PICTURE"], description: "Generate an image based on a prompt", diff --git a/core/src/actions/index.ts b/core/src/actions/index.ts index c6b530a3ca3..83aca44a9ed 100644 --- a/core/src/actions/index.ts +++ b/core/src/actions/index.ts @@ -1,16 +1,16 @@ -export * from "./ask_claude.ts"; -export * from "./follow_room.ts"; +export * from "./askClaude.ts"; +export * from "./followRoom.ts"; export * from "./imageGeneration.ts"; -export * from "./mute_room.ts"; +export * from "./muteRoom.ts"; export * from "./swap.ts"; -export * from "./unfollow_room.ts"; -export * from "./unmute_room.ts"; -export * from "./mute_room.ts"; +export * from "./unfollowRoom.ts"; +export * from "./unmuteRoom.ts"; +export * from "./muteRoom.ts"; export * from "./continue.ts"; -export * from "./follow_room.ts"; +export * from "./followRoom.ts"; export * from "./ignore.ts"; export * from "./imageGenerationUtils.ts"; export * from "./pumpfun.ts"; export * from "./swap.ts"; -export * from "./swapUtils.ts"; -export * from "./take_order.ts"; +export * from "./takeOrder.ts"; +export * from "./none.ts"; diff --git a/core/src/actions/mute_room.ts b/core/src/actions/muteRoom.ts similarity index 99% rename from core/src/actions/mute_room.ts rename to core/src/actions/muteRoom.ts index 13e5831f2f2..ec7021a4de3 100644 --- a/core/src/actions/mute_room.ts +++ b/core/src/actions/muteRoom.ts @@ -25,7 +25,7 @@ Respond with YES if: Otherwise, respond with NO. ` + booleanFooter; -export default { +export const muteRoom: Action = { name: "MUTE_ROOM", similes: [ "MUTE_CHAT", diff --git a/core/src/actions/none.ts b/core/src/actions/none.ts index 242bcadc755..8421e4f24fc 100644 --- a/core/src/actions/none.ts +++ b/core/src/actions/none.ts @@ -5,7 +5,7 @@ import { type Action, } from "../core/types.ts"; -export default { +export const none: Action = { name: "NONE", similes: [ "NO_ACTION", diff --git a/core/src/actions/pumpfun.ts b/core/src/actions/pumpfun.ts index 708ff73c6be..48ef541c8cd 100644 --- a/core/src/actions/pumpfun.ts +++ b/core/src/actions/pumpfun.ts @@ -1,5 +1,5 @@ import { AnchorProvider } from "@coral-xyz/anchor"; -import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet.js"; +import { Wallet } from "@coral-xyz/anchor"; import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import { CreateTokenMetadata, @@ -247,7 +247,7 @@ export default { } = content; const privateKey = runtime.getSetting("WALLET_PRIVATE_KEY")!; - const wallet = new NodeWallet( + const wallet = new Wallet( Keypair.fromSecretKey(new Uint8Array(JSON.parse(privateKey))) ); const connection = new Connection(settings.RPC_URL!); diff --git a/core/src/actions/swap.ts b/core/src/actions/swap.ts index aa91162ca04..a8540afb427 100644 --- a/core/src/actions/swap.ts +++ b/core/src/actions/swap.ts @@ -41,7 +41,7 @@ async function promptConfirmation(): Promise { return confirmSwap; } -export default { +export const executeSwap: Action = { name: "EXECUTE_SWAP", similes: ["SWAP_TOKENS", "TOKEN_SWAP", "TRADE_TOKENS", "EXCHANGE_TOKENS"], validate: async (runtime: IAgentRuntime, message: Memory) => { diff --git a/core/src/actions/swapUtils.ts b/core/src/actions/swapUtils.ts index 27e669f927a..1f025b3f6a7 100644 --- a/core/src/actions/swapUtils.ts +++ b/core/src/actions/swapUtils.ts @@ -7,13 +7,15 @@ import { RpcResponseAndContext, SimulatedTransactionResponse, TokenAmount, - VersionedTransaction + VersionedTransaction, } from "@solana/web3.js"; import settings from "../core/settings.ts"; const solAddress = settings.SOL_ADDRESS; const SLIPPAGE = settings.SLIPPAGE; -const connection = new Connection(settings.RPC_URL || "https://api.mainnet-beta.solana.com"); +const connection = new Connection( + settings.RPC_URL || "https://api.mainnet-beta.solana.com" +); const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); export async function delayedCall( diff --git a/core/src/actions/take_order.ts b/core/src/actions/takeOrder.ts similarity index 100% rename from core/src/actions/take_order.ts rename to core/src/actions/takeOrder.ts diff --git a/core/src/actions/unfollow_room.ts b/core/src/actions/unfollowRoom.ts similarity index 99% rename from core/src/actions/unfollow_room.ts rename to core/src/actions/unfollowRoom.ts index a3427903166..d3cc69d84c2 100644 --- a/core/src/actions/unfollow_room.ts +++ b/core/src/actions/unfollowRoom.ts @@ -24,7 +24,7 @@ Respond with YES if: Otherwise, respond with NO. ` + booleanFooter; -export default { +export const unfollowRoom: Action = { name: "UNFOLLOW_ROOM", similes: [ "UNFOLLOW_CHAT", diff --git a/core/src/actions/unmute_room.ts b/core/src/actions/unmuteRoom.ts similarity index 99% rename from core/src/actions/unmute_room.ts rename to core/src/actions/unmuteRoom.ts index 2ff5cf0de05..17e28e4a11d 100644 --- a/core/src/actions/unmute_room.ts +++ b/core/src/actions/unmuteRoom.ts @@ -24,7 +24,7 @@ Respond with YES if: Otherwise, respond with NO. ` + booleanFooter; -export default { +export const unmuteRoom: Action = { name: "UNMUTE_ROOM", similes: [ "UNMUTE_CHAT", diff --git a/core/src/adapters/trustScoreDatabase.ts b/core/src/adapters/trustScoreDatabase.ts index a5d707bae31..9ec19de29ac 100644 --- a/core/src/adapters/trustScoreDatabase.ts +++ b/core/src/adapters/trustScoreDatabase.ts @@ -6,143 +6,143 @@ import { load } from "./sqlite/sqlite_vec.ts"; // Define interfaces export interface Recommender { - id: string; // UUID - address: string; - solanaPubkey?: string; - telegramId?: string; - discordId?: string; - twitterId?: string; - ip?: string; + id: string; // UUID + address: string; + solanaPubkey?: string; + telegramId?: string; + discordId?: string; + twitterId?: string; + ip?: string; } export interface RecommenderMetrics { - recommenderId: string; - trustScore: number; - totalRecommendations: number; - successfulRecs: number; - avgTokenPerformance: number; - riskScore: number; - consistencyScore: number; - virtualConfidence: number; - lastUpdated: Date; + recommenderId: string; + trustScore: number; + totalRecommendations: number; + successfulRecs: number; + avgTokenPerformance: number; + riskScore: number; + consistencyScore: number; + virtualConfidence: number; + lastUpdated: Date; } export interface TokenPerformance { - tokenAddress: string; - priceChange24h: number; - volumeChange24h: number; - trade_24h_change: number; - liquidity: number; - liquidityChange24h: number; - holderChange24h: number; - rugPull: boolean; - isScam: boolean; - marketCapChange24h: number; - sustainedGrowth: boolean; - rapidDump: boolean; - suspiciousVolume: boolean; - lastUpdated: Date; + tokenAddress: string; + priceChange24h: number; + volumeChange24h: number; + trade_24h_change: number; + liquidity: number; + liquidityChange24h: number; + holderChange24h: number; + rugPull: boolean; + isScam: boolean; + marketCapChange24h: number; + sustainedGrowth: boolean; + rapidDump: boolean; + suspiciousVolume: boolean; + lastUpdated: Date; } export interface TokenRecommendation { - id: string; // UUID - recommenderId: string; - tokenAddress: string; - timestamp: Date; - initialMarketCap?: number; - initialLiquidity?: number; - initialPrice?: number; + id: string; // UUID + recommenderId: string; + tokenAddress: string; + timestamp: Date; + initialMarketCap?: number; + initialLiquidity?: number; + initialPrice?: number; } export interface RecommenderMetricsHistory { - historyId: string; // UUID - recommenderId: string; - trustScore: number; - totalRecommendations: number; - successfulRecs: number; - avgTokenPerformance: number; - riskScore: number; - consistencyScore: number; - virtualConfidence: number; - recordedAt: Date; + historyId: string; // UUID + recommenderId: string; + trustScore: number; + totalRecommendations: number; + successfulRecs: number; + avgTokenPerformance: number; + riskScore: number; + consistencyScore: number; + virtualConfidence: number; + recordedAt: Date; } export interface TradePerformance { - token_address: string; - recommender_id: string; - buy_price: number; - sell_price: number; - buy_timeStamp: string; - sell_timeStamp: string; - buy_amount: number; - sell_amount: number; - buy_sol: number; - received_sol: number; - buy_value_usd: number; - sell_value_usd: number; - profit_usd: number; - profit_percent: number; - buy_market_cap: number; - sell_market_cap: number; - market_cap_change: number; - buy_liquidity: number; - sell_liquidity: number; - liquidity_change: number; - last_updated: string; - rapidDump: boolean; + token_address: string; + recommender_id: string; + buy_price: number; + sell_price: number; + buy_timeStamp: string; + sell_timeStamp: string; + buy_amount: number; + sell_amount: number; + buy_sol: number; + received_sol: number; + buy_value_usd: number; + sell_value_usd: number; + profit_usd: number; + profit_percent: number; + buy_market_cap: number; + sell_market_cap: number; + market_cap_change: number; + buy_liquidity: number; + sell_liquidity: number; + liquidity_change: number; + last_updated: string; + rapidDump: boolean; } interface RecommenderMetricsRow { - recommender_id: string; - trust_score: number; - total_recommendations: number; - successful_recs: number; - avg_token_performance: number; - risk_score: number; - consistency_score: number; - virtual_confidence: number; - last_updated: string; + recommender_id: string; + trust_score: number; + total_recommendations: number; + successful_recs: number; + avg_token_performance: number; + risk_score: number; + consistency_score: number; + virtual_confidence: number; + last_updated: string; } interface TokenPerformanceRow { - token_address: string; - price_change_24h: number; - volume_change_24h: number; - trade_24h_change: number; - liquidity: number; - liquidity_change_24h: number; - holder_change_24h: number; - rug_pull: number; - is_scam: number; - market_cap_change24h: number; - sustained_growth: number; - rapid_dump: number; - suspicious_volume: number; - last_updated: string; + token_address: string; + price_change_24h: number; + volume_change_24h: number; + trade_24h_change: number; + liquidity: number; + liquidity_change_24h: number; + holder_change_24h: number; + rug_pull: number; + is_scam: number; + market_cap_change24h: number; + sustained_growth: number; + rapid_dump: number; + suspicious_volume: number; + last_updated: string; } export class TrustScoreDatabase { - private db: Database; - - constructor(db: Database) { - this.db = db; - load(db); - // check if the tables exist, if not create them - const tables = this.db - .prepare( - "SELECT name FROM sqlite_master WHERE type='table' AND name IN ('recommenders', 'recommender_metrics', 'token_performance', 'token_recommendations', 'recommender_metrics_history');" - ) - .all(); - if (tables.length !== 5) { - this.initializeSchema(); + private db: Database; + + constructor(db: Database) { + this.db = db; + load(db); + // check if the tables exist, if not create them + const tables = this.db + .prepare( + "SELECT name FROM sqlite_master WHERE type='table' AND name IN ('recommenders', 'recommender_metrics', 'token_performance', 'token_recommendations', 'recommender_metrics_history');" + ) + .all(); + if (tables.length !== 5) { + this.initializeSchema(); + } } - } - private initializeSchema() { - // Enable Foreign Key Support - this.db.exec(`PRAGMA foreign_keys = ON;`); + private initializeSchema() { + // Enable Foreign Key Support + this.db.exec(`PRAGMA foreign_keys = ON;`); - // Create Recommenders Table - this.db.exec(` + // Create Recommenders Table + this.db.exec(` CREATE TABLE IF NOT EXISTS recommenders ( id TEXT PRIMARY KEY, address TEXT UNIQUE NOT NULL, @@ -154,8 +154,8 @@ export class TrustScoreDatabase { ); `); - // Create RecommenderMetrics Table - this.db.exec(` + // Create RecommenderMetrics Table + this.db.exec(` CREATE TABLE IF NOT EXISTS recommender_metrics ( recommender_id TEXT PRIMARY KEY, trust_score REAL DEFAULT 0, @@ -170,8 +170,8 @@ export class TrustScoreDatabase { ); `); - // Create TokenPerformance Table - this.db.exec(` + // Create TokenPerformance Table + this.db.exec(` CREATE TABLE IF NOT EXISTS token_performance ( token_address TEXT PRIMARY KEY, price_change_24h REAL, @@ -190,8 +190,8 @@ export class TrustScoreDatabase { ); `); - // Create TokenRecommendations Table - this.db.exec(` + // Create TokenRecommendations Table + this.db.exec(` CREATE TABLE IF NOT EXISTS token_recommendations ( id TEXT PRIMARY KEY, recommender_id TEXT NOT NULL, @@ -205,8 +205,8 @@ export class TrustScoreDatabase { ); `); - // ----- Create RecommenderMetricsHistory Table ----- - this.db.exec(` + // ----- Create RecommenderMetricsHistory Table ----- + this.db.exec(` CREATE TABLE IF NOT EXISTS recommender_metrics_history ( history_id TEXT PRIMARY KEY, recommender_id TEXT NOT NULL, @@ -222,8 +222,8 @@ export class TrustScoreDatabase { ); `); - // ----- Create TradePerformance Tables ----- - this.db.exec(` + // ----- Create TradePerformance Tables ----- + this.db.exec(` CREATE TABLE IF NOT EXISTS trade ( token_address TEXT NOT NULL, recommender_id TEXT NOT NULL, @@ -253,8 +253,8 @@ export class TrustScoreDatabase { FOREIGN KEY (recommender_id) REFERENCES recommenders(id) ON DELETE CASCADE ); `); - // create trade simulation table - this.db.exec(` + // create trade simulation table + this.db.exec(` CREATE TABLE IF NOT EXISTS simulation_trade ( token_address TEXT NOT NULL, recommender_id TEXT NOT NULL, @@ -283,133 +283,135 @@ export class TrustScoreDatabase { FOREIGN KEY (recommender_id) REFERENCES recommenders(id) ON DELETE CASCADE ); `); - } - - /** - * Adds a new recommender to the database. - * @param recommender Recommender object - * @returns boolean indicating success - */ - addRecommender(recommender: Recommender): string | null { - const sql = ` + } + + /** + * Adds a new recommender to the database. + * @param recommender Recommender object + * @returns boolean indicating success + */ + addRecommender(recommender: Recommender): string | null { + const sql = ` INSERT INTO recommenders (id, address, solana_pubkey, telegram_id, discord_id, twitter_id, ip) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(address) DO NOTHING; `; - try { - const id = recommender.id || uuidv4(); - const result = this.db - .prepare(sql) - .run( - id, - recommender.address, - recommender.solanaPubkey || null, - recommender.telegramId || null, - recommender.discordId || null, - recommender.twitterId || null, - recommender.ip || null - ); - return result.changes > 0 ? id : null; - } catch (error) { - console.error("Error adding recommender:", error); - return null; + try { + const id = recommender.id || uuidv4(); + const result = this.db + .prepare(sql) + .run( + id, + recommender.address, + recommender.solanaPubkey || null, + recommender.telegramId || null, + recommender.discordId || null, + recommender.twitterId || null, + recommender.ip || null + ); + return result.changes > 0 ? id : null; + } catch (error) { + console.error("Error adding recommender:", error); + return null; + } } - } - - /** - * Retrieves a recommender by any identifier. - * @param identifier Any of the recommender's identifiers - * @returns Recommender object or null - */ - getRecommender(identifier: string): Recommender | null { - const sql = ` + + /** + * Retrieves a recommender by any identifier. + * @param identifier Any of the recommender's identifiers + * @returns Recommender object or null + */ + getRecommender(identifier: string): Recommender | null { + const sql = ` SELECT * FROM recommenders WHERE id = ? OR address = ? OR solana_pubkey = ? OR telegram_id = ? OR discord_id = ? OR twitter_id = ?; `; - const recommender = this.db - .prepare(sql) - .get( - identifier, - identifier, - identifier, - identifier, - identifier, - identifier - ) as Recommender | undefined; - return recommender || null; - } - - /** - * Initializes metrics for a recommender if not present. - * @param recommenderId Recommender's UUID - */ - initializeRecommenderMetrics(recommenderId: string): boolean { - const sql = ` + const recommender = this.db + .prepare(sql) + .get( + identifier, + identifier, + identifier, + identifier, + identifier, + identifier + ) as Recommender | undefined; + return recommender || null; + } + + /** + * Initializes metrics for a recommender if not present. + * @param recommenderId Recommender's UUID + */ + initializeRecommenderMetrics(recommenderId: string): boolean { + const sql = ` INSERT OR IGNORE INTO recommender_metrics (recommender_id) VALUES (?); `; - try { - const result = this.db.prepare(sql).run(recommenderId); - return result.changes > 0; - } catch (error) { - console.error("Error initializing recommender metrics:", error); - return false; + try { + const result = this.db.prepare(sql).run(recommenderId); + return result.changes > 0; + } catch (error) { + console.error("Error initializing recommender metrics:", error); + return false; + } } - } - - /** - * Retrieves metrics for a recommender. - * @param recommenderId Recommender's UUID - * @returns RecommenderMetrics object or null - */ - getRecommenderMetrics(recommenderId: string): RecommenderMetrics | null { - const sql = `SELECT * FROM recommender_metrics WHERE recommender_id = ?;`; - const row = this.db.prepare(sql).get(recommenderId) as - | RecommenderMetricsRow - | undefined; - if (!row) return null; - - return { - recommenderId: row.recommender_id, - trustScore: row.trust_score, - totalRecommendations: row.total_recommendations, - successfulRecs: row.successful_recs, - avgTokenPerformance: row.avg_token_performance, - riskScore: row.risk_score, - consistencyScore: row.consistency_score, - virtualConfidence: row.virtual_confidence, - lastUpdated: new Date(row.last_updated), - }; - } - - /** - * Logs the current metrics of a recommender into the history table. - * @param recommenderId Recommender's UUID - */ - logRecommenderMetricsHistory(recommenderId: string): void { - // Retrieve current metrics - const currentMetrics = this.getRecommenderMetrics(recommenderId); - if (!currentMetrics) { - console.warn(`No metrics found for recommender ID: ${recommenderId}`); - return; + + /** + * Retrieves metrics for a recommender. + * @param recommenderId Recommender's UUID + * @returns RecommenderMetrics object or null + */ + getRecommenderMetrics(recommenderId: string): RecommenderMetrics | null { + const sql = `SELECT * FROM recommender_metrics WHERE recommender_id = ?;`; + const row = this.db.prepare(sql).get(recommenderId) as + | RecommenderMetricsRow + | undefined; + if (!row) return null; + + return { + recommenderId: row.recommender_id, + trustScore: row.trust_score, + totalRecommendations: row.total_recommendations, + successfulRecs: row.successful_recs, + avgTokenPerformance: row.avg_token_performance, + riskScore: row.risk_score, + consistencyScore: row.consistency_score, + virtualConfidence: row.virtual_confidence, + lastUpdated: new Date(row.last_updated), + }; } - // Create a history entry - const history: RecommenderMetricsHistory = { - historyId: uuidv4(), - recommenderId: currentMetrics.recommenderId, - trustScore: currentMetrics.trustScore, - totalRecommendations: currentMetrics.totalRecommendations, - successfulRecs: currentMetrics.successfulRecs, - avgTokenPerformance: currentMetrics.avgTokenPerformance, - riskScore: currentMetrics.riskScore, - consistencyScore: currentMetrics.consistencyScore, - virtualConfidence: currentMetrics.virtualConfidence, - recordedAt: new Date(), // Current timestamp - }; - - // Insert into recommender_metrics_history table - const sql = ` + /** + * Logs the current metrics of a recommender into the history table. + * @param recommenderId Recommender's UUID + */ + logRecommenderMetricsHistory(recommenderId: string): void { + // Retrieve current metrics + const currentMetrics = this.getRecommenderMetrics(recommenderId); + if (!currentMetrics) { + console.warn( + `No metrics found for recommender ID: ${recommenderId}` + ); + return; + } + + // Create a history entry + const history: RecommenderMetricsHistory = { + historyId: uuidv4(), + recommenderId: currentMetrics.recommenderId, + trustScore: currentMetrics.trustScore, + totalRecommendations: currentMetrics.totalRecommendations, + successfulRecs: currentMetrics.successfulRecs, + avgTokenPerformance: currentMetrics.avgTokenPerformance, + riskScore: currentMetrics.riskScore, + consistencyScore: currentMetrics.consistencyScore, + virtualConfidence: currentMetrics.virtualConfidence, + recordedAt: new Date(), // Current timestamp + }; + + // Insert into recommender_metrics_history table + const sql = ` INSERT INTO recommender_metrics_history ( history_id, recommender_id, @@ -422,37 +424,37 @@ export class TrustScoreDatabase { recorded_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); `; - try { - this.db - .prepare(sql) - .run( - history.historyId, - history.recommenderId, - history.trustScore, - history.totalRecommendations, - history.successfulRecs, - history.avgTokenPerformance, - history.riskScore, - history.consistencyScore, - history.recordedAt.toISOString() - ); - console.log( - `Logged metrics history for recommender ID: ${recommenderId}` - ); - } catch (error) { - console.error("Error logging recommender metrics history:", error); + try { + this.db + .prepare(sql) + .run( + history.historyId, + history.recommenderId, + history.trustScore, + history.totalRecommendations, + history.successfulRecs, + history.avgTokenPerformance, + history.riskScore, + history.consistencyScore, + history.recordedAt.toISOString() + ); + console.log( + `Logged metrics history for recommender ID: ${recommenderId}` + ); + } catch (error) { + console.error("Error logging recommender metrics history:", error); + } } - } - /** - * Updates metrics for a recommender. - * @param metrics RecommenderMetrics object - */ - updateRecommenderMetrics(metrics: RecommenderMetrics): void { - // Log current metrics before updating - this.logRecommenderMetricsHistory(metrics.recommenderId); + /** + * Updates metrics for a recommender. + * @param metrics RecommenderMetrics object + */ + updateRecommenderMetrics(metrics: RecommenderMetrics): void { + // Log current metrics before updating + this.logRecommenderMetricsHistory(metrics.recommenderId); - const sql = ` + const sql = ` UPDATE recommender_metrics SET trust_score = ?, total_recommendations = ?, @@ -463,34 +465,34 @@ export class TrustScoreDatabase { last_updated = CURRENT_TIMESTAMP WHERE recommender_id = ?; `; - try { - this.db - .prepare(sql) - .run( - metrics.trustScore, - metrics.totalRecommendations, - metrics.successfulRecs, - metrics.avgTokenPerformance, - metrics.riskScore, - metrics.consistencyScore, - metrics.recommenderId - ); - console.log( - `Updated metrics for recommender ID: ${metrics.recommenderId}` - ); - } catch (error) { - console.error("Error updating recommender metrics:", error); + try { + this.db + .prepare(sql) + .run( + metrics.trustScore, + metrics.totalRecommendations, + metrics.successfulRecs, + metrics.avgTokenPerformance, + metrics.riskScore, + metrics.consistencyScore, + metrics.recommenderId + ); + console.log( + `Updated metrics for recommender ID: ${metrics.recommenderId}` + ); + } catch (error) { + console.error("Error updating recommender metrics:", error); + } } - } - // ----- TokenPerformance Methods ----- + // ----- TokenPerformance Methods ----- - /** - * Adds or updates token performance metrics. - * @param performance TokenPerformance object - */ - upsertTokenPerformance(performance: TokenPerformance): boolean { - const sql = ` + /** + * Adds or updates token performance metrics. + * @param performance TokenPerformance object + */ + upsertTokenPerformance(performance: TokenPerformance): boolean { + const sql = ` INSERT INTO token_performance ( token_address, price_change_24h, @@ -522,67 +524,69 @@ export class TrustScoreDatabase { suspicious_volume = excluded.suspicious_volume, last_updated = CURRENT_TIMESTAMP; `; - try { - this.db.prepare(sql).run( - performance.tokenAddress, - performance.priceChange24h, - performance.volumeChange24h, - performance.liquidityChange24h, - performance.holderChange24h, // Ensure column name matches schema - performance.rugPull ? 1 : 0, - performance.isScam ? 1 : 0, - performance.marketCapChange24h, - performance.sustainedGrowth ? 1 : 0, - performance.rapidDump ? 1 : 0, - performance.suspiciousVolume ? 1 : 0 - ); - console.log(`Upserted token performance for ${performance.tokenAddress}`); - return true; - } catch (error) { - console.error("Error upserting token performance:", error); - return false; + try { + this.db.prepare(sql).run( + performance.tokenAddress, + performance.priceChange24h, + performance.volumeChange24h, + performance.liquidityChange24h, + performance.holderChange24h, // Ensure column name matches schema + performance.rugPull ? 1 : 0, + performance.isScam ? 1 : 0, + performance.marketCapChange24h, + performance.sustainedGrowth ? 1 : 0, + performance.rapidDump ? 1 : 0, + performance.suspiciousVolume ? 1 : 0 + ); + console.log( + `Upserted token performance for ${performance.tokenAddress}` + ); + return true; + } catch (error) { + console.error("Error upserting token performance:", error); + return false; + } + } + + /** + * Retrieves token performance metrics. + * @param tokenAddress Token's address + * @returns TokenPerformance object or null + */ + getTokenPerformance(tokenAddress: string): TokenPerformance | null { + const sql = `SELECT * FROM token_performance WHERE token_address = ?;`; + const row = this.db.prepare(sql).get(tokenAddress) as + | TokenPerformanceRow + | undefined; + if (!row) return null; + + return { + tokenAddress: row.token_address, + priceChange24h: row.price_change_24h, + volumeChange24h: row.volume_change_24h, + trade_24h_change: row.trade_24h_change, + liquidity: row.liquidity, + liquidityChange24h: row.liquidity_change_24h, + holderChange24h: row.holder_change_24h, + rugPull: row.rug_pull === 1, + isScam: row.is_scam === 1, + marketCapChange24h: row.market_cap_change24h, + sustainedGrowth: row.sustained_growth === 1, + rapidDump: row.rapid_dump === 1, + suspiciousVolume: row.suspicious_volume === 1, + lastUpdated: new Date(row.last_updated), + }; } - } - - /** - * Retrieves token performance metrics. - * @param tokenAddress Token's address - * @returns TokenPerformance object or null - */ - getTokenPerformance(tokenAddress: string): TokenPerformance | null { - const sql = `SELECT * FROM token_performance WHERE token_address = ?;`; - const row = this.db.prepare(sql).get(tokenAddress) as - | TokenPerformanceRow - | undefined; - if (!row) return null; - - return { - tokenAddress: row.token_address, - priceChange24h: row.price_change_24h, - volumeChange24h: row.volume_change_24h, - trade_24h_change: row.trade_24h_change, - liquidity: row.liquidity, - liquidityChange24h: row.liquidity_change_24h, - holderChange24h: row.holder_change_24h, - rugPull: row.rug_pull === 1, - isScam: row.is_scam === 1, - marketCapChange24h: row.market_cap_change24h, - sustainedGrowth: row.sustained_growth === 1, - rapidDump: row.rapid_dump === 1, - suspiciousVolume: row.suspicious_volume === 1, - lastUpdated: new Date(row.last_updated), - }; - } - - // ----- TokenRecommendations Methods ----- - - /** - * Adds a new token recommendation. - * @param recommendation TokenRecommendation object - * @returns boolean indicating success - */ - addTokenRecommendation(recommendation: TokenRecommendation): boolean { - const sql = ` + + // ----- TokenRecommendations Methods ----- + + /** + * Adds a new token recommendation. + * @param recommendation TokenRecommendation object + * @returns boolean indicating success + */ + addTokenRecommendation(recommendation: TokenRecommendation): boolean { + const sql = ` INSERT INTO token_recommendations ( id, recommender_id, @@ -593,170 +597,173 @@ export class TrustScoreDatabase { initial_price ) VALUES (?, ?, ?, ?, ?, ?, ?); `; - try { - this.db - .prepare(sql) - .run( - recommendation.id || uuidv4(), - recommendation.recommenderId, - recommendation.tokenAddress, - recommendation.timestamp || new Date(), - recommendation.initialMarketCap || null, - recommendation.initialLiquidity || null, - recommendation.initialPrice || null - ); - return true; - } catch (error) { - console.error("Error adding token recommendation:", error); - return false; + try { + this.db + .prepare(sql) + .run( + recommendation.id || uuidv4(), + recommendation.recommenderId, + recommendation.tokenAddress, + recommendation.timestamp || new Date(), + recommendation.initialMarketCap || null, + recommendation.initialLiquidity || null, + recommendation.initialPrice || null + ); + return true; + } catch (error) { + console.error("Error adding token recommendation:", error); + return false; + } + } + + /** + * Retrieves all recommendations made by a recommender. + * @param recommenderId Recommender's UUID + * @returns Array of TokenRecommendation objects + */ + getRecommendationsByRecommender( + recommenderId: string + ): TokenRecommendation[] { + const sql = `SELECT * FROM token_recommendations WHERE recommender_id = ? ORDER BY timestamp DESC;`; + const rows = this.db.prepare(sql).all(recommenderId) as Array<{ + id: string; + recommender_id: string; + token_address: string; + timestamp: string; + initial_market_cap: number | null; + initial_liquidity: number | null; + initial_price: number | null; + }>; + + return rows.map((row) => ({ + id: row.id, + recommenderId: row.recommender_id, + tokenAddress: row.token_address, + timestamp: new Date(row.timestamp), + initialMarketCap: row.initial_market_cap, + initialLiquidity: row.initial_liquidity, + initialPrice: row.initial_price, + })); } - } - - /** - * Retrieves all recommendations made by a recommender. - * @param recommenderId Recommender's UUID - * @returns Array of TokenRecommendation objects - */ - getRecommendationsByRecommender( - recommenderId: string - ): TokenRecommendation[] { - const sql = `SELECT * FROM token_recommendations WHERE recommender_id = ? ORDER BY timestamp DESC;`; - const rows = this.db.prepare(sql).all(recommenderId) as Array<{ - id: string; - recommender_id: string; - token_address: string; - timestamp: string; - initial_market_cap: number | null; - initial_liquidity: number | null; - initial_price: number | null; - }>; - - return rows.map((row) => ({ - id: row.id, - recommenderId: row.recommender_id, - tokenAddress: row.token_address, - timestamp: new Date(row.timestamp), - initialMarketCap: row.initial_market_cap, - initialLiquidity: row.initial_liquidity, - initialPrice: row.initial_price, - })); - } - - /** - * Retrieves all recommendations for a specific token. - * @param tokenAddress Token's address - * @returns Array of TokenRecommendation objects - */ - getRecommendationsByToken(tokenAddress: string): TokenRecommendation[] { - const sql = `SELECT * FROM token_recommendations WHERE token_address = ? ORDER BY timestamp DESC;`; - const rows = this.db.prepare(sql).all(tokenAddress) as Array<{ - id: string; - recommender_id: string; - token_address: string; - timestamp: string; - initial_market_cap: number | null; - initial_liquidity: number | null; - initial_price: number | null; - }>; - - return rows.map((row) => ({ - id: row.id, - recommenderId: row.recommender_id, - tokenAddress: row.token_address, - timestamp: new Date(row.timestamp), - initialMarketCap: row.initial_market_cap ?? undefined, - initialLiquidity: row.initial_liquidity ?? undefined, - initialPrice: row.initial_price ?? undefined, - })); - } - - /** - * Retrieves all recommendations within a specific timeframe. - * @param startDate Start date - * @param endDate End date - * @returns Array of TokenRecommendation objects - */ - getRecommendationsByDateRange( - startDate: Date, - endDate: Date - ): TokenRecommendation[] { - const sql = ` + + /** + * Retrieves all recommendations for a specific token. + * @param tokenAddress Token's address + * @returns Array of TokenRecommendation objects + */ + getRecommendationsByToken(tokenAddress: string): TokenRecommendation[] { + const sql = `SELECT * FROM token_recommendations WHERE token_address = ? ORDER BY timestamp DESC;`; + const rows = this.db.prepare(sql).all(tokenAddress) as Array<{ + id: string; + recommender_id: string; + token_address: string; + timestamp: string; + initial_market_cap: number | null; + initial_liquidity: number | null; + initial_price: number | null; + }>; + + return rows.map((row) => ({ + id: row.id, + recommenderId: row.recommender_id, + tokenAddress: row.token_address, + timestamp: new Date(row.timestamp), + initialMarketCap: row.initial_market_cap ?? undefined, + initialLiquidity: row.initial_liquidity ?? undefined, + initialPrice: row.initial_price ?? undefined, + })); + } + + /** + * Retrieves all recommendations within a specific timeframe. + * @param startDate Start date + * @param endDate End date + * @returns Array of TokenRecommendation objects + */ + getRecommendationsByDateRange( + startDate: Date, + endDate: Date + ): TokenRecommendation[] { + const sql = ` SELECT * FROM token_recommendations WHERE timestamp BETWEEN ? AND ? ORDER BY timestamp DESC; `; - const rows = this.db - .prepare(sql) - .all(startDate.toISOString(), endDate.toISOString()) as Array<{ - id: string; - recommender_id: string; - token_address: string; - timestamp: string; - initial_market_cap: number | null; - initial_liquidity: number | null; - initial_price: number | null; - }>; - - return rows.map((row) => ({ - id: row.id, - recommenderId: row.recommender_id, - tokenAddress: row.token_address, - timestamp: new Date(row.timestamp), - initialMarketCap: row.initial_market_cap ?? undefined, - initialLiquidity: row.initial_liquidity ?? undefined, - initialPrice: row.initial_price ?? undefined, - })); - } - - /** - * Retrieves historical metrics for a recommender. - * @param recommenderId Recommender's UUID - * @returns Array of RecommenderMetricsHistory objects - */ - getRecommenderMetricsHistory( - recommenderId: string - ): RecommenderMetricsHistory[] { - const sql = ` + const rows = this.db + .prepare(sql) + .all(startDate.toISOString(), endDate.toISOString()) as Array<{ + id: string; + recommender_id: string; + token_address: string; + timestamp: string; + initial_market_cap: number | null; + initial_liquidity: number | null; + initial_price: number | null; + }>; + + return rows.map((row) => ({ + id: row.id, + recommenderId: row.recommender_id, + tokenAddress: row.token_address, + timestamp: new Date(row.timestamp), + initialMarketCap: row.initial_market_cap ?? undefined, + initialLiquidity: row.initial_liquidity ?? undefined, + initialPrice: row.initial_price ?? undefined, + })); + } + + /** + * Retrieves historical metrics for a recommender. + * @param recommenderId Recommender's UUID + * @returns Array of RecommenderMetricsHistory objects + */ + getRecommenderMetricsHistory( + recommenderId: string + ): RecommenderMetricsHistory[] { + const sql = ` SELECT * FROM recommender_metrics_history WHERE recommender_id = ? ORDER BY recorded_at DESC; `; - const rows = this.db.prepare(sql).all(recommenderId) as Array<{ - history_id: string; - recommender_id: string; - trust_score: number; - total_recommendations: number; - successful_recs: number; - avg_token_performance: number; - risk_score: number; - consistency_score: number; - virtual_confidence: number; - recorded_at: string; - }>; - - return rows.map((row) => ({ - historyId: row.history_id, - recommenderId: row.recommender_id, - trustScore: row.trust_score, - totalRecommendations: row.total_recommendations, - successfulRecs: row.successful_recs, - avgTokenPerformance: row.avg_token_performance, - riskScore: row.risk_score, - consistencyScore: row.consistency_score, - virtualConfidence: row.virtual_confidence, - recordedAt: new Date(row.recorded_at), - })); - } - - /** - * Inserts a new trade performance into the specified table. - * @param trade The TradePerformance object containing trade details. - * @param isSimulation Whether the trade is a simulation. If true, inserts into simulation_trade; otherwise, into trade. - * @returns boolean indicating success. - */ - addTradePerformance(trade: TradePerformance, isSimulation: boolean): boolean { - const tableName = isSimulation ? "simulation_trade" : "trade"; - const sql = ` + const rows = this.db.prepare(sql).all(recommenderId) as Array<{ + history_id: string; + recommender_id: string; + trust_score: number; + total_recommendations: number; + successful_recs: number; + avg_token_performance: number; + risk_score: number; + consistency_score: number; + virtual_confidence: number; + recorded_at: string; + }>; + + return rows.map((row) => ({ + historyId: row.history_id, + recommenderId: row.recommender_id, + trustScore: row.trust_score, + totalRecommendations: row.total_recommendations, + successfulRecs: row.successful_recs, + avgTokenPerformance: row.avg_token_performance, + riskScore: row.risk_score, + consistencyScore: row.consistency_score, + virtualConfidence: row.virtual_confidence, + recordedAt: new Date(row.recorded_at), + })); + } + + /** + * Inserts a new trade performance into the specified table. + * @param trade The TradePerformance object containing trade details. + * @param isSimulation Whether the trade is a simulation. If true, inserts into simulation_trade; otherwise, into trade. + * @returns boolean indicating success. + */ + addTradePerformance( + trade: TradePerformance, + isSimulation: boolean + ): boolean { + const tableName = isSimulation ? "simulation_trade" : "trade"; + const sql = ` INSERT INTO ${tableName} ( token_address, recommender_id, @@ -782,74 +789,74 @@ export class TrustScoreDatabase { rapidDump ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); `; - try { - this.db - .prepare(sql) - .run( - trade.token_address, - trade.recommender_id, - trade.buy_price, - trade.sell_price || null, - trade.buy_timeStamp, - trade.sell_timeStamp || null, - trade.buy_amount, - trade.sell_amount || null, - trade.buy_sol, - trade.received_sol || null, - trade.buy_value_usd, - trade.sell_value_usd || null, - trade.profit_usd || null, - trade.profit_percent || null, - trade.buy_market_cap, - trade.sell_market_cap || null, - trade.market_cap_change || null, - trade.buy_liquidity, - trade.sell_liquidity || null, - trade.liquidity_change || null, - trade.last_updated || new Date().toISOString(), - trade.rapidDump ? 1 : 0 - ); - console.log(`Inserted trade into ${tableName}:`, trade); - return true; - } catch (error) { - console.error(`Error inserting trade into ${tableName}:`, error); - return false; + try { + this.db + .prepare(sql) + .run( + trade.token_address, + trade.recommender_id, + trade.buy_price, + trade.sell_price || null, + trade.buy_timeStamp, + trade.sell_timeStamp || null, + trade.buy_amount, + trade.sell_amount || null, + trade.buy_sol, + trade.received_sol || null, + trade.buy_value_usd, + trade.sell_value_usd || null, + trade.profit_usd || null, + trade.profit_percent || null, + trade.buy_market_cap, + trade.sell_market_cap || null, + trade.market_cap_change || null, + trade.buy_liquidity, + trade.sell_liquidity || null, + trade.liquidity_change || null, + trade.last_updated || new Date().toISOString(), + trade.rapidDump ? 1 : 0 + ); + console.log(`Inserted trade into ${tableName}:`, trade); + return true; + } catch (error) { + console.error(`Error inserting trade into ${tableName}:`, error); + return false; + } } - } - - /** - * Updates an existing trade with sell details. - * @param tokenAddress The address of the token. - * @param recommenderId The UUID of the recommender. - * @param buyTimeStamp The timestamp when the buy occurred. - * @param sellDetails An object containing sell-related details. - * @param isSimulation Whether the trade is a simulation. If true, updates in simulation_trade; otherwise, in trade. - * @returns boolean indicating success. - */ - - updateTradePerformanceOnSell( - tokenAddress: string, - recommenderId: string, - buyTimeStamp: string, - sellDetails: { - sell_price: number; - sell_timeStamp: string; - sell_amount: number; - received_sol: number; - sell_value_usd: number; - profit_usd: number; - profit_percent: number; - sell_market_cap: number; - market_cap_change: number; - sell_liquidity: number; - liquidity_change: number; - rapidDump: boolean; - sell_recommender_id: string | null; - }, - isSimulation: boolean - ): boolean { - const tableName = isSimulation ? "simulation_trade" : "trade"; - const sql = ` + + /** + * Updates an existing trade with sell details. + * @param tokenAddress The address of the token. + * @param recommenderId The UUID of the recommender. + * @param buyTimeStamp The timestamp when the buy occurred. + * @param sellDetails An object containing sell-related details. + * @param isSimulation Whether the trade is a simulation. If true, updates in simulation_trade; otherwise, in trade. + * @returns boolean indicating success. + */ + + updateTradePerformanceOnSell( + tokenAddress: string, + recommenderId: string, + buyTimeStamp: string, + sellDetails: { + sell_price: number; + sell_timeStamp: string; + sell_amount: number; + received_sol: number; + sell_value_usd: number; + profit_usd: number; + profit_percent: number; + sell_market_cap: number; + market_cap_change: number; + sell_liquidity: number; + liquidity_change: number; + rapidDump: boolean; + sell_recommender_id: string | null; + }, + isSimulation: boolean + ): boolean { + const tableName = isSimulation ? "simulation_trade" : "trade"; + const sql = ` UPDATE ${tableName} SET sell_price = ?, @@ -870,103 +877,103 @@ export class TrustScoreDatabase { AND recommender_id = ? AND buy_timeStamp = ?; `; - try { - const result = this.db - .prepare(sql) - .run( - sellDetails.sell_price, - sellDetails.sell_timeStamp, - sellDetails.sell_amount, - sellDetails.received_sol, - sellDetails.sell_value_usd, - sellDetails.profit_usd, - sellDetails.profit_percent, - sellDetails.sell_market_cap, - sellDetails.market_cap_change, - sellDetails.sell_liquidity, - sellDetails.liquidity_change, - sellDetails.rapidDump ? 1 : 0, - tokenAddress, - recommenderId, - buyTimeStamp - ); + try { + const result = this.db + .prepare(sql) + .run( + sellDetails.sell_price, + sellDetails.sell_timeStamp, + sellDetails.sell_amount, + sellDetails.received_sol, + sellDetails.sell_value_usd, + sellDetails.profit_usd, + sellDetails.profit_percent, + sellDetails.sell_market_cap, + sellDetails.market_cap_change, + sellDetails.sell_liquidity, + sellDetails.liquidity_change, + sellDetails.rapidDump ? 1 : 0, + tokenAddress, + recommenderId, + buyTimeStamp + ); + + if (result.changes === 0) { + console.warn( + `No trade found to update in ${tableName} for token: ${tokenAddress}, recommender: ${recommenderId}, buyTimeStamp: ${buyTimeStamp}` + ); + return false; + } + + console.log(`Updated trade in ${tableName}:`, { + token_address: tokenAddress, + recommender_id: recommenderId, + buy_timeStamp: buyTimeStamp, + ...sellDetails, + }); + return true; + } catch (error) { + console.error(`Error updating trade in ${tableName}:`, error); + return false; + } + } - if (result.changes === 0) { - console.warn( - `No trade found to update in ${tableName} for token: ${tokenAddress}, recommender: ${recommenderId}, buyTimeStamp: ${buyTimeStamp}` - ); - return false; - } - - console.log(`Updated trade in ${tableName}:`, { - token_address: tokenAddress, - recommender_id: recommenderId, - buy_timeStamp: buyTimeStamp, - ...sellDetails, - }); - return true; - } catch (error) { - console.error(`Error updating trade in ${tableName}:`, error); - return false; + //getTradePerformance + + /** + * Retrieves trade performance metrics. + * @param tokenAddress Token's address + * @param recommenderId Recommender's UUID + * @param buyTimeStamp Timestamp when the buy occurred + * @param isSimulation Whether the trade is a simulation. If true, retrieves from simulation_trade; otherwise, from trade. + * @returns TradePerformance object or null + */ + + getTradePerformance( + tokenAddress: string, + recommenderId: string, + buyTimeStamp: string, + isSimulation: boolean + ): TradePerformance | null { + const tableName = isSimulation ? "simulation_trade" : "trade"; + const sql = `SELECT * FROM ${tableName} WHERE token_address = ? AND recommender_id = ? AND buy_timeStamp = ?;`; + const row = this.db + .prepare(sql) + .get(tokenAddress, recommenderId, buyTimeStamp) as + | TradePerformance + | undefined; + if (!row) return null; + + return { + token_address: row.token_address, + recommender_id: row.recommender_id, + buy_price: row.buy_price, + sell_price: row.sell_price, + buy_timeStamp: row.buy_timeStamp, + sell_timeStamp: row.sell_timeStamp, + buy_amount: row.buy_amount, + sell_amount: row.sell_amount, + buy_sol: row.buy_sol, + received_sol: row.received_sol, + buy_value_usd: row.buy_value_usd, + sell_value_usd: row.sell_value_usd, + profit_usd: row.profit_usd, + profit_percent: row.profit_percent, + buy_market_cap: row.buy_market_cap, + sell_market_cap: row.sell_market_cap, + market_cap_change: row.market_cap_change, + buy_liquidity: row.buy_liquidity, + sell_liquidity: row.sell_liquidity, + liquidity_change: row.liquidity_change, + last_updated: row.last_updated, + rapidDump: row.rapidDump, + }; + } + + /** + * Close the database connection gracefully. + */ + closeConnection(): void { + this.db.close(); } - } - - //getTradePerformance - - /** - * Retrieves trade performance metrics. - * @param tokenAddress Token's address - * @param recommenderId Recommender's UUID - * @param buyTimeStamp Timestamp when the buy occurred - * @param isSimulation Whether the trade is a simulation. If true, retrieves from simulation_trade; otherwise, from trade. - * @returns TradePerformance object or null - */ - - getTradePerformance( - tokenAddress: string, - recommenderId: string, - buyTimeStamp: string, - isSimulation: boolean - ): TradePerformance | null { - const tableName = isSimulation ? "simulation_trade" : "trade"; - const sql = `SELECT * FROM ${tableName} WHERE token_address = ? AND recommender_id = ? AND buy_timeStamp = ?;`; - const row = this.db - .prepare(sql) - .get(tokenAddress, recommenderId, buyTimeStamp) as - | TradePerformance - | undefined; - if (!row) return null; - - return { - token_address: row.token_address, - recommender_id: row.recommender_id, - buy_price: row.buy_price, - sell_price: row.sell_price, - buy_timeStamp: row.buy_timeStamp, - sell_timeStamp: row.sell_timeStamp, - buy_amount: row.buy_amount, - sell_amount: row.sell_amount, - buy_sol: row.buy_sol, - received_sol: row.received_sol, - buy_value_usd: row.buy_value_usd, - sell_value_usd: row.sell_value_usd, - profit_usd: row.profit_usd, - profit_percent: row.profit_percent, - buy_market_cap: row.buy_market_cap, - sell_market_cap: row.sell_market_cap, - market_cap_change: row.market_cap_change, - buy_liquidity: row.buy_liquidity, - sell_liquidity: row.sell_liquidity, - liquidity_change: row.liquidity_change, - last_updated: row.last_updated, - rapidDump: row.rapidDump, - }; - } - - /** - * Close the database connection gracefully. - */ - closeConnection(): void { - this.db.close(); - } } diff --git a/core/src/clients/direct/index.ts b/core/src/clients/direct/index.ts index beb5102c53a..daec4c9d85f 100644 --- a/core/src/clients/direct/index.ts +++ b/core/src/clients/direct/index.ts @@ -254,4 +254,4 @@ class DirectClient { } } -export default DirectClient; +export { DirectClient }; diff --git a/core/src/clients/index.ts b/core/src/clients/index.ts index dcb0205ff53..8d0110f0b95 100644 --- a/core/src/clients/index.ts +++ b/core/src/clients/index.ts @@ -1,5 +1,3 @@ -import DirectClient from "./direct/index.ts"; - export { TwitterGenerationClient, TwitterInteractionClient, @@ -7,4 +5,4 @@ export { } from "./twitter/index.ts"; export { TelegramClient } from "./telegram/index.ts"; export { DiscordClient } from "./discord/index.ts"; -export { DirectClient }; +export { DirectClient } from "./direct/index.ts"; diff --git a/core/src/core/actions.ts b/core/src/core/actions.ts index f561f30358d..18197752354 100644 --- a/core/src/core/actions.ts +++ b/core/src/core/actions.ts @@ -1,11 +1,12 @@ import { names, uniqueNamesGenerator } from "unique-names-generator"; import { Action, ActionExample } from "./types.ts"; -// import cont from "../actions/continue.ts"; -import ignore from "../actions/ignore.ts"; -import none from "../actions/none.ts"; +import * as DefaultActions from "../actions/index.ts"; -export const defaultActions: Action[] = [/* cont, */ ignore, none]; +export const defaultActions: Action[] = [ + DefaultActions.ignore, + DefaultActions.none, +]; /** * Composes a set of example conversations based on provided actions and a specified count. diff --git a/core/src/core/providers.ts b/core/src/core/providers.ts index cc8def411fd..d187bac509e 100644 --- a/core/src/core/providers.ts +++ b/core/src/core/providers.ts @@ -1,7 +1,7 @@ -import time from "../providers/time.ts"; +import { timeProvider } from "../providers/time.ts"; import { IAgentRuntime, State, type Memory, type Provider } from "./types.ts"; -export const defaultProviders: Provider[] = [time]; +export const defaultProviders: Provider[] = [timeProvider]; /** * Formats provider outputs into a string which can be injected into the context. diff --git a/core/src/core/runtime.ts b/core/src/core/runtime.ts index 85525ee330a..0c286d5b1d6 100644 --- a/core/src/core/runtime.ts +++ b/core/src/core/runtime.ts @@ -270,7 +270,11 @@ export class AgentRuntime implements IAgentRuntime { }); if (!this.getSetting("OPENAI_API_KEY") && !this.llamaService) { - console.log("No OpenAI key found, using LlamaLocal for agent", this.agentId, this.character.name); + console.log( + "No OpenAI key found, using LlamaLocal for agent", + this.agentId, + this.character.name + ); this.llamaService = LlamaService.getInstance(); } diff --git a/core/src/index.ts b/core/src/index.ts index 64b321723c6..06f56838998 100644 --- a/core/src/index.ts +++ b/core/src/index.ts @@ -2,37 +2,26 @@ export * from "./actions/index.ts"; export * from "./clients/index.ts"; export * from "./adapters/index.ts"; +export * from "./providers/index.ts"; + +import * as Action from "./actions/index.ts"; +import * as Client from "./clients/index.ts"; +import * as Adapter from "./adapters/index.ts"; +import * as Provider from "./providers/index.ts"; import Database from "better-sqlite3"; import fs from "fs"; import yargs from "yargs"; -import askClaude from "./actions/ask_claude.ts"; -import follow_room from "./actions/follow_room.ts"; -import imageGeneration from "./actions/imageGeneration.ts"; -import mute_room from "./actions/mute_room.ts"; -import swap from "./actions/swap.ts"; -import unfollow_room from "./actions/unfollow_room.ts"; -import unmute_room from "./actions/unmute_room.ts"; -import { PostgresDatabaseAdapter } from "./adapters/postgres.ts"; -import { SqliteDatabaseAdapter } from "./adapters/sqlite.ts"; -import DirectClient from "./clients/direct/index.ts"; -import { DiscordClient } from "./clients/discord/index.ts"; -import { TelegramClient } from "./clients/telegram/src/index.ts"; // Added Telegram import -import { TwitterGenerationClient } from "./clients/twitter/generate.ts"; -import { TwitterInteractionClient } from "./clients/twitter/interactions.ts"; -import { TwitterSearchClient } from "./clients/twitter/search.ts"; + import { wait } from "./clients/twitter/utils.ts"; import { defaultActions } from "./core/actions.ts"; import defaultCharacter from "./core/defaultCharacter.ts"; import { AgentRuntime } from "./core/runtime.ts"; import settings from "./core/settings.ts"; import { Character, IAgentRuntime, ModelProvider } from "./core/types.ts"; // Added IAgentRuntime -import boredomProvider from "./providers/boredom.ts"; -import timeProvider from "./providers/time.ts"; -import walletProvider from "./providers/wallet.ts"; + import readline from "readline"; -import orderbook from "./providers/order_book.ts"; -import tokenProvider from "./providers/token.ts"; + interface Arguments { character?: string; characters?: string; @@ -76,7 +65,7 @@ const characterPaths = argv.characters?.split(",").map((path) => path.trim()); const characters = []; -const directClient = new DirectClient(); +const directClient = new Client.DirectClient(); directClient.start(3000); if (characterPaths?.length > 0) { @@ -112,11 +101,11 @@ async function startAgent(character: Character) { let db; if (process.env.POSTGRES_URL) { // const db = new SqliteDatabaseAdapter(new Database("./db.sqlite")); - db = new PostgresDatabaseAdapter({ + db = new Adapter.PostgresDatabaseAdapter({ connectionString: process.env.POSTGRES_URL, }); } else { - db = new SqliteDatabaseAdapter(new Database("./db.sqlite")); + db = new Adapter.SqliteDatabaseAdapter(new Database("./db.sqlite")); // Debug adapter // const loggingDb = createLoggingDatabaseAdapter(db); } @@ -127,16 +116,20 @@ async function startAgent(character: Character) { modelProvider: character.modelProvider, evaluators: [], character, - providers: [timeProvider, boredomProvider, walletProvider], + providers: [ + Provider.timeProvider, + Provider.boredomProvider, + Provider.walletProvider, + ], actions: [ ...defaultActions, - askClaude, - follow_room, - unfollow_room, - unmute_room, - mute_room, - imageGeneration, - swap, + Action.askClaude, + Action.followRoom, + Action.unfollowRoom, + Action.unmuteRoom, + Action.muteRoom, + Action.imageGeneration, + Action.executeSwap, ], }); @@ -147,17 +140,17 @@ async function startAgent(character: Character) { evaluators: [], character, providers: [ - timeProvider, - boredomProvider, - walletProvider, - orderbook, - tokenProvider, + Provider.timeProvider, + Provider.boredomProvider, + Provider.walletProvider, + Provider.orderBookProvider, + Provider.tokenProvider, ], actions: [...defaultActions], }); function startDiscord(runtime: IAgentRuntime) { - const discordClient = new DiscordClient(runtime); + const discordClient = new Client.DiscordClient(runtime); return discordClient; } @@ -177,7 +170,7 @@ async function startAgent(character: Character) { try { console.log("Creating new TelegramClient instance..."); - const telegramClient = new TelegramClient(runtime, botToken); + const telegramClient = new Client.TelegramClient(runtime, botToken); console.log("Calling start() on TelegramClient..."); await telegramClient.start(); @@ -197,13 +190,17 @@ async function startAgent(character: Character) { async function startTwitter(runtime) { console.log("Starting search client"); - const twitterSearchClient = new TwitterSearchClient(runtime); + const twitterSearchClient = new Client.TwitterSearchClient(runtime); await wait(); console.log("Starting interaction client"); - const twitterInteractionClient = new TwitterInteractionClient(runtime); + const twitterInteractionClient = new Client.TwitterInteractionClient( + runtime + ); await wait(); console.log("Starting generation client"); - const twitterGenerationClient = new TwitterGenerationClient(runtime); + const twitterGenerationClient = new Client.TwitterGenerationClient( + runtime + ); return { twitterInteractionClient, diff --git a/core/src/providers/balances.ts b/core/src/providers/balances.ts index 3eb81d18df9..10aa2f09bf1 100644 --- a/core/src/providers/balances.ts +++ b/core/src/providers/balances.ts @@ -1,6 +1,9 @@ // TokenBalanceProvider.ts import { Connection, PublicKey } from "@solana/web3.js"; -import { getTokenBalances, getTokenPriceInSol } from "../services/tokenUtils"; +import { + getTokenBalances, + getTokenPriceInSol, +} from "../services/tokenUtils.ts"; import fetch from "cross-fetch"; interface Item { diff --git a/core/src/providers/boredom.ts b/core/src/providers/boredom.ts index b4788b1d362..ec0c6072a4d 100644 --- a/core/src/providers/boredom.ts +++ b/core/src/providers/boredom.ts @@ -272,7 +272,7 @@ const negativeWords = [ "fuck up", ]; -const boredom: Provider = { +const boredomProvider: Provider = { get: async (runtime: IAgentRuntime, message: Memory, state?: State) => { const agentId = runtime.agentId; const agentName = state?.agentName || "The agent"; @@ -340,4 +340,4 @@ const boredom: Provider = { }, }; -export default boredom; +export { boredomProvider }; diff --git a/core/src/providers/index.ts b/core/src/providers/index.ts new file mode 100644 index 00000000000..d746a5bc604 --- /dev/null +++ b/core/src/providers/index.ts @@ -0,0 +1,6 @@ +export * from "./boredom.ts"; +export * from "./time.ts"; +export * from "./wallet.ts"; +export * from "./orderBook.ts"; +export * from "./token.ts"; +export * from "./balances.ts"; diff --git a/core/src/providers/order_book.ts b/core/src/providers/orderBook.ts similarity index 95% rename from core/src/providers/order_book.ts rename to core/src/providers/orderBook.ts index 297498dd840..6fa49a753cd 100644 --- a/core/src/providers/order_book.ts +++ b/core/src/providers/orderBook.ts @@ -11,7 +11,7 @@ interface Order { price: number; } -const orderbook: Provider = { +const orderBookProvider: Provider = { get: async (runtime: IAgentRuntime, message: Memory, _state?: State) => { const userId = message.userId; @@ -40,4 +40,4 @@ const orderbook: Provider = { }, }; -export default orderbook; +export { orderBookProvider }; diff --git a/core/src/providers/time.ts b/core/src/providers/time.ts index 3fdfa6c7654..96ae7f803b5 100644 --- a/core/src/providers/time.ts +++ b/core/src/providers/time.ts @@ -1,6 +1,6 @@ import { IAgentRuntime, Memory, Provider, State } from "../core/types.ts"; -const time: Provider = { +const timeProvider: Provider = { get: async (_runtime: IAgentRuntime, _message: Memory, _state?: State) => { const currentDate = new Date(); const currentTime = currentDate.toLocaleTimeString("en-US"); @@ -9,4 +9,4 @@ const time: Provider = { }, }; -export default time; +export { timeProvider }; diff --git a/core/src/providers/token.ts b/core/src/providers/token.ts index 035b2092122..aec150473c7 100644 --- a/core/src/providers/token.ts +++ b/core/src/providers/token.ts @@ -814,4 +814,4 @@ const tokenProvider: Provider = { }, }; -export default tokenProvider; +export { tokenProvider }; diff --git a/core/src/providers/wallet.ts b/core/src/providers/wallet.ts index 0f5e240cf89..8f18bdcb115 100644 --- a/core/src/providers/wallet.ts +++ b/core/src/providers/wallet.ts @@ -285,4 +285,4 @@ const walletProvider: Provider = { }; // Module exports -export default walletProvider; +export { walletProvider }; diff --git a/core/tsconfig.json b/core/tsconfig.json index 0aec855d2ee..43b1ed20e5b 100644 --- a/core/tsconfig.json +++ b/core/tsconfig.json @@ -1,28 +1,28 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "es2022", - "lib": ["es2023", "dom"], - "types": ["node"], - "moduleResolution": "bundler", - "outDir": "./dist", - "rootDir": "./src", - "strict": false, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": false, - "allowImportingTsExtensions": true, - "declaration": true, - "emitDeclarationOnly": true, - "resolveJsonModule": true, - "noImplicitAny": false, - "allowJs": true, - "checkJs": false, - "noEmitOnError": false, - "moduleDetection": "force", - "allowArbitraryExtensions": true, - "typeRoots": ["./node_modules/@types", "./types"] - }, - "include": ["src/**/*",], - "exclude": ["node_modules", "dist", "src/**/*.d.ts", "types/**/*.test.ts"] -} +{ + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "lib": ["es2023", "dom"], + "types": ["node"], + "moduleResolution": "bundler", + "outDir": "./dist", + "rootDir": "./src", + "strict": false, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": false, + "allowImportingTsExtensions": true, + "declaration": true, + "emitDeclarationOnly": true, + "resolveJsonModule": true, + "noImplicitAny": false, + "allowJs": true, + "checkJs": false, + "noEmitOnError": false, + "moduleDetection": "force", + "allowArbitraryExtensions": true, + "typeRoots": ["./node_modules/@types", "./types"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "src/**/*.d.ts", "types/**/*.test.ts"] +} diff --git a/package.json b/package.json index 1bdf354f53a..9df3b4cbcf4 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,5 @@ }, "engines": { "node": ">=22" - }, - "dependencies": { - "@types/node": "^22.8.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec17bed153e..2b44084f931 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,10 +7,6 @@ settings: importers: .: - dependencies: - '@types/node': - specifier: ^22.8.6 - version: 22.8.6 devDependencies: husky: specifier: ^9.1.6 @@ -104,7 +100,7 @@ importers: version: 0.0.13 ai: specifier: ^3.4.23 - version: 3.4.30(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.2.0)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) + version: 3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.2.0)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8) alawmulaw: specifier: 6.0.0 version: 6.0.0 @@ -312,23 +308,10 @@ importers: youtube-dl-exec: specifier: 3.0.10 version: 3.0.10 - optionalDependencies: - sharp: - specifier: 0.33.5 - version: 0.33.5 - sqlite-vss-darwin-arm64: - specifier: 0.1.2 - version: 0.1.2 - sqlite-vss-darwin-x64: - specifier: 0.1.2 - version: 0.1.2 - sqlite-vss-linux-x64: - specifier: 0.1.2 - version: 0.1.2 devDependencies: '@eslint/js': specifier: ^9.13.0 - version: 9.13.0 + version: 9.14.0 '@rollup/plugin-commonjs': specifier: 25.0.8 version: 25.0.8(rollup@2.79.2) @@ -385,7 +368,7 @@ importers: version: 9.1.0(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-prettier: specifier: 5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@3.3.3) + version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@3.3.3) itty-router: specifier: 5.0.18 version: 5.0.18 @@ -527,8 +510,8 @@ packages: resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} engines: {node: '>=18'} - '@ai-sdk/react@0.0.69': - resolution: {integrity: sha512-v3FvlxyzOHEV2a0iU6CAY4W3fm11I6RJwYONptN28/DFFxUX+q+7JqFaK+s0RoDQOCdgAkz5qaNzMeGjfJo+cg==} + '@ai-sdk/react@0.0.70': + resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -1839,6 +1822,10 @@ packages: resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3125,6 +3112,12 @@ packages: '@types/emscripten@1.39.13': resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -3239,9 +3232,6 @@ packages: '@types/node@22.8.4': resolution: {integrity: sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==} - '@types/node@22.8.6': - resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3557,8 +3547,8 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@3.4.30: - resolution: {integrity: sha512-Io3SZvvYjvCh3S/b3IuZUNVVBf9rU/fgh2JXdMs1vIMf4IdgreGW9XQtuXJi5jc+Mpe0Lotf4R9ll+krX5fsaQ==} + ai@3.4.31: + resolution: {integrity: sha512-vRVlYLnCVpcFX2QMun1kstnZSZzeMoxPvhMriBDjt8loqrsv7iLa55fHO3gv99unrbT8/xKdhd0wQceCimd3zA==} engines: {node: '>=18'} peerDependencies: openai: ^4.42.0 @@ -4464,6 +4454,10 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + copy-text-to-clipboard@3.2.0: resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} engines: {node: '>=12'} @@ -6178,6 +6172,11 @@ packages: engines: {node: '>=8'} hasBin: true + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -7590,8 +7589,8 @@ packages: resolution: {integrity: sha512-vmEOvxwiH8tlOcv4SyE8RH34rI5/nWVaigUeAUPawC6f0+HoDthwI0vkMu4tbtsZrXq6QXFfrkhjofzKEs5tpA==} engines: {node: ^18 || ^20 || >= 21} - node-api-headers@1.3.0: - resolution: {integrity: sha512-8Bviwtw4jNhv0B2qDjj4M5e6GyAuGtxsmZTrFJu3S3Z0+oHwIgSUdIKkKJmZd+EbMo7g3v4PLBbrjxwmZOqMBg==} + node-api-headers@1.4.0: + resolution: {integrity: sha512-u83U3WnRbBpWlhc0sQbpF3slHRLV/a6/OXByc+QzHcLxiDiJUWLuKGZp4/ntZUchnXGOCnCq++JUEtwb1/tyow==} node-bitmap@0.0.1: resolution: {integrity: sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==} @@ -7899,8 +7898,8 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - ora@8.1.0: - resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} engines: {node: '>=18'} os-tmpdir@1.0.2: @@ -9005,8 +9004,8 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regex@4.3.3: - resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} regexpu-core@6.1.1: resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} @@ -9551,21 +9550,6 @@ packages: sqlite-vec@0.1.4-alpha.2: resolution: {integrity: sha512-FAdsljvZHdSK4w5wWYiRoVOmnaatO0m2HHRNk1P0y4kl1Nb/MzWvMJriZwa/Kj8sEqFpIwHWg/+woRKB0X1jhg==} - sqlite-vss-darwin-arm64@0.1.2: - resolution: {integrity: sha512-zyDk9eg33nBABrUC4cqQ7el8KJaRPzsqp8Y/nGZ0CAt7o1PMqLoCOgREorill5MGiZEBmLqxdAgw0O2MFwq4mw==} - cpu: [arm64] - os: [darwin] - - sqlite-vss-darwin-x64@0.1.2: - resolution: {integrity: sha512-w+ODOH2dNkyO6UaGclwC0jwNf/FBsKaE53XKJ7dFmpOvlvO0/9sA1stkWXygykRVWwa3UD8ow0qbQpRwdOFyqg==} - cpu: [x64] - os: [darwin] - - sqlite-vss-linux-x64@0.1.2: - resolution: {integrity: sha512-y1qktcHAZcfN1nYMcF5os/cCRRyaisaNc2C9I3ceLKLPAqUWIocsOdD5nNK/dIeGPag/QeT2ZItJ6uYWciLiAg==} - cpu: [x64] - os: [linux] - srcset@4.0.0: resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} engines: {node: '>=12'} @@ -9850,6 +9834,10 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -10444,8 +10432,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.96.0: - resolution: {integrity: sha512-gvn84AfQ4f6vUeNWmFuRp3vGERyxK4epADKTaAo60K0EQbY/YBNQbXH3Ji/ZRK5M25O/XneAOuChF4xQZjQ4xA==} + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10778,11 +10766,12 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.69(react@18.2.0)(zod@3.23.8)': + '@ai-sdk/react@0.0.70(react@18.2.0)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) swr: 2.2.5(react@18.2.0) + throttleit: 2.1.0 optionalDependencies: react: 18.2.0 zod: 3.23.8 @@ -11025,7 +11014,7 @@ snapshots: agentkeepalive: 4.5.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -11973,7 +11962,7 @@ snapshots: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -12073,7 +12062,7 @@ snapshots: '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(acorn@8.14.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.6.3) '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.2.0) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.0) + babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -12082,34 +12071,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.96.0) + copy-webpack-plugin: 11.0.0(webpack@5.96.1) core-js: 3.39.0 - css-loader: 6.11.0(webpack@5.96.0) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.96.0) + css-loader: 6.11.0(webpack@5.96.1) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.96.1) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.96.0) + file-loader: 6.2.0(webpack@5.96.1) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.3(webpack@5.96.0) + html-webpack-plugin: 5.6.3(webpack@5.96.1) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.2(webpack@5.96.0) + mini-css-extract-plugin: 2.9.2(webpack@5.96.1) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.96.0) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.96.1) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.0) + react-dev-utils: 12.0.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.1) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.2.0)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.2.0))(webpack@5.96.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.2.0))(webpack@5.96.1) react-router: 5.3.4(react@18.2.0) react-router-config: 5.1.1(react-router@5.3.4(react@18.2.0))(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) @@ -12117,15 +12106,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.6 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(webpack@5.96.0) + terser-webpack-plugin: 5.3.10(webpack@5.96.1) tslib: 2.8.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.0))(webpack@5.96.0) - webpack: 5.96.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) + webpack: 5.96.1 webpack-bundle-analyzer: 4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - webpack-dev-server: 4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.96.0) + webpack-dev-server: 4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.96.1) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.96.0) + webpackbar: 5.0.2(webpack@5.96.1) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -12167,7 +12156,7 @@ snapshots: '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.96.0) + file-loader: 6.2.0(webpack@5.96.1) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -12183,9 +12172,9 @@ snapshots: tslib: 2.8.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.0))(webpack@5.96.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) vfile: 6.0.3 - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -12237,7 +12226,7 @@ snapshots: tslib: 2.8.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -12278,7 +12267,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) tslib: 2.8.0 utility-types: 3.11.0 - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -12310,7 +12299,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.8.0 - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -12660,7 +12649,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) utility-types: 3.11.0 - webpack: 5.96.0 + webpack: 5.96.1 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -12701,7 +12690,7 @@ snapshots: '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(acorn@8.14.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@svgr/webpack': 8.1.0(typescript@5.6.3) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.96.0) + file-loader: 6.2.0(webpack@5.96.1) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -12714,9 +12703,9 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.8.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.0))(webpack@5.96.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) utility-types: 3.11.0 - webpack: 5.96.0 + webpack: 5.96.1 optionalDependencies: '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: @@ -12855,6 +12844,8 @@ snapshots: '@eslint/js@9.13.0': {} + '@eslint/js@9.14.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.2': @@ -13003,7 +12994,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -13016,14 +13007,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.8.6)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -13048,7 +13039,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -13066,7 +13057,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.8.6 + '@types/node': 22.8.4 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13088,7 +13079,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -13158,7 +13149,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -13289,7 +13280,7 @@ snapshots: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -14518,16 +14509,16 @@ snapshots: '@types/better-sqlite3@7.6.11': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/chrome@0.0.278': dependencies: @@ -14537,15 +14528,15 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.1 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/connect@3.4.38': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/cors@2.8.17': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/debug@4.1.12': dependencies: @@ -14555,6 +14546,16 @@ snapshots: '@types/emscripten@1.39.13': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -14563,14 +14564,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express-serve-static-core@5.0.1': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -14599,11 +14600,11 @@ snapshots: '@types/fluent-ffmpeg@2.1.27': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/gtag.js@0.0.12': {} @@ -14627,7 +14628,7 @@ snapshots: '@types/http-proxy@1.17.15': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/istanbul-lib-coverage@2.0.6': {} @@ -14662,12 +14663,12 @@ snapshots: '@types/node-fetch@2.6.11': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 form-data: 4.0.1 '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/node@10.17.60': {} @@ -14683,10 +14684,6 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.8.6': - dependencies: - undici-types: 6.19.8 - '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -14733,12 +14730,12 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/serve-index@1.9.4': dependencies: @@ -14747,23 +14744,23 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/sql.js@1.4.9': dependencies: '@types/emscripten': 1.39.13 - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/stack-utils@2.0.3': {} '@types/tar@6.1.13': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 minipass: 4.2.8 '@types/unist@2.0.11': {} @@ -14776,11 +14773,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/ws@8.5.12': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 '@types/yargs-parser@21.0.3': {} @@ -14790,7 +14787,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 optional: true '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': @@ -15090,11 +15087,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.4.30(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.2.0)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8): + ai@3.4.31(openai@4.69.0(encoding@0.1.13)(zod@3.23.8))(react@18.2.0)(sswr@2.1.0(svelte@5.1.9))(svelte@5.1.9)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.26 '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) - '@ai-sdk/react': 0.0.69(react@18.2.0)(zod@3.23.8) + '@ai-sdk/react': 0.0.70(react@18.2.0)(zod@3.23.8) '@ai-sdk/solid': 0.0.54(zod@3.23.8) '@ai-sdk/svelte': 0.0.57(svelte@5.1.9)(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) @@ -15356,12 +15353,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.0): + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1): dependencies: '@babel/core': 7.26.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.96.0 + webpack: 5.96.1 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -15898,7 +15895,7 @@ snapshots: fs-extra: 11.2.0 lodash.isplainobject: 4.0.6 memory-stream: 1.0.0 - node-api-headers: 1.3.0 + node-api-headers: 1.4.0 npmlog: 6.0.2 rc: 1.2.8 semver: 7.6.3 @@ -16106,9 +16103,11 @@ snapshots: cookie@0.7.1: {} + cookie@0.7.2: {} + copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.96.0): + copy-webpack-plugin@11.0.0(webpack@5.96.1): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -16116,7 +16115,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.96.0 + webpack: 5.96.1 core-js-compat@3.39.0: dependencies: @@ -16225,7 +16224,7 @@ snapshots: dependencies: postcss: 8.4.47 - css-loader@6.11.0(webpack@5.96.0): + css-loader@6.11.0(webpack@5.96.1): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -16236,9 +16235,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.96.0 + webpack: 5.96.1 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.96.0): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.96.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -16246,7 +16245,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.96.0 + webpack: 5.96.1 optionalDependencies: clean-css: 5.3.3 @@ -16831,13 +16830,14 @@ snapshots: dependencies: eslint: 9.13.0(jiti@1.21.6) - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@3.3.3): dependencies: eslint: 9.13.0(jiti@1.21.6) prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: + '@types/eslint': 9.6.1 eslint-config-prettier: 9.1.0(eslint@9.13.0(jiti@1.21.6)) eslint-scope@5.1.1: @@ -16981,7 +16981,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 require-like: 0.1.2 event-emitter@0.3.5: @@ -17010,7 +17010,7 @@ snapshots: cross-spawn: 7.0.3 get-stream: 6.0.0 human-signals: 2.1.0 - is-stream: 2.0.1 + is-stream: 2.0.0 merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 @@ -17198,11 +17198,11 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-loader@6.2.0(webpack@5.96.0): + file-loader@6.2.0(webpack@5.96.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.96.0 + webpack: 5.96.1 file-uri-to-path@1.0.0: {} @@ -17304,7 +17304,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.1): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -17320,7 +17320,7 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.3 - webpack: 5.96.0 + webpack: 5.96.1 optionalDependencies: eslint: 9.13.0(jiti@1.21.6) @@ -17975,7 +17975,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.96.0): + html-webpack-plugin@5.6.3(webpack@5.96.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -17983,7 +17983,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.96.0 + webpack: 5.96.1 htmlparser2@6.1.0: dependencies: @@ -18131,6 +18131,11 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -18473,7 +18478,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -18501,7 +18506,7 @@ snapshots: chalk: 4.1.2 create-jest: 29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) exit: 0.1.2 - import-local: 3.1.0 + import-local: 3.2.0 jest-config: 29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 @@ -18543,40 +18548,9 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.8.6)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)): - dependencies: - '@babel/core': 7.26.0 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) - 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.8.6 - ts-node: 10.9.2(@types/node@22.8.4)(typescript@5.6.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-diff@29.7.0: dependencies: - chalk: 4.1.2 + chalk: 4.1.0 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 @@ -18598,7 +18572,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -18608,7 +18582,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.8.6 + '@types/node': 22.8.4 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -18647,7 +18621,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -18682,7 +18656,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -18710,7 +18684,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -18756,7 +18730,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -18775,7 +18749,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.8.6 + '@types/node': 22.8.4 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18784,13 +18758,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.8.6 + '@types/node': 22.8.4 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -18799,7 +18773,7 @@ snapshots: dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) '@jest/types': 29.6.3 - import-local: 3.1.0 + import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@types/node@22.8.4)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' @@ -19893,11 +19867,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.2(webpack@5.96.0): + mini-css-extract-plugin@2.9.2(webpack@5.96.1): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.96.0 + webpack: 5.96.1 miniflare@3.20241022.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: @@ -20056,7 +20030,7 @@ snapshots: array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 - minimatch: 3.1.2 + minimatch: 3.0.5 mustache@4.2.0: {} @@ -20120,7 +20094,7 @@ snapshots: node-addon-api@8.2.1: {} - node-api-headers@1.3.0: {} + node-api-headers@1.4.0: {} node-bitmap@0.0.1: {} @@ -20192,7 +20166,7 @@ snapshots: nanoid: 5.0.8 node-addon-api: 8.2.1 octokit: 4.0.2 - ora: 8.1.0 + ora: 8.1.1 pretty-ms: 9.1.0 proper-lockfile: 4.1.2 semver: 7.6.3 @@ -20377,7 +20351,7 @@ snapshots: '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 axios: 1.7.7(debug@4.3.7) - chalk: 4.1.2 + chalk: 4.1.0 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 @@ -20476,7 +20450,7 @@ snapshots: oniguruma-to-js@0.4.3: dependencies: - regex: 4.3.3 + regex: 4.4.0 only-allow@1.2.1: dependencies: @@ -20521,7 +20495,7 @@ snapshots: agentkeepalive: 4.5.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) optionalDependencies: zod: 3.23.8 transitivePeerDependencies: @@ -20541,9 +20515,9 @@ snapshots: ora@5.3.0: dependencies: bl: 4.1.0 - chalk: 4.1.2 + chalk: 4.1.0 cli-cursor: 3.1.0 - cli-spinners: 2.9.2 + cli-spinners: 2.6.1 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 @@ -20561,7 +20535,7 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ora@8.1.0: + ora@8.1.1: dependencies: chalk: 5.3.0 cli-cursor: 5.0.0 @@ -21058,13 +21032,13 @@ snapshots: postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.96.0): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.96.1): dependencies: cosmiconfig: 8.3.6(typescript@5.6.3) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - typescript @@ -21372,7 +21346,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.8.6 + '@types/node': 22.8.4 long: 5.2.3 protocols@2.0.1: {} @@ -21545,7 +21519,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dev-utils@12.0.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.0): + react-dev-utils@12.0.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.1): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -21556,7 +21530,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(webpack@5.96.1) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -21571,7 +21545,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.96.0 + webpack: 5.96.1 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -21614,11 +21588,11 @@ snapshots: dependencies: react: 18.2.0 - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.2.0))(webpack@5.96.0): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.2.0))(webpack@5.96.1): dependencies: '@babel/runtime': 7.26.0 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.2.0)' - webpack: 5.96.0 + webpack: 5.96.1 react-router-config@5.1.1(react-router@5.3.4(react@18.2.0))(react@18.2.0): dependencies: @@ -21803,7 +21777,7 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 - regex@4.3.3: {} + regex@4.4.0: {} regexpu-core@6.1.1: dependencies: @@ -22511,15 +22485,6 @@ snapshots: sqlite-vec-linux-x64: 0.1.4-alpha.2 sqlite-vec-windows-x64: 0.1.4-alpha.2 - sqlite-vss-darwin-arm64@0.1.2: - optional: true - - sqlite-vss-darwin-x64@0.1.2: - optional: true - - sqlite-vss-linux-x64@0.1.2: - optional: true - srcset@4.0.0: {} srt@0.0.3: @@ -22798,14 +22763,14 @@ snapshots: temp-dir@1.0.0: {} - terser-webpack-plugin@5.3.10(webpack@5.96.0): + terser-webpack-plugin@5.3.10(webpack@5.96.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.96.0 + webpack: 5.96.1 terser@5.36.0: dependencies: @@ -22826,6 +22791,8 @@ snapshots: text-table@0.2.0: {} + throttleit@2.1.0: {} + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -22885,7 +22852,7 @@ snapshots: agentkeepalive: 4.5.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.6.7(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -23217,14 +23184,14 @@ snapshots: url-join@4.0.1: {} - url-loader@4.1.1(file-loader@6.2.0(webpack@5.96.0))(webpack@5.96.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.96.0 + webpack: 5.96.1 optionalDependencies: - file-loader: 6.2.0(webpack@5.96.0) + file-loader: 6.2.0(webpack@5.96.1) url-parse@1.5.10: dependencies: @@ -23395,16 +23362,16 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@5.3.4(webpack@5.96.0): + webpack-dev-middleware@5.3.4(webpack@5.96.1): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.96.0 + webpack: 5.96.1 - webpack-dev-server@4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.96.0): + webpack-dev-server@4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.96.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -23434,10 +23401,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.96.0) + webpack-dev-middleware: 5.3.4(webpack@5.96.1) ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.96.0 + webpack: 5.96.1 transitivePeerDependencies: - bufferutil - debug @@ -23452,8 +23419,9 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.96.0: + webpack@5.96.1: dependencies: + '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 @@ -23473,7 +23441,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.96.0) + terser-webpack-plugin: 5.3.10(webpack@5.96.1) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -23481,13 +23449,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.96.0): + webpackbar@5.0.2(webpack@5.96.1): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.96.0 + webpack: 5.96.1 websocket-driver@0.7.4: dependencies: @@ -23734,7 +23702,7 @@ snapshots: youch@3.3.4: dependencies: - cookie: 0.7.1 + cookie: 0.7.2 mustache: 4.2.0 stacktracey: 2.1.8