diff --git a/.env.example b/.env.example index 470925b1..42f9af8c 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,23 @@ DRY_RUN=1 # Required Gateway Intents: Server Members, Message Content, Presence DISCORD_TOKEN= +# Telegram Configuration +# TELEGRAM_STARTUP_CHAT_ID: Chat ID where startup notifications will be sent +TELEGRAM_STARTUP_CHAT_ID= + +# GramJS Configuration (required for both bot and user clients) +# TELEGRAM_TOKEN: Bot token from @BotFather (required for bot mode) +TELEGRAM_TOKEN= + +# Get these from https://my.telegram.org/apps +TELEGRAM_API_ID= +TELEGRAM_API_HASH= + +# Optional: Session string for user authentication +# After first successful interactive login, the app will provide a session string +# Save it here to avoid interactive login in subsequent runs +TELEGRAM_USER_SESSION= + # Hyperliquid Trading Configuration # HYPERLIQUID_MAIN_ADDRESS: Your main Hyperliquid address (format: 0x...) # HYPERLIQUID_WALLET_ADDRESS: Your wallet address for trading (format: 0x...) diff --git a/.vscode/settings.json b/.vscode/settings.json index 09791a4e..5dce7580 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,5 +9,8 @@ "search.exclude": { "**/node_modules": true }, - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + } } diff --git a/examples/example-telegram.ts b/examples/example-telegram.ts new file mode 100644 index 00000000..9ac9cb25 --- /dev/null +++ b/examples/example-telegram.ts @@ -0,0 +1,189 @@ +import { Orchestrator } from "../packages/core/src/core/orchestrator"; +import { HandlerRole } from "../packages/core/src/core/types"; +import { TelegramClient } from "../packages/core/src/core/io/telegram"; +import { RoomManager } from "../packages/core/src/core/room-manager"; +import { ChromaVectorDB } from "../packages/core/src/core/vector-db"; +import { MessageProcessor } from "../packages/core/src/core/processors/message-processor"; +import { LLMClient } from "../packages/core/src/core/llm-client"; +import { env } from "../packages/core/src/core/env"; +import { LogLevel } from "../packages/core/src/core/types"; +import chalk from "chalk"; +import { defaultCharacter } from "../packages/core/src/core/character"; +import { z } from "zod"; +import readline from "readline"; +import { MongoDb } from "../packages/core/src/core/db/mongo-db"; +import { Consciousness } from "../packages/core/src/core/consciousness"; +import { SchedulerService } from "../packages/core/src/core/schedule-service"; +import { Logger } from "../packages/core/src/core/logger"; + + +async function main() { + const loglevel = LogLevel.DEBUG; + + // Ensure startup chat ID is set + if (!env.TELEGRAM_STARTUP_CHAT_ID) { + console.warn(chalk.yellow("āš ļø No TELEGRAM_STARTUP_CHAT_ID set - startup message will be skipped")); + } + + // Initialize core dependencies + const vectorDb = new ChromaVectorDB("telegram_agent", { + chromaUrl: "http://localhost:8000", + logLevel: loglevel, + }); + + await vectorDb.purge(); // Clear previous session data + + const roomManager = new RoomManager(vectorDb); + + const llmClient = new LLMClient({ + // model: "openrouter:deepseek/deepseek-r1", // Using a supported model + model: "openrouter:deepseek/deepseek-r1-distill-llama-70b", + temperature: 0.3, + }); + + // Initialize processor with default character personality + const processor = new MessageProcessor( + llmClient, + defaultCharacter, + loglevel + ); + const scheduledTaskDb = new MongoDb( + "mongodb://localhost:27017", + "myApp", + "scheduled_tasks" + ); + + await scheduledTaskDb.connect(); + console.log(chalk.green("āœ… Scheduled task database connected")); + + await scheduledTaskDb.deleteAll(); + + // Initialize core system + const orchestrator = new Orchestrator( + roomManager, + vectorDb, + processor, + scheduledTaskDb, + { + level: loglevel, + enableColors: true, + enableTimestamp: true, + } + ); + + const scheduler = new SchedulerService( + { + logger: new Logger({ + level: loglevel, + enableColors: true, + enableTimestamp: true, + }), + orchestratorDb: scheduledTaskDb, + roomManager: roomManager, + vectorDb: vectorDb, + }, + orchestrator, + 10000 + ); + + // Set up Telegram user client with credentials + const telegram = new TelegramClient( + { + session: env.TELEGRAM_USER_SESSION, + bot_token: env.TELEGRAM_TOKEN, + api_id: parseInt(env.TELEGRAM_API_ID as string), + api_hash: env.TELEGRAM_API_HASH, + is_bot: false, + }, + loglevel, + ); + + // Set up Telegram bot client with credentials + // const telegram = new TelegramClient( + // { + // bot_token: env.TELEGRAM_TOKEN, + // api_id: parseInt(env.TELEGRAM_API_ID as string), + // api_hash: env.TELEGRAM_API_HASH, + // is_bot: true, + // session: undefined, + // }, + // loglevel, + // ); + + // Wait for login to complete before setting up handlers + await telegram.initialize(); + + orchestrator.registerIOHandler({ + name: "telegram_send_message", + role: HandlerRole.OUTPUT, + execute: async (data: unknown) => { + const messageData = data as { + content: string; + chatId: number; + }; + return telegram.createSendMessageOutput().handler(messageData); + }, + outputSchema: z + .object({ + content: z.string(), + chatId: z.number().optional().describe("The chat ID for the message"), + }) + .describe("This is for sending a message."), + }); + + // Register chat list scraper handler + orchestrator.registerIOHandler({ + name: "telegram_chat_list_scraper", + role: HandlerRole.INPUT, + execute: async () => { + try { + console.log(chalk.blue("šŸ“Š Fetching chat list...")); + const result = await telegram.createChatListScraper().handler(); + return result; + } catch (error) { + console.error(chalk.red("Error in chat list scraper:"), error); + return null; + } + } + }); + + scheduler.start(); + + await scheduler.scheduleTaskInDb( + "sleever", + "telegram_chat_list_scraper", + {}, + 60000 // 1 minute + ); + + // Set up readline interface + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + // Start the prompt loop + console.log(chalk.cyan("šŸ¤– Bot is now running and monitoring Telegram...")); + console.log(chalk.cyan("You can type messages in the console.")); + console.log(chalk.cyan('Type "exit" to quit')); + + // Handle graceful shutdown + process.on("SIGINT", async () => { + console.log(chalk.yellow("\n\nShutting down...")); + + // Clean up resources + telegram.logout(); + orchestrator.removeIOHandler("telegram_send_message"); + orchestrator.removeIOHandler("telegram_chat_list_scraper"); + rl.close(); + + console.log(chalk.green("āœ… Shutdown complete")); + process.exit(0); + }); +} + +// Run the example +main().catch((error) => { + console.error(chalk.red("Fatal error:"), error); + process.exit(1); +}); \ No newline at end of file diff --git a/package.json b/package.json index 229d1887..d99cfa14 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "twitter": "bun run examples/example-twitter.ts", "server": "bun run examples/example-server.ts", "discord": "bun run examples/example-discord.ts", + "telegram": "bun run examples/example-telegram.ts", "hyperliquid": "bun run examples/example-hyperliquid.ts", "api": "bun run examples/example-api.ts", "ui": "pnpm --dir clients/example-ui run dev", @@ -29,6 +30,7 @@ "mongodb": "^6.12.0", "prettier": "^3.4.2", "readline": "^1.3.0", + "telegram": "^2.26.16", "ws": "^8.18.0", "zod": "^3.24.1" }, diff --git a/packages/core/src/core/env.ts b/packages/core/src/core/env.ts index 34766ba9..df54f373 100644 --- a/packages/core/src/core/env.ts +++ b/packages/core/src/core/env.ts @@ -12,6 +12,9 @@ const envSchema = z.object({ OPENROUTER_API_KEY: z.string(), GRAPHQL_URL: z.string(), DISCORD_TOKEN: z.string(), + TELEGRAM_TOKEN: z.string(), + TELEGRAM_API_ID: z.string(), + TELEGRAM_API_HASH: z.string(), HYPERLIQUID_MAIN_ADDRESS: z.string(), HYPERLIQUID_WALLET_ADDRESS: z.string(), HYPERLIQUID_PRIVATE_KEY: z.string(), @@ -19,5 +22,7 @@ const envSchema = z.object({ DRY_RUN: z .preprocess((val) => val === "1" || val === "true", z.boolean()) .default(true), + TELEGRAM_STARTUP_CHAT_ID: z.string().optional(), + TELEGRAM_USER_SESSION: z.string().optional(), }); export const env = envSchema.parse(process.env); diff --git a/packages/core/src/core/io/telegram.ts b/packages/core/src/core/io/telegram.ts new file mode 100644 index 00000000..772fc869 --- /dev/null +++ b/packages/core/src/core/io/telegram.ts @@ -0,0 +1,482 @@ +import type { JSONSchemaType } from "ajv"; +import { Logger } from "../../core/logger"; +import { LogLevel } from "../types"; +import { env } from "../../core/env"; +import { Api, TelegramClient as GramJSClient } from "telegram"; +import { StringSession, Session } from "telegram/sessions"; + +export interface User { + /** Unique identifier for this user or bot. */ + id: number; + is_bot: boolean; + first_name: string; + last_name?: string; + username?: string; +} + +export type Chat = PrivateChat | GroupChat | ChannelChat; + +export interface PrivateChat { + id: number; + type: "private"; + username?: string; + first_name?: string; + last_name?: string; +} + +export interface GroupChat { + id: number; + type: "group"; + title: string; + members_count?: number; +} + +export interface ChannelChat { + id: number; + type: "channel"; + title: string; + username?: string; + participants_count?: number; +} + +// Updated Message Interface +export interface Message { + message_id: number; + from?: Api.User; + date: number; + chat: Chat; + text: string; +} + +export interface TelegramCredentials { + bot_token: string; // For bot login + + // For user login + api_id: number; + api_hash: string; + session?: string | Session; + + /** Unique identifier for this user or bot. */ + id?: number; + is_bot: boolean; + first_name?: string; + last_name?: string; + username?: string; +} + +export interface MessageData { + messageId: number; + content: string; + from?: User; +} + +export interface SendMessageData { + chatId: number; + content: string; + from?: Api.User; +} + +export interface GetMessagesData { + chatId: number; + limit?: number; + offset?: number; +} + +interface ChatInfo { + id: number; + title?: string; + type: string; + memberCount?: number; + username?: string; +} + +export class TelegramClient { + private client: GramJSClient | undefined; + private logger: Logger; + private isInitialized: boolean = false; + + constructor( + private credentials: TelegramCredentials, + logLevel: LogLevel = LogLevel.INFO + ) { + this.credentials = credentials; + this.logger = new Logger({ + level: logLevel, + enableColors: true, + enableTimestamp: true, + }); + } + + async initialize(): Promise { + if (this.isInitialized) { + this.logger.info("TelegramClient", "Already initialized, skipping..."); + return; + } + + try { + if (this.credentials.is_bot) { + this.logger.info("TelegramClient", "Logging in as bot."); + await this.botLogin(); + } else { + this.logger.info("TelegramClient", "Logging in as user."); + await this.userLogin(); + } + this.isInitialized = true; + } catch (error) { + this.logger.error("TelegramClient", "Failed to initialize", { + error, + }); + throw error; + } + } + + private async botLogin(): Promise { + if (!this.credentials.bot_token || !this.credentials.api_id || !this.credentials.api_hash) { + throw new Error("Bot token, Api ID and Api hash are required for bot login."); + } + try { + this.client = new GramJSClient( + new StringSession(""), + this.credentials.api_id as number, + this.credentials.api_hash as string, + { + connectionRetries: 5, + }) + + await this.client.start({ + botAuthToken: env.TELEGRAM_TOKEN, + }); + console.log(this.client.session.save()); + + const me = await this.client.getMe(); + this.logger.info("TelegramClient", "Bot user:", { client: me }); + + // Send startup message + if (env.TELEGRAM_STARTUP_CHAT_ID) { + await this.sendMessage({ + chatId: parseInt(env.TELEGRAM_STARTUP_CHAT_ID), + content: `šŸ¤– Bot started successfully!\nBot username: @${(me as Api.User).username}\nTime: ${new Date().toLocaleString()}` + }); + } + + this.logger.info("TelegramClient", "Bot login successful."); + } catch (error) { + this.logger.error("TelegramClient", "Failed to login as bot", { + error, + }); + throw error; + } + } + private async userLogin(): Promise { + try { + if (!this.credentials.api_id || !this.credentials.api_hash) { + throw new Error("API ID and API hash are required for user login."); + } + + // Try to use session string if provided + const sessionString = this.credentials.session?.toString(); + if (!sessionString) { + this.logger.info("TelegramClient", "No session string provided, starting interactive login"); + await this.handleInteractiveLogin(); + return; + } + + try { + // Initialize client with session + this.client = new GramJSClient( + new StringSession(sessionString), + this.credentials.api_id, + this.credentials.api_hash, + { + connectionRetries: 5, + } + ); + + // Try to connect and validate session + this.logger.info("TelegramClient", "Attempting to connect with existing session..."); + await this.client.connect(); + + // Verify the session is valid by getting user info + const me = await this.client.getMe(); + this.logger.info("TelegramClient", "Successfully connected with session", { + id: (me as Api.User).id, + username: (me as Api.User).username + }); + + // Send startup message + await this.sendStartupMessage(me as Api.User); + + } catch (error) { + this.logger.warn("TelegramClient", "Session invalid or expired, falling back to interactive login", { error }); + // Create new client for interactive login + this.client = new GramJSClient( + new StringSession(""), + this.credentials.api_id, + this.credentials.api_hash, + { + connectionRetries: 5, + } + ); + await this.handleInteractiveLogin(); + } + } catch (error) { + this.logger.error("TelegramClient", "Failed to login as user", { error }); + throw error; + } + } + + private async handleInteractiveLogin(): Promise { + const rl = require('readline').createInterface({ + input: process.stdin, + output: process.stdout + }); + + try { + await this.client!.start({ + phoneNumber: async () => { + return await new Promise((resolve) => { + rl.question('Please enter your phone number: ', (phone: string) => { + resolve(phone); + }); + }); + }, + password: async () => { + return await new Promise((resolve) => { + rl.question('Please enter your 2FA password (if enabled): ', (password: string) => { + resolve(password); + }); + }); + }, + phoneCode: async () => { + return await new Promise((resolve) => { + rl.question('Please enter the code you received: ', (code: string) => { + resolve(code); + }); + }); + }, + onError: (err) => { + this.logger.error("TelegramClient", "Error during login", { error: err }); + }, + }); + + // Save and display the new session string + const newSessionString = await this.client!.session.save(); + console.log("\nāš ļø SAVE THIS SESSION STRING FOR FUTURE USE:"); + console.log(newSessionString); + + // Get user details and send startup message + const me = await this.client!.getMe(); + await this.sendStartupMessage(me as Api.User); + + } finally { + rl.close(); + } + } + + private async sendStartupMessage(user: Api.User): Promise { + if (!env.TELEGRAM_STARTUP_CHAT_ID) return; + + try { + const message = `šŸ¤– User logged in successfully!\n` + + `User ID: ${user.id}\n` + + `Username: @${user.username || 'unknown'}\n` + + `Time: ${new Date().toLocaleString()}`; + + const result = await this.sendMessage({ + chatId: parseInt(env.TELEGRAM_STARTUP_CHAT_ID), + content: message + }); + + this.logger.info("TelegramClient", "Startup message sent", { result }); + } catch (msgError) { + this.logger.error("TelegramClient", "Failed to send startup message", { error: msgError }); + } + } + + public async logout(): Promise { + try { + if (this.client) { + await this.client.destroy(); + this.logger.info("TelegramClient", "Logged out successfully."); + } + } catch (error) { + this.logger.error("TelegramClient", "Failed to log out", { + error, + }); + throw error; + } + } + + /** + * Create an output for sending Telegram message + */ + public createSendMessageOutput() { + return { + name: "telegram_send_message", + handler: async (data: SendMessageData) => { + return await this.sendMessage(data); + }, + response: { + success: "boolean", + chatId: "number", + messageId: "number", + }, + }; + } + + /** + * Create a handler for periodic chat list updates + */ + public createChatListScraper() { + return { + name: "telegram_chat_list_scraper", + handler: async () => { + try { + const chats = await this.getChats(); + + if (env.TELEGRAM_STARTUP_CHAT_ID) { + // Limit to first 20 chats and split into chunks + const chatChunks = chats.slice(0, 20).reduce((acc: string[], chat, index) => { + const chatInfo = + `${index + 1}. ${chat.type}: ${chat.title || chat.username || chat.id}\n` + + `ID: ${chat.id}\n` + + `Members: ${chat.memberCount || 'N/A'}\n`; + + if (!acc.length || (acc[acc.length - 1].length + chatInfo.length) > 4000) { + acc.push(chatInfo); + } else { + acc[acc.length - 1] += '\n' + chatInfo; + } + return acc; + }, []); + + // Send each chunk as a separate message + for (let i = 0; i < chatChunks.length; i++) { + const header = `šŸ“Š Chat List Update (Part ${i + 1}/${chatChunks.length})\n\n`; + await this.sendMessage({ + chatId: parseInt(env.TELEGRAM_STARTUP_CHAT_ID), + content: header + chatChunks[i] + }); + } + } + + return { + success: true, + chats: chats + }; + } catch (error) { + this.logger.error("TelegramClient.chatListScraper", "Error scraping chats", { error }); + return { + success: false, + error: error + }; + } + }, + response: { + success: "boolean", + chats: "array" + } + }; + } + + private async sendMessage(data: SendMessageData): Promise<{ success: boolean, chatId?: number, messageId?: number }> { + try { + this.logger.info("TelegramClient.sendMessage", "Sending message", { + chatId: data.chatId, + contentLength: data.content.length + }); + + if (!this.client) { + throw new Error("Client not initialized"); + } + + if (env.DRY_RUN) { + this.logger.info("TelegramClient.sendMessage", "DRY_RUN: Would send message", { data }); + return { success: true }; + } + + // Get the entity first + try { + const entity = await this.client.getEntity(data.chatId); + if (!entity) { + throw new Error(`No entity found for chat ID: ${data.chatId}`); + } + + const result = await this.client.sendMessage(entity, { + message: data.content, + }); + + this.logger.info("TelegramClient.sendMessage", "Message sent successfully", { + messageId: result.id, + chatId: data.chatId + }); + + return { + success: true, + chatId: data.chatId, + messageId: result.id, + }; + } catch (entityError) { + // If entity not found, try sending directly to chat ID as fallback + this.logger.warn("TelegramClient.sendMessage", "Failed to get entity, trying direct send", { error: entityError }); + const result = await this.client.sendMessage(data.chatId.toString(), { + message: data.content, + }); + + return { + success: true, + chatId: data.chatId, + messageId: result.id, + }; + } + } catch (error) { + this.logger.error("TelegramClient.sendMessage", "Error sending message", { error }); + throw error; + } + } + + public async getChats(): Promise { + try { + if (!this.client) { + throw new Error("Client not initialized"); + } + + this.logger.info("TelegramClient.getChats", "Fetching all chats..."); + + if (this.credentials.is_bot) { + // For bots, we need to use getUpdates to get chat information + const chats = await this.client.invoke(new Api.messages.GetChats({ + id: [] + })); + + return (chats.chats || []).map(chat => ({ + id: Number(chat.id), + title: 'title' in chat ? chat.title : undefined, + type: chat.className, + memberCount: 'participantsCount' in chat ? chat.participantsCount : undefined, + username: 'username' in chat ? chat.username : undefined + })); + } else { + // For users, we can use getDialogs + const dialogs = await this.client.getDialogs({}); + const chats: ChatInfo[] = []; + + for (const dialog of dialogs) { + if (!dialog.entity) continue; + const chat = dialog.entity; + chats.push({ + id: Number(chat.id), + title: (chat as any).title || undefined, + type: chat.className, + memberCount: (chat as any).participantsCount, + username: (chat as any).username || undefined + }); + } + return chats; + } + } catch (error) { + this.logger.error("TelegramClient.getChats", "Error fetching chats", { error }); + throw error; + } + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be9c914a..931255e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: readline: specifier: ^1.3.0 version: 1.3.0 + telegram: + specifier: ^2.26.16 + version: 2.26.16 ws: specifier: ^8.18.0 version: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -682,6 +685,9 @@ packages: '@cfworker/json-schema@4.1.0': resolution: {integrity: sha512-/vYKi/qMxwNsuIJ9WGWwM2rflY40ZenK3Kh4uR5vB9/Nz12Y7IUN/Xf4wDA7vzPfw0VNh3b/jz4+MjcVgARKJg==} + '@cryptography/aes@0.1.1': + resolution: {integrity: sha512-PcYz4FDGblO6tM2kSC+VzhhK62vml6k6/YAkiWtyPvrgJVfnDRoHGDtKn5UiaRRUrvUTTocBpvc2rRgTCqxjsg==} + '@discordjs/builders@1.10.0': resolution: {integrity: sha512-ikVZsZP+3shmVJ5S1oM+7SveUCK3L9fTyfA8aJ7uD9cNQlTqF+3Irbk2Y22KXTb3C3RNUahRkSInClJMkHrINg==} engines: {node: '>=16.11.0'} @@ -2688,6 +2694,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-mutex@0.3.2: + resolution: {integrity: sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -2740,6 +2749,10 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} engines: {node: '>= 10.0.0'} @@ -3125,6 +3138,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -3257,6 +3274,19 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -3324,6 +3354,9 @@ packages: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3354,12 +3387,23 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -3423,6 +3467,10 @@ packages: jiti: optional: true + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3459,6 +3507,9 @@ packages: resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} engines: {node: '>=14.0.0'} + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -3496,6 +3547,9 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3846,6 +3900,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -4007,6 +4064,9 @@ packages: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -4370,6 +4430,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4539,6 +4604,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + node-abi@3.71.0: resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} @@ -4581,6 +4649,10 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} hasBin: true + node-localstorage@2.2.1: + resolution: {integrity: sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==} + engines: {node: '>=0.12'} + node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} @@ -4836,6 +4908,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -5177,6 +5252,9 @@ packages: readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + real-cancellable-promise@1.2.1: + resolution: {integrity: sha512-JwhiWJTMMyzFYfpKsiSb8CyQktCi1MZ8ZBn3wXvq28qXDh8Y5dM7RYzgW3r6SV22JTEcof8pRsvDp4GxLmGIxg==} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -5372,6 +5450,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slide@1.1.6: + resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -5448,6 +5529,9 @@ packages: std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + store2@2.14.4: + resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} + streamx@2.21.1: resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} @@ -5568,6 +5652,9 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + telegram@2.26.16: + resolution: {integrity: sha512-5tqL9HicCxRqEi+9JjXBteVDnoZ+1ggsBFxLQTO49aXwTI2d7To7xb2vOU/ahLwgKuE+Db9ra5xDJZ76Kk0NEA==} + temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} engines: {node: '>=4'} @@ -5689,6 +5776,10 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-custom-error@3.3.1: + resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} + engines: {node: '>=14.0.0'} + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5767,6 +5858,12 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -6041,6 +6138,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} + whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -6094,6 +6195,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@1.3.4: + resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} + write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} @@ -6153,6 +6257,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -6911,6 +7019,8 @@ snapshots: '@cfworker/json-schema@4.1.0': {} + '@cryptography/aes@0.1.1': {} + '@discordjs/builders@1.10.0': dependencies: '@discordjs/formatters': 0.6.0 @@ -9021,6 +9131,10 @@ snapshots: assertion-error@2.0.1: {} + async-mutex@0.3.2: + dependencies: + tslib: 2.8.1 + async@3.2.6: {} asynckit@0.4.0: {} @@ -9089,6 +9203,8 @@ snapshots: before-after-hook@2.2.3: {} + big-integer@1.6.52: {} + bigint-buffer@1.1.5: dependencies: bindings: 1.5.0 @@ -9188,7 +9304,6 @@ snapshots: bufferutil@4.0.9: dependencies: node-gyp-build: 4.8.4 - optional: true bun-types@1.2.1: dependencies: @@ -9509,6 +9624,11 @@ snapshots: csstype@3.1.3: {} + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + dargs@7.0.0: {} data-uri-to-buffer@4.0.1: {} @@ -9606,6 +9726,24 @@ snapshots: dlv@1.1.3: {} + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -9670,6 +9808,8 @@ snapshots: dependencies: ansi-colors: 4.1.3 + entities@2.2.0: {} + env-paths@2.2.1: {} envinfo@7.13.0: {} @@ -9690,12 +9830,30 @@ snapshots: dependencies: es-errors: 1.3.0 + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + es6-promise@4.2.8: {} es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -9843,6 +10001,13 @@ snapshots: transitivePeerDependencies: - supports-color + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + espree@10.3.0: dependencies: acorn: 8.14.0 @@ -9882,6 +10047,11 @@ snapshots: - bufferutil - utf-8-validate + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -9946,6 +10116,10 @@ snapshots: transitivePeerDependencies: - supports-color + ext@1.7.0: + dependencies: + type: 2.7.3 + extend@3.0.2: {} external-editor@3.1.0: @@ -10319,6 +10493,13 @@ snapshots: dependencies: lru-cache: 10.4.3 + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + http-cache-semantics@4.1.1: {} http-errors@2.0.0: @@ -10488,6 +10669,8 @@ snapshots: dependencies: text-extensions: 1.9.0 + is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} is-wsl@2.2.0: @@ -10960,6 +11143,8 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} mimic-response@3.1.0: {} @@ -11092,6 +11277,8 @@ snapshots: neo-async@2.6.2: {} + next-tick@1.1.0: {} + node-abi@3.71.0: dependencies: semver: 7.6.3 @@ -11118,8 +11305,7 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-gyp-build@4.8.4: - optional: true + node-gyp-build@4.8.4: {} node-gyp@10.3.1: dependencies: @@ -11136,6 +11322,10 @@ snapshots: transitivePeerDependencies: - supports-color + node-localstorage@2.2.1: + dependencies: + write-file-atomic: 1.3.4 + node-machine-id@1.1.12: {} node-releases@2.0.19: {} @@ -11480,6 +11670,8 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -11793,6 +11985,8 @@ snapshots: readline@1.3.0: {} + real-cancellable-promise@1.2.1: {} + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -12033,6 +12227,8 @@ snapshots: slash@3.0.0: {} + slide@1.1.6: {} + smart-buffer@4.2.0: {} smol-toml@1.3.1: {} @@ -12120,6 +12316,8 @@ snapshots: std-env@3.8.0: {} + store2@2.14.4: {} + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 @@ -12279,6 +12477,28 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + telegram@2.26.16: + dependencies: + '@cryptography/aes': 0.1.1 + async-mutex: 0.3.2 + big-integer: 1.6.52 + buffer: 6.0.3 + htmlparser2: 6.1.0 + mime: 3.0.0 + node-localstorage: 2.2.1 + pako: 2.1.0 + path-browserify: 1.0.1 + real-cancellable-promise: 1.2.1 + socks: 2.8.3 + store2: 2.14.4 + ts-custom-error: 3.3.1 + websocket: 1.0.35 + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + transitivePeerDependencies: + - supports-color + temp-dir@1.0.0: {} text-decoder@1.2.3: @@ -12376,6 +12596,8 @@ snapshots: dependencies: typescript: 5.6.3 + ts-custom-error@3.3.1: {} + ts-interface-checker@0.1.13: {} ts-mixer@6.0.4: {} @@ -12457,6 +12679,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type@2.7.3: {} + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typedarray@0.0.6: {} typescript-eslint@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.6.3): @@ -12552,7 +12780,6 @@ snapshots: utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.4 - optional: true util-deprecate@1.0.2: {} @@ -12665,6 +12892,17 @@ snapshots: webpack-virtual-modules@0.6.2: {} + websocket@1.0.35: + dependencies: + bufferutil: 4.0.9 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + whatwg-fetch@3.6.20: {} whatwg-url@14.1.0: @@ -12724,6 +12962,12 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@1.3.4: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + slide: 1.1.6 + write-file-atomic@2.4.3: dependencies: graceful-fs: 4.2.11 @@ -12769,6 +13013,8 @@ snapshots: y18n@5.0.8: {} + yaeti@0.0.6: {} + yallist@3.1.1: {} yallist@4.0.0: {}