@elizaos/plugin-twitch 2.0.0-alpha.8 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -0
- package/auto-enable.ts +21 -0
- package/dist/accounts.d.ts +17 -0
- package/dist/accounts.d.ts.map +1 -0
- package/dist/connector-account-provider.d.ts +18 -0
- package/dist/connector-account-provider.d.ts.map +1 -0
- package/dist/index.d.ts +1 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +544 -679
- package/dist/index.js.map +9 -12
- package/dist/providers/userContext.d.ts.map +1 -1
- package/dist/service.d.ts +18 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/toon.d.ts +2 -0
- package/dist/toon.d.ts.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow-credential-provider.d.ts +21 -0
- package/dist/workflow-credential-provider.d.ts.map +1 -0
- package/package.json +19 -9
- package/dist/actions/joinChannel.d.ts +0 -6
- package/dist/actions/joinChannel.d.ts.map +0 -1
- package/dist/actions/leaveChannel.d.ts +0 -6
- package/dist/actions/leaveChannel.d.ts.map +0 -1
- package/dist/actions/listChannels.d.ts +0 -6
- package/dist/actions/listChannels.d.ts.map +0 -1
- package/dist/actions/sendMessage.d.ts +0 -6
- package/dist/actions/sendMessage.d.ts.map +0 -1
- package/dist/providers/channelState.d.ts +0 -9
- package/dist/providers/channelState.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/
|
|
3
|
+
"sources": ["../src/index.ts", "../src/accounts.ts", "../src/service.ts", "../src/types.ts", "../src/connector-account-provider.ts", "../src/workflow-credential-provider.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Twitch chat integration plugin for ElizaOS.\n *\n * This plugin provides Twitch chat integration using the @twurple library.\n */\n\nimport type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\n// Service\nexport { TwitchService } from \"./service.js\";\n
|
|
6
|
-
"/**\n * Twitch service implementation for ElizaOS.\n *\n * This service provides Twitch chat integration using the @twurple library.\n */\n\nimport {\n type EventPayload,\n type IAgentRuntime,\n logger,\n Service,\n} from \"@elizaos/core\";\nimport { RefreshingAuthProvider, StaticAuthProvider } from \"@twurple/auth\";\nimport { ChatClient, type ChatMessage } from \"@twurple/chat\";\nimport {\n type ITwitchService,\n normalizeChannel,\n splitMessageForTwitch,\n stripMarkdownForTwitch,\n TWITCH_SERVICE_NAME,\n TwitchConfigurationError,\n TwitchEventTypes,\n type TwitchMessage,\n type TwitchMessageSendOptions,\n TwitchNotConnectedError,\n type TwitchRole,\n type TwitchSendResult,\n type TwitchSettings,\n type TwitchUserInfo,\n} from \"./types.js\";\n\n/**\n * Twitch chat service for ElizaOS agents.\n */\nexport class TwitchService extends Service implements ITwitchService {\n static serviceType: string = TWITCH_SERVICE_NAME;\n capabilityDescription =\n \"Provides Twitch chat integration for sending and receiving messages\";\n\n private settings!: TwitchSettings;\n private client!: ChatClient;\n private connected: boolean = false;\n private joinedChannels: Set<string> = new Set();\n\n /**\n * Start the Twitch service.\n */\n static async start(runtime: IAgentRuntime): Promise<TwitchService> {\n const service = new TwitchService();\n await service.initialize(runtime);\n return service;\n }\n\n /**\n * Stop the Twitch service.\n */\n static async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n if (service) {\n await service.stop();\n }\n }\n\n /**\n * Initialize the Twitch service.\n */\n private async initialize(runtime: IAgentRuntime): Promise<void> {\n this.runtime = runtime;\n\n // Load configuration\n this.settings = this.loadSettings();\n\n // Validate configuration\n this.validateSettings();\n\n // Create auth provider\n const authProvider = await this.createAuthProvider();\n\n // Create chat client\n const allChannels = [\n this.settings.channel,\n ...this.settings.additionalChannels,\n ].map(normalizeChannel);\n\n this.client = new ChatClient({\n authProvider,\n channels: allChannels,\n rejoinChannelsOnReconnect: true,\n });\n\n // Set up event handlers\n this.setupEventHandlers();\n\n // Connect\n await this.connect();\n\n logger.info(\n `Twitch service initialized for ${this.settings.username}, joined channels: ${allChannels.join(\", \")}`,\n );\n }\n\n /**\n * Load settings from runtime.\n */\n private loadSettings(): TwitchSettings {\n const username = this.runtime.getSetting(\"TWITCH_USERNAME\");\n const clientId = this.runtime.getSetting(\"TWITCH_CLIENT_ID\");\n const accessToken = this.runtime.getSetting(\"TWITCH_ACCESS_TOKEN\");\n const clientSecret = this.runtime.getSetting(\"TWITCH_CLIENT_SECRET\");\n const refreshToken = this.runtime.getSetting(\"TWITCH_REFRESH_TOKEN\");\n const channel = this.runtime.getSetting(\"TWITCH_CHANNEL\");\n const additionalChannelsStr = this.runtime.getSetting(\"TWITCH_CHANNELS\");\n const requireMentionStr = this.runtime.getSetting(\"TWITCH_REQUIRE_MENTION\");\n const allowedRolesStr = this.runtime.getSetting(\"TWITCH_ALLOWED_ROLES\");\n\n const additionalChannels =\n typeof additionalChannelsStr === \"string\" && additionalChannelsStr\n ? additionalChannelsStr\n .split(\",\")\n .map((c: string) => c.trim())\n .filter(Boolean)\n : [];\n\n const allowedRoles: TwitchRole[] =\n typeof allowedRolesStr === \"string\" && allowedRolesStr\n ? (allowedRolesStr\n .split(\",\")\n .map((r: string) => r.trim().toLowerCase()) as TwitchRole[])\n : [\"all\"];\n\n return {\n username: typeof username === \"string\" ? username : \"\",\n clientId: typeof clientId === \"string\" ? clientId : \"\",\n accessToken: typeof accessToken === \"string\" ? accessToken : \"\",\n clientSecret: typeof clientSecret === \"string\" ? clientSecret : undefined,\n refreshToken: typeof refreshToken === \"string\" ? refreshToken : undefined,\n channel: typeof channel === \"string\" ? channel : \"\",\n additionalChannels,\n requireMention: requireMentionStr === \"true\",\n allowedRoles,\n allowedUserIds: [],\n enabled: true,\n };\n }\n\n /**\n * Validate the settings.\n */\n private validateSettings(): void {\n if (!this.settings.username) {\n throw new TwitchConfigurationError(\n \"TWITCH_USERNAME is required\",\n \"TWITCH_USERNAME\",\n );\n }\n\n if (!this.settings.clientId) {\n throw new TwitchConfigurationError(\n \"TWITCH_CLIENT_ID is required\",\n \"TWITCH_CLIENT_ID\",\n );\n }\n\n if (!this.settings.accessToken) {\n throw new TwitchConfigurationError(\n \"TWITCH_ACCESS_TOKEN is required\",\n \"TWITCH_ACCESS_TOKEN\",\n );\n }\n\n if (!this.settings.channel) {\n throw new TwitchConfigurationError(\n \"TWITCH_CHANNEL is required\",\n \"TWITCH_CHANNEL\",\n );\n }\n }\n\n /**\n * Create the authentication provider.\n */\n private async createAuthProvider(): Promise<\n StaticAuthProvider | RefreshingAuthProvider\n > {\n const token = this.normalizeToken(this.settings.accessToken);\n\n if (this.settings.clientSecret) {\n const authProvider = new RefreshingAuthProvider({\n clientId: this.settings.clientId,\n clientSecret: this.settings.clientSecret,\n });\n\n await authProvider.addUserForToken({\n accessToken: token,\n refreshToken: this.settings.refreshToken || null,\n expiresIn: null,\n obtainmentTimestamp: Date.now(),\n });\n\n authProvider.onRefresh((userId, newToken) => {\n logger.info(\n `Twitch token refreshed for user ${userId}, expires in ${newToken.expiresIn}s`,\n );\n });\n\n authProvider.onRefreshFailure((userId, error) => {\n logger.error(\n `Twitch token refresh failed for user ${userId}: ${error.message}`,\n );\n });\n\n logger.info(`Using RefreshingAuthProvider for ${this.settings.username}`);\n return authProvider;\n }\n\n logger.info(`Using StaticAuthProvider for ${this.settings.username}`);\n return new StaticAuthProvider(this.settings.clientId, token);\n }\n\n /**\n * Normalize an OAuth token (remove oauth: prefix if present).\n */\n private normalizeToken(token: string): string {\n return token.startsWith(\"oauth:\") ? token.slice(6) : token;\n }\n\n /**\n * Set up event handlers for the chat client.\n */\n private setupEventHandlers(): void {\n // Connection events\n this.client.onConnect(() => {\n this.connected = true;\n logger.info(\"Twitch chat connected\");\n this.runtime.emitEvent(TwitchEventTypes.CONNECTION_READY, {\n runtime: this.runtime,\n } as EventPayload);\n });\n\n this.client.onDisconnect((_manually, reason) => {\n this.connected = false;\n logger.warn(`Twitch chat disconnected: ${reason || \"unknown reason\"}`);\n this.runtime.emitEvent(TwitchEventTypes.CONNECTION_LOST, {\n runtime: this.runtime,\n reason,\n } as EventPayload);\n });\n\n // Channel events\n this.client.onJoin((channel, user) => {\n const normalized = normalizeChannel(channel);\n if (user.toLowerCase() === this.settings.username.toLowerCase()) {\n this.joinedChannels.add(normalized);\n logger.info(`Joined Twitch channel: ${normalized}`);\n this.runtime.emitEvent(TwitchEventTypes.JOIN_CHANNEL, {\n runtime: this.runtime,\n channel: normalized,\n } as EventPayload);\n }\n });\n\n this.client.onPart((channel, user) => {\n const normalized = normalizeChannel(channel);\n if (user.toLowerCase() === this.settings.username.toLowerCase()) {\n this.joinedChannels.delete(normalized);\n logger.info(`Left Twitch channel: ${normalized}`);\n this.runtime.emitEvent(TwitchEventTypes.LEAVE_CHANNEL, {\n runtime: this.runtime,\n channel: normalized,\n } as EventPayload);\n }\n });\n\n // Message events\n this.client.onMessage(\n (channel: string, user: string, text: string, msg: ChatMessage) => {\n this.handleMessage(channel, user, text, msg);\n },\n );\n }\n\n /**\n * Handle an incoming chat message.\n */\n private handleMessage(\n channel: string,\n _user: string,\n text: string,\n msg: ChatMessage,\n ): void {\n const normalizedChannel = normalizeChannel(channel);\n\n // Ignore own messages\n if (\n msg.userInfo.userName.toLowerCase() ===\n this.settings.username.toLowerCase()\n ) {\n return;\n }\n\n const userInfo: TwitchUserInfo = {\n userId: msg.userInfo.userId,\n username: msg.userInfo.userName,\n displayName: msg.userInfo.displayName,\n isModerator: msg.userInfo.isMod,\n isBroadcaster: msg.userInfo.isBroadcaster,\n isVip: msg.userInfo.isVip,\n isSubscriber: msg.userInfo.isSubscriber,\n color: msg.userInfo.color,\n badges: msg.userInfo.badges,\n };\n\n // Check access control\n if (!this.isUserAllowed(userInfo)) {\n return;\n }\n\n // Check mention requirement\n if (this.settings.requireMention) {\n const mentionPattern = new RegExp(`@${this.settings.username}\\\\b`, \"i\");\n if (!mentionPattern.test(text)) {\n return;\n }\n }\n\n const message: TwitchMessage = {\n id: msg.id,\n channel: normalizedChannel,\n text,\n user: userInfo,\n timestamp: new Date(),\n isAction: msg.isCheer,\n isHighlighted: msg.isHighlight,\n replyTo: msg.parentMessageId\n ? {\n messageId: msg.parentMessageId,\n userId: msg.parentMessageUserId || \"\",\n username: msg.parentMessageUserName || \"\",\n text: msg.parentMessageText || \"\",\n }\n : undefined,\n };\n\n logger.debug(\n `Twitch message from ${userInfo.displayName} in #${normalizedChannel}: ${text.slice(0, 50)}...`,\n );\n\n this.runtime.emitEvent(TwitchEventTypes.MESSAGE_RECEIVED, {\n runtime: this.runtime,\n message,\n } as EventPayload);\n }\n\n /**\n * Connect to Twitch.\n */\n private async connect(): Promise<void> {\n await this.client.connect();\n this.connected = true;\n }\n\n /**\n * Stop the service.\n */\n async stop(): Promise<void> {\n if (this.client) {\n this.client.quit();\n }\n this.connected = false;\n this.joinedChannels.clear();\n logger.info(\"Twitch service stopped\");\n }\n\n // ============================================================================\n // Public Interface\n // ============================================================================\n\n isConnected(): boolean {\n return this.connected;\n }\n\n getBotUsername(): string {\n return this.settings.username;\n }\n\n getPrimaryChannel(): string {\n return this.settings.channel;\n }\n\n getJoinedChannels(): string[] {\n return Array.from(this.joinedChannels);\n }\n\n isUserAllowed(user: TwitchUserInfo): boolean {\n // Check allowlist first\n if (\n this.settings.allowedUserIds.length > 0 &&\n !this.settings.allowedUserIds.includes(user.userId)\n ) {\n return false;\n }\n\n // Check roles\n if (this.settings.allowedRoles.includes(\"all\")) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"owner\") && user.isBroadcaster) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"moderator\") && user.isModerator) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"vip\") && user.isVip) {\n return true;\n }\n\n if (\n this.settings.allowedRoles.includes(\"subscriber\") &&\n user.isSubscriber\n ) {\n return true;\n }\n\n return false;\n }\n\n async sendMessage(\n text: string,\n options?: TwitchMessageSendOptions,\n ): Promise<TwitchSendResult> {\n if (!this.connected) {\n throw new TwitchNotConnectedError();\n }\n\n const channel = normalizeChannel(options?.channel || this.settings.channel);\n\n // Strip markdown for Twitch\n const cleanedText = stripMarkdownForTwitch(text);\n if (!cleanedText) {\n return { success: true, messageId: \"skipped-empty\" };\n }\n\n // Split long messages\n const chunks = splitMessageForTwitch(cleanedText);\n\n let lastMessageId: string | undefined;\n\n for (const chunk of chunks) {\n if (options?.replyTo) {\n await this.client.say(channel, chunk, { replyTo: options.replyTo });\n } else {\n await this.client.say(channel, chunk);\n }\n\n // Generate a message ID since Twurple doesn't return one\n lastMessageId = crypto.randomUUID();\n\n // Small delay between chunks\n if (chunks.length > 1) {\n await new Promise((resolve) => setTimeout(resolve, 300));\n }\n }\n\n this.runtime.emitEvent(TwitchEventTypes.MESSAGE_SENT, {\n runtime: this.runtime,\n channel,\n text: cleanedText,\n messageId: lastMessageId,\n } as EventPayload);\n\n return { success: true, messageId: lastMessageId };\n }\n\n async joinChannel(channel: string): Promise<void> {\n const normalized = normalizeChannel(channel);\n await this.client.join(normalized);\n this.joinedChannels.add(normalized);\n }\n\n async leaveChannel(channel: string): Promise<void> {\n const normalized = normalizeChannel(channel);\n await this.client.part(normalized);\n this.joinedChannels.delete(normalized);\n }\n}\n",
|
|
7
|
-
"/**\n * Type definitions for the Twitch plugin.\n */\n\nimport type { IAgentRuntime, Service } from \"@elizaos/core\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum message length for Twitch chat */\nexport const MAX_TWITCH_MESSAGE_LENGTH = 500;\n\n/** Service name constant */\nexport const TWITCH_SERVICE_NAME = \"twitch\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Event types emitted by the Twitch plugin */\nexport enum TwitchEventTypes {\n MESSAGE_RECEIVED = \"TWITCH_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"TWITCH_MESSAGE_SENT\",\n JOIN_CHANNEL = \"TWITCH_JOIN_CHANNEL\",\n LEAVE_CHANNEL = \"TWITCH_LEAVE_CHANNEL\",\n CONNECTION_READY = \"TWITCH_CONNECTION_READY\",\n CONNECTION_LOST = \"TWITCH_CONNECTION_LOST\",\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/** Twitch user roles for access control */\nexport type TwitchRole = \"moderator\" | \"owner\" | \"vip\" | \"subscriber\" | \"all\";\n\n/** Configuration settings for the Twitch plugin */\nexport interface TwitchSettings {\n /** Twitch username for the bot account */\n username: string;\n /** Twitch application client ID */\n clientId: string;\n /** OAuth access token */\n accessToken: string;\n /** Optional client secret for token refresh */\n clientSecret?: string;\n /** Optional refresh token for automatic token refresh */\n refreshToken?: string;\n /** Primary channel to join */\n channel: string;\n /** Additional channels to join */\n additionalChannels: string[];\n /** Whether to require @mention to respond */\n requireMention: boolean;\n /** Roles allowed to interact with the bot */\n allowedRoles: TwitchRole[];\n /** Optional allowlist of user IDs */\n allowedUserIds: string[];\n /** Whether this configuration is enabled */\n enabled: boolean;\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Information about the message sender */\nexport interface TwitchUserInfo {\n /** Twitch user ID (numeric string) */\n userId: string;\n /** Twitch username (login name) */\n username: string;\n /** Display name (may include special characters) */\n displayName: string;\n /** Whether the user is a moderator */\n isModerator: boolean;\n /** Whether the user is the channel owner/broadcaster */\n isBroadcaster: boolean;\n /** Whether the user is a VIP */\n isVip: boolean;\n /** Whether the user is a subscriber */\n isSubscriber: boolean;\n /** User's chat color */\n color?: string;\n /** User's badges */\n badges: Map<string, string>;\n}\n\n/** Represents a Twitch chat message */\nexport interface TwitchMessage {\n /** Unique message ID */\n id: string;\n /** Channel name (without # prefix) */\n channel: string;\n /** Message text content */\n text: string;\n /** Sender information */\n user: TwitchUserInfo;\n /** Message timestamp */\n timestamp: Date;\n /** Whether this is an action message (/me) */\n isAction: boolean;\n /** Whether this is a highlighted message */\n isHighlighted: boolean;\n /** Reply thread info if this is a reply */\n replyTo?: {\n messageId: string;\n userId: string;\n username: string;\n text: string;\n };\n}\n\n/** Options for sending a message */\nexport interface TwitchMessageSendOptions {\n /** Channel to send to (defaults to primary channel) */\n channel?: string;\n /** Message ID to reply to */\n replyTo?: string;\n}\n\n/** Result from sending a message */\nexport interface TwitchSendResult {\n /** Whether the send succeeded */\n success: boolean;\n /** Generated message ID (if available) */\n messageId?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================================================\n// Service Interface\n// ============================================================================\n\n/** Interface for the Twitch service */\nexport interface ITwitchService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the bot username */\n getBotUsername(): string;\n\n /** Get the primary channel */\n getPrimaryChannel(): string;\n\n /** Get all joined channels */\n getJoinedChannels(): string[];\n\n /** Send a message to a channel */\n sendMessage(\n text: string,\n options?: TwitchMessageSendOptions,\n ): Promise<TwitchSendResult>;\n\n /** Join a channel */\n joinChannel(channel: string): Promise<void>;\n\n /** Leave a channel */\n leaveChannel(channel: string): Promise<void>;\n\n /** Check if a user is allowed to interact based on settings */\n isUserAllowed(user: TwitchUserInfo): boolean;\n}\n\n// ============================================================================\n// Event Payloads\n// ============================================================================\n\n/** Payload for MESSAGE_RECEIVED event */\nexport interface TwitchMessageReceivedPayload {\n message: TwitchMessage;\n runtime: IAgentRuntime;\n}\n\n/** Payload for MESSAGE_SENT event */\nexport interface TwitchMessageSentPayload {\n channel: string;\n text: string;\n messageId?: string;\n}\n\n/** Payload for JOIN_CHANNEL event */\nexport interface TwitchJoinChannelPayload {\n channel: string;\n}\n\n/** Payload for LEAVE_CHANNEL event */\nexport interface TwitchLeaveChannelPayload {\n channel: string;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Normalize a Twitch channel name (ensure no # prefix).\n */\nexport function normalizeChannel(channel: string): string {\n return channel.startsWith(\"#\") ? channel.slice(1) : channel;\n}\n\n/**\n * Format a channel name for display (with # prefix).\n */\nexport function formatChannelForDisplay(channel: string): string {\n const normalized = normalizeChannel(channel);\n return `#${normalized}`;\n}\n\n/**\n * Get the best display name for a Twitch user.\n */\nexport function getTwitchUserDisplayName(user: TwitchUserInfo): string {\n return user.displayName || user.username;\n}\n\n/**\n * Strip markdown formatting for Twitch chat display.\n * Twitch doesn't render markdown, so we convert it to plain text.\n */\nexport function stripMarkdownForTwitch(text: string): string {\n return (\n text\n // Remove bold\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/__([^_]+)__/g, \"$1\")\n // Remove italic\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/_([^_]+)_/g, \"$1\")\n // Remove strikethrough\n .replace(/~~([^~]+)~~/g, \"$1\")\n // Remove inline code\n .replace(/`([^`]+)`/g, \"$1\")\n // Remove code blocks\n .replace(/```[\\s\\S]*?```/g, \"[code block]\")\n // Remove links, keep text\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n // Remove headers\n .replace(/^#{1,6}\\s+/gm, \"\")\n // Remove blockquotes\n .replace(/^>\\s+/gm, \"\")\n // Remove list markers\n .replace(/^[-*+]\\s+/gm, \"• \")\n .replace(/^\\d+\\.\\s+/gm, \"• \")\n // Collapse multiple newlines\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim()\n );\n}\n\n/**\n * Split a message into chunks that fit Twitch's message limit.\n */\nexport function splitMessageForTwitch(\n text: string,\n maxLength: number = MAX_TWITCH_MESSAGE_LENGTH,\n): string[] {\n if (text.length <= maxLength) {\n return [text];\n }\n\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n // Try to split at a sentence boundary\n let splitIndex = remaining.lastIndexOf(\". \", maxLength);\n if (splitIndex === -1 || splitIndex < maxLength / 2) {\n // Try to split at a word boundary\n splitIndex = remaining.lastIndexOf(\" \", maxLength);\n }\n if (splitIndex === -1 || splitIndex < maxLength / 2) {\n // Force split at max length\n splitIndex = maxLength;\n }\n\n chunks.push(remaining.slice(0, splitIndex).trim());\n remaining = remaining.slice(splitIndex).trim();\n }\n\n return chunks;\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/** Base error class for Twitch plugin errors */\nexport class TwitchPluginError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TwitchPluginError\";\n }\n}\n\n/** Error when the Twitch service is not initialized */\nexport class TwitchServiceNotInitializedError extends TwitchPluginError {\n constructor(message: string = \"Twitch service is not initialized\") {\n super(message);\n this.name = \"TwitchServiceNotInitializedError\";\n }\n}\n\n/** Error when the Twitch client is not connected */\nexport class TwitchNotConnectedError extends TwitchPluginError {\n constructor(message: string = \"Twitch client is not connected\") {\n super(message);\n this.name = \"TwitchNotConnectedError\";\n }\n}\n\n/** Error when there is a configuration problem */\nexport class TwitchConfigurationError extends TwitchPluginError {\n settingName?: string;\n\n constructor(message: string, settingName?: string) {\n super(message);\n this.name = \"TwitchConfigurationError\";\n this.settingName = settingName;\n }\n}\n\n/** Error when an API call fails */\nexport class TwitchApiError extends TwitchPluginError {\n statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = \"TwitchApiError\";\n this.statusCode = statusCode;\n }\n}\n",
|
|
8
|
-
"/**\n * Join channel action for Twitch plugin.\n */\n\nimport type {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport {\n composePromptFromState,\n ModelType,\n parseJSONObjectFromText,\n} from \"@elizaos/core\";\nimport type { TwitchService } from \"../service.js\";\nimport { normalizeChannel, TWITCH_SERVICE_NAME } from \"../types.js\";\n\nconst JOIN_CHANNEL_TEMPLATE = `You are helping to extract a Twitch channel name.\n\nThe user wants to join a Twitch channel.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the channel name to join (without the # prefix).\n\nRespond with a JSON object like:\n{\n \"channel\": \"channelname\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\nexport const joinChannel: Action = {\n name: \"TWITCH_JOIN_CHANNEL\",\n similes: [\"JOIN_TWITCH_CHANNEL\", \"ENTER_CHANNEL\", \"CONNECT_CHANNEL\"],\n description: \"Join a Twitch channel to listen and send messages\",\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['twitch', 'join', 'channel'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw)) ||\n\t\tString(message?.content?.source ?? message?.source ?? '') === 'twitch';\n \tconst __avRegex = new RegExp('\\\\b(?:twitch|join|channel)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText) || String(message?.content?.source ?? message?.source ?? '') === 'twitch';\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = 'twitch';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object') ||\n\t\tString(message?.content?.source ?? message?.source ?? '') === 'twitch';\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"twitch\";\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: (response: { text: string; source?: string }) => void,\n ): Promise<ActionResult> => {\n const twitchService =\n runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n\n if (!twitchService || !twitchService.isConnected()) {\n if (callback) {\n callback({\n text: \"Twitch service is not available.\",\n source: \"twitch\",\n });\n }\n return { success: false, error: \"Twitch service not available\" };\n }\n\n // Compose prompt\n const currentState = state ?? (await runtime.composeState(message));\n const prompt = await composePromptFromState({\n template: JOIN_CHANNEL_TEMPLATE,\n state: currentState,\n });\n\n // Extract channel name using LLM\n let channelName: string | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(String(response));\n if (parsed?.channel) {\n channelName = normalizeChannel(String(parsed.channel));\n break;\n }\n }\n\n if (!channelName) {\n if (callback) {\n callback({\n text: \"I couldn't understand which channel you want me to join. Please specify the channel name.\",\n source: \"twitch\",\n });\n }\n return { success: false, error: \"Could not extract channel name\" };\n }\n\n // Check if already joined\n if (twitchService.getJoinedChannels().includes(channelName)) {\n if (callback) {\n callback({\n text: `Already in channel #${channelName}.`,\n source: \"twitch\",\n });\n }\n return {\n success: true,\n data: { channel: channelName, alreadyJoined: true },\n };\n }\n\n // Join channel\n await twitchService.joinChannel(channelName);\n\n if (callback) {\n callback({\n text: `Joined channel #${channelName}.`,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n channel: channelName,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Join the channel shroud\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll join that channel.\",\n actions: [\"TWITCH_JOIN_CHANNEL\"],\n },\n },\n ],\n ],\n};\n",
|
|
9
|
-
"/**\n *
|
|
10
|
-
"
|
|
11
|
-
"/**\n * Send message action for Twitch plugin.\n */\n\nimport type {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport {\n composePromptFromState,\n ModelType,\n parseJSONObjectFromText,\n} from \"@elizaos/core\";\nimport type { TwitchService } from \"../service.js\";\nimport { normalizeChannel, TWITCH_SERVICE_NAME } from \"../types.js\";\n\nconst SEND_MESSAGE_TEMPLATE = `You are helping to extract send message parameters for Twitch chat.\n\nThe user wants to send a message to a Twitch channel.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n1. text: The message text to send\n2. channel: The channel name to send to (without # prefix), or \"current\" for the current channel\n\nRespond with a JSON object like:\n{\n \"text\": \"The message to send\",\n \"channel\": \"current\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\ninterface SendMessageParams {\n text: string;\n channel: string;\n}\n\nexport const sendMessage: Action = {\n name: \"TWITCH_SEND_MESSAGE\",\n similes: [\n \"SEND_TWITCH_MESSAGE\",\n \"TWITCH_CHAT\",\n \"CHAT_TWITCH\",\n \"SAY_IN_TWITCH\",\n ],\n description: \"Send a message to a Twitch channel\",\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['twitch', 'send', 'message'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw)) ||\n \t\tString(message?.content?.source ?? message?.source ?? '') === 'twitch';\n \tconst __avRegex = new RegExp('\\\\b(?:twitch|send|message)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText) || String(message?.content?.source ?? message?.source ?? '') === 'twitch';\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = 'twitch';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object') ||\n \t\tString(message?.content?.source ?? message?.source ?? '') === 'twitch';\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"twitch\";\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: Record<string, unknown>,\n callback?: (response: { text: string; source?: string }) => void,\n ): Promise<ActionResult> => {\n const twitchService =\n runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n\n if (!twitchService || !twitchService.isConnected()) {\n if (callback) {\n callback({\n text: \"Twitch service is not available.\",\n source: \"twitch\",\n });\n }\n return { success: false, error: \"Twitch service not available\" };\n }\n\n // Get or compose state\n const currentState = state ?? (await runtime.composeState(message));\n\n // Compose prompt\n const prompt = await composePromptFromState({\n template: SEND_MESSAGE_TEMPLATE,\n state: currentState,\n });\n\n // Extract parameters using LLM\n let messageInfo: SendMessageParams | null = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsed = parseJSONObjectFromText(String(response));\n if (parsed?.text) {\n messageInfo = {\n text: String(parsed.text),\n channel: String(parsed.channel || \"current\"),\n };\n break;\n }\n }\n\n if (!messageInfo || !messageInfo.text) {\n if (callback) {\n callback({\n text: \"I couldn't understand what message you want me to send. Please try again.\",\n source: \"twitch\",\n });\n }\n return { success: false, error: \"Could not extract message parameters\" };\n }\n\n // Determine target channel\n let targetChannel = twitchService.getPrimaryChannel();\n if (messageInfo.channel && messageInfo.channel !== \"current\") {\n targetChannel = normalizeChannel(messageInfo.channel);\n }\n\n // Get channel from room context if available\n if (currentState?.data?.room?.channelId) {\n targetChannel = normalizeChannel(\n currentState.data.room.channelId as string,\n );\n }\n\n // Send message\n const result = await twitchService.sendMessage(messageInfo.text, {\n channel: targetChannel,\n });\n\n if (!result.success) {\n if (callback) {\n callback({\n text: `Failed to send message: ${result.error}`,\n source: \"twitch\",\n });\n }\n return { success: false, error: result.error };\n }\n\n if (callback) {\n callback({\n text: \"Message sent successfully.\",\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n channel: targetChannel,\n messageId: result.messageId,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Send a message to chat saying 'Hello everyone!'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that message to the chat.\",\n actions: [\"TWITCH_SEND_MESSAGE\"],\n },\n },\n ],\n ],\n};\n",
|
|
12
|
-
"/**\n * Channel state provider for Twitch plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { TwitchService } from \"../service.js\";\nimport {\n formatChannelForDisplay,\n normalizeChannel,\n TWITCH_SERVICE_NAME,\n} from \"../types.js\";\n/**\n * Provider that gives the agent information about the current Twitch channel context.\n */\nexport const channelStateProvider: Provider = {\n name: \"twitchChannelState\",\n description: \"Provides information about the current Twitch channel context\",\n\n dynamic: true,\nget: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n// Only provide context for Twitch messages\n if (message.content.source !== \"twitch\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const twitchService =\n runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n\n if (!twitchService || !twitchService.isConnected()) {\n return {\n data: {\n connected: false,\n },\n values: {\n connected: false,\n },\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n // Get room from state if available\n const room = state?.data?.room;\n const channelId = room?.channelId as string | undefined;\n const channel = channelId\n ? normalizeChannel(channelId)\n : twitchService.getPrimaryChannel();\n\n const joinedChannels = twitchService.getJoinedChannels();\n const isPrimaryChannel = channel === twitchService.getPrimaryChannel();\n const botUsername = twitchService.getBotUsername();\n\n let responseText = `${agentName} is currently in Twitch channel ${formatChannelForDisplay(channel)}.`;\n\n if (isPrimaryChannel) {\n responseText += \" This is the primary channel.\";\n }\n\n responseText += `\\n\\nTwitch is a live streaming platform. Chat messages are public and visible to all viewers.`;\n responseText += ` ${agentName} is logged in as @${botUsername}.`;\n responseText += ` Currently connected to ${joinedChannels.length} channel(s).`;\n\n return {\n data: {\n channel,\n displayChannel: formatChannelForDisplay(channel),\n isPrimaryChannel,\n botUsername,\n joinedChannels,\n channelCount: joinedChannels.length,\n connected: true,\n },\n values: {\n channel,\n displayChannel: formatChannelForDisplay(channel),\n isPrimaryChannel,\n botUsername,\n channelCount: joinedChannels.length,\n },\n text: responseText,\n };\n },\n};\n",
|
|
13
|
-
"/**\n * User context provider for Twitch plugin.\n */\n\nimport type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\nimport type { TwitchService } from \"../service.js\";\nimport {\n getTwitchUserDisplayName,\n TWITCH_SERVICE_NAME,\n type TwitchUserInfo,\n} from \"../types.js\";\n/**\n * Provider that gives the agent information about the Twitch user context.\n */\nexport const userContextProvider: Provider = {\n name: \"twitchUserContext\",\n description:\n \"Provides information about the Twitch user in the current conversation\",\n\n dynamic: true,\nget: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n// Only provide context for Twitch messages\n if (message.content.source !== \"twitch\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const twitchService =\n runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n\n if (!twitchService || !twitchService.isConnected()) {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n // Try to get user info from message metadata\n const metadata = message.content.metadata as\n | Record<string, unknown>\n | undefined;\n const userInfo = metadata?.user as TwitchUserInfo | undefined;\n\n if (!userInfo) {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const displayName = getTwitchUserDisplayName(userInfo);\n const roles: string[] = [];\n\n if (userInfo.isBroadcaster) {\n roles.push(\"broadcaster\");\n }\n if (userInfo.isModerator) {\n roles.push(\"moderator\");\n }\n if (userInfo.isVip) {\n roles.push(\"VIP\");\n }\n if (userInfo.isSubscriber) {\n roles.push(\"subscriber\");\n }\n\n const roleText = roles.length > 0 ? roles.join(\", \") : \"viewer\";\n\n let responseText = `${agentName} is talking to ${displayName} (${roleText}) in Twitch chat.`;\n\n if (userInfo.isBroadcaster) {\n responseText += ` ${displayName} is the channel owner/broadcaster.`;\n } else if (userInfo.isModerator) {\n responseText += ` ${displayName} is a channel moderator.`;\n }\n\n return {\n data: {\n userId: userInfo.userId,\n username: userInfo.username,\n displayName,\n isBroadcaster: userInfo.isBroadcaster,\n isModerator: userInfo.isModerator,\n isVip: userInfo.isVip,\n isSubscriber: userInfo.isSubscriber,\n roles,\n color: userInfo.color,\n },\n values: {\n userId: userInfo.userId,\n username: userInfo.username,\n displayName,\n roleText,\n isBroadcaster: userInfo.isBroadcaster,\n isModerator: userInfo.isModerator,\n },\n text: responseText,\n };\n },\n};\n"
|
|
5
|
+
"/**\n * Twitch chat integration plugin for ElizaOS.\n *\n * This plugin provides Twitch chat integration using the @twurple library.\n */\n\nimport type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { getConnectorAccountManager, logger } from \"@elizaos/core\";\n\nexport * from \"./accounts.js\";\n// Service\nexport { TwitchService } from \"./service.js\";\n// Types\nexport * from \"./types.js\";\n\n// Twitch send/list/join/leave operations route through the MESSAGE action via\n// the MessageConnector registered by TwitchService.registerSendHandlers.\n\nimport { createTwitchConnectorAccountProvider } from \"./connector-account-provider.js\";\n\n// Import service for plugin\nimport { TwitchService } from \"./service.js\";\nimport { TwitchWorkflowCredentialProvider } from \"./workflow-credential-provider.js\";\n\n/**\n * Twitch plugin definition.\n */\nconst twitchPlugin: Plugin = {\n name: \"twitch\",\n description:\n \"Twitch chat integration plugin for ElizaOS with real-time messaging\",\n\n services: [TwitchService, TwitchWorkflowCredentialProvider],\n\n actions: [],\n\n providers: [],\n\n tests: [],\n\n // Self-declared auto-enable: activate when the \"twitch\" connector is\n // configured under config.connectors. The hardcoded CONNECTOR_PLUGINS map\n // in plugin-auto-enable-engine.ts still serves as a fallback.\n autoEnable: {\n connectorKeys: [\"twitch\"],\n },\n\n init: async (\n _config: Record<string, string>,\n runtime: IAgentRuntime,\n ): Promise<void> => {\n try {\n const manager = getConnectorAccountManager(runtime);\n manager.registerProvider(createTwitchConnectorAccountProvider(runtime));\n } catch (err) {\n logger.warn(\n {\n src: \"plugin:twitch\",\n err: err instanceof Error ? err.message : String(err),\n },\n \"Failed to register Twitch provider with ConnectorAccountManager\",\n );\n }\n\n const username = runtime.getSetting(\"TWITCH_USERNAME\");\n const clientId = runtime.getSetting(\"TWITCH_CLIENT_ID\");\n const accessToken = runtime.getSetting(\"TWITCH_ACCESS_TOKEN\");\n const channel = runtime.getSetting(\"TWITCH_CHANNEL\");\n\n logger.info(\"=\".repeat(60));\n logger.info(\"Twitch Plugin Configuration\");\n logger.info(\"=\".repeat(60));\n logger.info(` Username: ${username ? \"✓ Set\" : \"✗ Missing (required)\"}`);\n logger.info(` Client ID: ${clientId ? \"✓ Set\" : \"✗ Missing (required)\"}`);\n logger.info(\n ` Access Token: ${accessToken ? \"✓ Set\" : \"✗ Missing (required)\"}`,\n );\n logger.info(\n ` Channel: ${channel ? `✓ ${channel}` : \"✗ Missing (required)\"}`,\n );\n logger.info(\"=\".repeat(60));\n\n // Validate required settings\n const missing: string[] = [];\n if (!username) missing.push(\"TWITCH_USERNAME\");\n if (!clientId) missing.push(\"TWITCH_CLIENT_ID\");\n if (!accessToken) missing.push(\"TWITCH_ACCESS_TOKEN\");\n if (!channel) missing.push(\"TWITCH_CHANNEL\");\n\n if (missing.length > 0) {\n logger.warn(\n `Twitch plugin: Missing required configuration: ${missing.join(\", \")}`,\n );\n }\n\n // Additional optional settings\n const clientSecret = runtime.getSetting(\"TWITCH_CLIENT_SECRET\");\n const refreshToken = runtime.getSetting(\"TWITCH_REFRESH_TOKEN\");\n const additionalChannels = runtime.getSetting(\"TWITCH_CHANNELS\");\n const requireMention = runtime.getSetting(\"TWITCH_REQUIRE_MENTION\");\n const allowedRoles = runtime.getSetting(\"TWITCH_ALLOWED_ROLES\");\n\n if (clientSecret && refreshToken) {\n logger.info(\n \" Token Refresh: ✓ Enabled (client secret and refresh token set)\",\n );\n } else if (clientSecret || refreshToken) {\n logger.warn(\n \" Token Refresh: ⚠ Partial (need both TWITCH_CLIENT_SECRET and TWITCH_REFRESH_TOKEN)\",\n );\n }\n\n if (additionalChannels) {\n logger.info(` Additional Channels: ${additionalChannels}`);\n }\n\n if (requireMention === \"true\") {\n logger.info(\n \" Require Mention: ✓ Enabled (will only respond to @mentions)\",\n );\n }\n\n if (allowedRoles) {\n logger.info(` Allowed Roles: ${allowedRoles}`);\n }\n },\n};\n\nexport default twitchPlugin;\n",
|
|
6
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport type { TwitchRole, TwitchSettings } from \"./types.js\";\n\nexport const DEFAULT_TWITCH_ACCOUNT_ID = \"default\";\n\nexport type TwitchAccountConfig = Partial<\n Omit<\n TwitchSettings,\n \"additionalChannels\" | \"allowedRoles\" | \"allowedUserIds\" | \"accountId\"\n >\n> & {\n accountId?: string;\n id?: string;\n additionalChannels?: string[] | string;\n channels?: string[] | string;\n allowedRoles?: TwitchRole[] | string;\n allowedUserIds?: string[] | string;\n};\n\ntype TwitchMultiAccountConfig = TwitchAccountConfig & {\n accounts?: Record<string, TwitchAccountConfig>;\n};\n\nfunction stringSetting(\n runtime: IAgentRuntime,\n key: string,\n): string | undefined {\n const value = runtime.getSetting(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction characterConfig(runtime: IAgentRuntime): TwitchMultiAccountConfig {\n const settings = runtime.character?.settings as\n | Record<string, unknown>\n | undefined;\n const raw = settings?.twitch;\n return raw && typeof raw === \"object\"\n ? (raw as TwitchMultiAccountConfig)\n : {};\n}\n\nfunction parseAccountsJson(\n runtime: IAgentRuntime,\n): Record<string, TwitchAccountConfig> {\n const raw = stringSetting(runtime, \"TWITCH_ACCOUNTS\");\n if (!raw) return {};\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return Object.fromEntries(\n parsed\n .filter(\n (item): item is TwitchAccountConfig =>\n Boolean(item) && typeof item === \"object\",\n )\n .map((item) => [\n normalizeTwitchAccountId(item.accountId ?? item.id),\n item,\n ]),\n );\n }\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, TwitchAccountConfig>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction allAccountConfigs(\n runtime: IAgentRuntime,\n): Record<string, TwitchAccountConfig> {\n return {\n ...(characterConfig(runtime).accounts ?? {}),\n ...parseAccountsJson(runtime),\n };\n}\n\nfunction accountConfig(\n runtime: IAgentRuntime,\n accountId: string,\n): TwitchAccountConfig {\n const accounts = allAccountConfigs(runtime);\n return (\n accounts[accountId] ?? accounts[normalizeTwitchAccountId(accountId)] ?? {}\n );\n}\n\nfunction boolValue(value: unknown, fallback = false): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.trim().toLowerCase() === \"true\";\n return fallback;\n}\n\nfunction stringList(value: unknown): string[] {\n if (Array.isArray(value))\n return value.map((item) => String(item).trim()).filter(Boolean);\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nfunction roleList(value: unknown): TwitchRole[] {\n const values = stringList(value).map(\n (role) => role.toLowerCase() as TwitchRole,\n );\n return values.length ? values : [\"all\"];\n}\n\nexport function normalizeTwitchAccountId(accountId?: unknown): string {\n if (typeof accountId !== \"string\") return DEFAULT_TWITCH_ACCOUNT_ID;\n const trimmed = accountId.trim();\n return trimmed || DEFAULT_TWITCH_ACCOUNT_ID;\n}\n\nexport function listTwitchAccountIds(runtime: IAgentRuntime): string[] {\n const ids = new Set<string>();\n const config = characterConfig(runtime);\n\n if (stringSetting(runtime, \"TWITCH_ACCESS_TOKEN\") || config.accessToken) {\n ids.add(DEFAULT_TWITCH_ACCOUNT_ID);\n }\n\n for (const id of Object.keys(allAccountConfigs(runtime))) {\n ids.add(normalizeTwitchAccountId(id));\n }\n\n return Array.from(ids.size ? ids : new Set([DEFAULT_TWITCH_ACCOUNT_ID])).sort(\n (a, b) => a.localeCompare(b),\n );\n}\n\nexport function resolveDefaultTwitchAccountId(runtime: IAgentRuntime): string {\n const requested =\n stringSetting(runtime, \"TWITCH_DEFAULT_ACCOUNT_ID\") ??\n stringSetting(runtime, \"TWITCH_ACCOUNT_ID\");\n if (requested) return normalizeTwitchAccountId(requested);\n\n const ids = listTwitchAccountIds(runtime);\n return ids.includes(DEFAULT_TWITCH_ACCOUNT_ID)\n ? DEFAULT_TWITCH_ACCOUNT_ID\n : ids[0];\n}\n\nexport function readTwitchAccountId(...sources: unknown[]): string | undefined {\n for (const source of sources) {\n if (!source || typeof source !== \"object\") continue;\n const record = source as Record<string, unknown>;\n const parameters =\n record.parameters && typeof record.parameters === \"object\"\n ? (record.parameters as Record<string, unknown>)\n : {};\n const data =\n record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>)\n : {};\n const metadata =\n record.metadata && typeof record.metadata === \"object\"\n ? (record.metadata as Record<string, unknown>)\n : {};\n const twitch =\n data.twitch && typeof data.twitch === \"object\"\n ? (data.twitch as Record<string, unknown>)\n : {};\n const value =\n record.accountId ??\n parameters.accountId ??\n data.accountId ??\n twitch.accountId ??\n metadata.accountId;\n if (typeof value === \"string\" && value.trim())\n return normalizeTwitchAccountId(value);\n }\n return undefined;\n}\n\nexport function resolveTwitchAccountSettings(\n runtime: IAgentRuntime,\n requestedAccountId?: string | null,\n): TwitchSettings {\n const accountId = normalizeTwitchAccountId(\n requestedAccountId ?? resolveDefaultTwitchAccountId(runtime),\n );\n const base = characterConfig(runtime);\n const account = accountConfig(runtime, accountId);\n const allowEnv = accountId === DEFAULT_TWITCH_ACCOUNT_ID;\n\n return {\n accountId,\n username:\n account.username ??\n base.username ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_USERNAME\") : undefined) ??\n \"\",\n clientId:\n account.clientId ??\n base.clientId ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_CLIENT_ID\") : undefined) ??\n \"\",\n accessToken:\n account.accessToken ??\n base.accessToken ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_ACCESS_TOKEN\") : undefined) ??\n \"\",\n clientSecret:\n account.clientSecret ??\n base.clientSecret ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_CLIENT_SECRET\") : undefined),\n refreshToken:\n account.refreshToken ??\n base.refreshToken ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_REFRESH_TOKEN\") : undefined),\n channel:\n account.channel ??\n base.channel ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_CHANNEL\") : undefined) ??\n \"\",\n additionalChannels: stringList(\n account.additionalChannels ??\n account.channels ??\n base.additionalChannels ??\n base.channels ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_CHANNELS\") : undefined),\n ),\n requireMention: boolValue(\n account.requireMention ??\n base.requireMention ??\n (allowEnv\n ? stringSetting(runtime, \"TWITCH_REQUIRE_MENTION\")\n : undefined),\n ),\n allowedRoles: roleList(\n account.allowedRoles ??\n base.allowedRoles ??\n (allowEnv ? stringSetting(runtime, \"TWITCH_ALLOWED_ROLES\") : undefined),\n ),\n allowedUserIds: stringList(account.allowedUserIds ?? base.allowedUserIds),\n enabled: boolValue(account.enabled ?? base.enabled, true),\n };\n}\n",
|
|
7
|
+
"/**\n * Twitch service implementation for ElizaOS.\n *\n * This service provides Twitch chat integration using the @twurple library.\n */\n\nimport {\n type Content,\n type EventPayload,\n type IAgentRuntime,\n logger,\n type MessageConnectorChannelOpParams,\n type MessageConnectorChatContext,\n type MessageConnectorQueryContext,\n type MessageConnectorTarget,\n Service,\n type TargetInfo,\n} from \"@elizaos/core\";\nimport { RefreshingAuthProvider, StaticAuthProvider } from \"@twurple/auth\";\nimport { ChatClient, type ChatMessage } from \"@twurple/chat\";\nimport {\n listTwitchAccountIds,\n normalizeTwitchAccountId,\n readTwitchAccountId,\n resolveDefaultTwitchAccountId,\n resolveTwitchAccountSettings,\n} from \"./accounts.js\";\nimport {\n formatChannelForDisplay,\n type ITwitchService,\n MAX_TWITCH_MESSAGE_LENGTH,\n normalizeChannel,\n splitMessageForTwitch,\n stripMarkdownForTwitch,\n TWITCH_SERVICE_NAME,\n TwitchConfigurationError,\n TwitchEventTypes,\n type TwitchMessage,\n type TwitchMessageSendOptions,\n TwitchNotConnectedError,\n type TwitchSendResult,\n type TwitchSettings,\n type TwitchUserInfo,\n} from \"./types.js\";\n\nconst TWITCH_CONNECTOR_CONTEXTS = [\"social\", \"connectors\"];\nconst TWITCH_CONNECTOR_CAPABILITIES = [\n \"send_message\",\n \"resolve_targets\",\n \"list_rooms\",\n \"join\",\n \"leave\",\n \"chat_context\",\n];\n\nfunction normalizeTwitchConnectorQuery(value: string): string {\n return normalizeChannel(value.trim().replace(/^@/, \"\")).toLowerCase();\n}\n\nfunction scoreTwitchChannelMatch(query: string, channel: string): number {\n const normalized = normalizeTwitchConnectorQuery(channel);\n if (!query) {\n return 0.45;\n }\n if (normalized === query) {\n return 1;\n }\n if (normalized.startsWith(query)) {\n return 0.85;\n }\n if (normalized.includes(query)) {\n return 0.7;\n }\n return 0;\n}\n\nasync function logTwurpleCall<T>(\n op: string,\n context: Record<string, unknown>,\n fn: () => Promise<T>,\n): Promise<T> {\n const startedAt = Date.now();\n logger.debug(\n { sdk: \"twurple\", op, ...context },\n `[TwitchService] ${op} started`,\n );\n try {\n const result = await fn();\n logger.info(\n {\n sdk: \"twurple\",\n op,\n ...context,\n durationMs: Date.now() - startedAt,\n },\n `[TwitchService] ${op} ok`,\n );\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\n {\n sdk: \"twurple\",\n op,\n ...context,\n durationMs: Date.now() - startedAt,\n error: message,\n },\n `[TwitchService] ${op} failed`,\n );\n throw error;\n }\n}\n\n/**\n * Twitch chat service for ElizaOS agents.\n */\nexport class TwitchService extends Service implements ITwitchService {\n static serviceType: string = TWITCH_SERVICE_NAME;\n capabilityDescription =\n \"Provides Twitch chat integration for sending and receiving messages\";\n\n private settings!: TwitchSettings;\n private client!: ChatClient;\n private connected: boolean = false;\n private joinedChannels: Set<string> = new Set();\n private accountServices = new Map<string, TwitchService>();\n\n /**\n * Start the Twitch service.\n */\n static async start(runtime: IAgentRuntime): Promise<TwitchService> {\n const service = new TwitchService();\n await service.initialize(runtime);\n return service;\n }\n\n static registerSendHandlers(\n runtime: IAgentRuntime,\n serviceInstance: TwitchService,\n ): void {\n if (!serviceInstance) {\n return;\n }\n\n for (const accountService of serviceInstance.getAccountServiceList()) {\n const accountId = accountService.getAccountId(runtime);\n const sendHandler = accountService.handleSendMessage.bind(accountService);\n if (typeof runtime.registerMessageConnector === \"function\") {\n runtime.registerMessageConnector({\n source: \"twitch\",\n accountId,\n label: \"Twitch\",\n description:\n \"Twitch public chat connector for sending messages to joined channels.\",\n capabilities: [...TWITCH_CONNECTOR_CAPABILITIES],\n supportedTargetKinds: [\"channel\"],\n contexts: [...TWITCH_CONNECTOR_CONTEXTS],\n metadata: {\n accountId,\n service: TWITCH_SERVICE_NAME,\n maxMessageLength: MAX_TWITCH_MESSAGE_LENGTH,\n },\n resolveTargets:\n accountService.resolveConnectorTargets.bind(accountService),\n listRecentTargets:\n accountService.listRecentConnectorTargets.bind(accountService),\n listRooms: accountService.listConnectorRooms.bind(accountService),\n joinHandler: accountService.handleJoinChannel.bind(accountService),\n leaveHandler: accountService.handleLeaveChannel.bind(accountService),\n getChatContext:\n accountService.getConnectorChatContext.bind(accountService),\n sendHandler,\n });\n runtime.logger.info(\n { src: \"plugin:twitch\", agentId: runtime.agentId },\n \"Registered Twitch chat connector\",\n );\n continue;\n }\n }\n }\n\n /**\n * Stop the Twitch service.\n */\n static async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService<TwitchService>(TWITCH_SERVICE_NAME);\n if (service) {\n await service.stop();\n }\n }\n\n /**\n * Initialize the Twitch service.\n */\n private async initialize(runtime: IAgentRuntime): Promise<void> {\n this.runtime = runtime;\n\n const startedAccounts: string[] = [];\n for (const accountId of listTwitchAccountIds(runtime)) {\n const settings = resolveTwitchAccountSettings(runtime, accountId);\n if (settings.enabled === false) {\n continue;\n }\n\n const accountService = new TwitchService();\n await accountService.initializeAccount(runtime, accountId);\n this.accountServices.set(accountService.getAccountId(), accountService);\n startedAccounts.push(accountService.getAccountId());\n }\n\n if (startedAccounts.length === 0) {\n logger.warn(\"No enabled Twitch accounts configured\");\n return;\n }\n\n logger.info(\n `Twitch service started ${startedAccounts.length} account(s): ${startedAccounts.join(\", \")}`,\n );\n }\n\n private async initializeAccount(\n runtime: IAgentRuntime,\n accountId?: string,\n ): Promise<void> {\n this.runtime = runtime;\n\n // Load configuration\n this.settings = this.loadSettings(accountId);\n\n // Validate configuration\n this.validateSettings();\n\n // Create auth provider\n const authProvider = await this.createAuthProvider();\n\n // Create chat client\n const allChannels = [\n this.settings.channel,\n ...this.settings.additionalChannels,\n ].map(normalizeChannel);\n\n this.client = new ChatClient({\n authProvider,\n channels: allChannels,\n rejoinChannelsOnReconnect: true,\n });\n\n // Set up event handlers\n this.setupEventHandlers();\n\n // Connect\n await this.connect();\n\n logger.info(\n `Twitch service initialized for ${this.settings.username}, joined channels: ${allChannels.join(\", \")}`,\n );\n }\n\n /**\n * Load settings from runtime.\n */\n private loadSettings(accountId?: string): TwitchSettings {\n return resolveTwitchAccountSettings(this.runtime, accountId);\n }\n\n /**\n * Validate the settings.\n */\n private validateSettings(): void {\n if (!this.settings.username) {\n throw new TwitchConfigurationError(\n \"TWITCH_USERNAME is required\",\n \"TWITCH_USERNAME\",\n );\n }\n\n if (!this.settings.clientId) {\n throw new TwitchConfigurationError(\n \"TWITCH_CLIENT_ID is required\",\n \"TWITCH_CLIENT_ID\",\n );\n }\n\n if (!this.settings.accessToken) {\n throw new TwitchConfigurationError(\n \"TWITCH_ACCESS_TOKEN is required\",\n \"TWITCH_ACCESS_TOKEN\",\n );\n }\n\n if (!this.settings.channel) {\n throw new TwitchConfigurationError(\n \"TWITCH_CHANNEL is required\",\n \"TWITCH_CHANNEL\",\n );\n }\n }\n\n /**\n * Create the authentication provider.\n */\n private async createAuthProvider(): Promise<\n StaticAuthProvider | RefreshingAuthProvider\n > {\n const token = this.normalizeToken(this.settings.accessToken);\n\n if (this.settings.clientSecret) {\n const authProvider = new RefreshingAuthProvider({\n clientId: this.settings.clientId,\n clientSecret: this.settings.clientSecret,\n });\n\n await authProvider.addUserForToken({\n accessToken: token,\n refreshToken: this.settings.refreshToken || null,\n expiresIn: null,\n obtainmentTimestamp: Date.now(),\n });\n\n authProvider.onRefresh((userId, newToken) => {\n logger.info(\n `Twitch token refreshed for user ${userId}, expires in ${newToken.expiresIn}s`,\n );\n });\n\n authProvider.onRefreshFailure((userId, error) => {\n logger.error(\n `Twitch token refresh failed for user ${userId}: ${error.message}`,\n );\n });\n\n logger.info(`Using RefreshingAuthProvider for ${this.settings.username}`);\n return authProvider;\n }\n\n logger.info(`Using StaticAuthProvider for ${this.settings.username}`);\n return new StaticAuthProvider(this.settings.clientId, token);\n }\n\n /**\n * Normalize an OAuth token (remove oauth: prefix if present).\n */\n private normalizeToken(token: string): string {\n return token.startsWith(\"oauth:\") ? token.slice(6) : token;\n }\n\n /**\n * Set up event handlers for the chat client.\n */\n private setupEventHandlers(): void {\n // Connection events\n this.client.onConnect(() => {\n this.connected = true;\n logger.info(\"Twitch chat connected\");\n this.runtime.emitEvent(TwitchEventTypes.CONNECTION_READY, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n } as EventPayload);\n });\n\n this.client.onDisconnect((_manually, reason) => {\n this.connected = false;\n logger.warn(`Twitch chat disconnected: ${reason || \"unknown reason\"}`);\n this.runtime.emitEvent(TwitchEventTypes.CONNECTION_LOST, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n reason,\n } as EventPayload);\n });\n\n // Channel events\n this.client.onJoin((channel, user) => {\n const normalized = normalizeChannel(channel);\n if (user.toLowerCase() === this.settings.username.toLowerCase()) {\n this.joinedChannels.add(normalized);\n logger.info(`Joined Twitch channel: ${normalized}`);\n this.runtime.emitEvent(TwitchEventTypes.JOIN_CHANNEL, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n channel: normalized,\n } as EventPayload);\n }\n });\n\n this.client.onPart((channel, user) => {\n const normalized = normalizeChannel(channel);\n if (user.toLowerCase() === this.settings.username.toLowerCase()) {\n this.joinedChannels.delete(normalized);\n logger.info(`Left Twitch channel: ${normalized}`);\n this.runtime.emitEvent(TwitchEventTypes.LEAVE_CHANNEL, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n channel: normalized,\n } as EventPayload);\n }\n });\n\n // Message events\n this.client.onMessage(\n (channel: string, user: string, text: string, msg: ChatMessage) => {\n this.handleMessage(channel, user, text, msg);\n },\n );\n }\n\n /**\n * Handle an incoming chat message.\n */\n private handleMessage(\n channel: string,\n _user: string,\n text: string,\n msg: ChatMessage,\n ): void {\n const normalizedChannel = normalizeChannel(channel);\n\n // Ignore own messages\n if (\n msg.userInfo.userName.toLowerCase() ===\n this.settings.username.toLowerCase()\n ) {\n return;\n }\n\n const userInfo: TwitchUserInfo = {\n userId: msg.userInfo.userId,\n username: msg.userInfo.userName,\n displayName: msg.userInfo.displayName,\n isModerator: msg.userInfo.isMod,\n isBroadcaster: msg.userInfo.isBroadcaster,\n isVip: msg.userInfo.isVip,\n isSubscriber: msg.userInfo.isSubscriber,\n color: msg.userInfo.color,\n badges: msg.userInfo.badges,\n };\n\n // Check access control\n if (!this.isUserAllowed(userInfo)) {\n return;\n }\n\n // Check mention requirement\n if (this.settings.requireMention) {\n const mentionPattern = new RegExp(`@${this.settings.username}\\\\b`, \"i\");\n if (!mentionPattern.test(text)) {\n return;\n }\n }\n\n const message: TwitchMessage = {\n id: msg.id,\n channel: normalizedChannel,\n text,\n user: userInfo,\n timestamp: new Date(),\n isAction: msg.isCheer,\n isHighlighted: msg.isHighlight,\n replyTo: msg.parentMessageId\n ? {\n messageId: msg.parentMessageId,\n userId: msg.parentMessageUserId || \"\",\n username: msg.parentMessageUserName || \"\",\n text: msg.parentMessageText || \"\",\n }\n : undefined,\n };\n\n logger.debug(\n `Twitch message from ${userInfo.displayName} in #${normalizedChannel}: ${text.slice(0, 50)}...`,\n );\n\n this.runtime.emitEvent(TwitchEventTypes.MESSAGE_RECEIVED, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n message,\n } as EventPayload);\n }\n\n /**\n * Connect to Twitch.\n */\n private async connect(): Promise<void> {\n await this.client.connect();\n this.connected = true;\n }\n\n /**\n * Stop the service.\n */\n async stop(): Promise<void> {\n if (this.accountServices?.size > 0) {\n await Promise.all(\n Array.from(this.accountServices.values()).map((service) =>\n service.stop(),\n ),\n );\n this.accountServices.clear();\n logger.info(\"Twitch service stopped\");\n return;\n }\n\n if (this.client) {\n this.client.quit();\n }\n this.connected = false;\n this.joinedChannels.clear();\n logger.info(\"Twitch service stopped\");\n }\n\n private getAccountServiceList(): TwitchService[] {\n return this.accountServices?.size > 0\n ? Array.from(this.accountServices.values())\n : [this];\n }\n\n private getDefaultAccountService(): TwitchService {\n if (!this.accountServices || this.accountServices.size === 0) {\n return this;\n }\n\n const defaultAccountId = normalizeTwitchAccountId(\n resolveDefaultTwitchAccountId(this.runtime),\n );\n return (\n this.accountServices.get(defaultAccountId) ??\n Array.from(this.accountServices.values())[0]\n );\n }\n\n private getAccountService(accountId: string): TwitchService {\n if (!this.accountServices || this.accountServices.size === 0) {\n const ownAccountId = this.getAccountId();\n if (normalizeTwitchAccountId(accountId) !== ownAccountId) {\n throw new Error(\n `Twitch account '${accountId}' is not available in this service instance`,\n );\n }\n return this;\n }\n\n const normalized = normalizeTwitchAccountId(accountId);\n const service = this.accountServices.get(normalized);\n if (!service) {\n throw new Error(`Twitch account '${normalized}' is not available`);\n }\n return service;\n }\n\n // ============================================================================\n // Public Interface\n // ============================================================================\n\n isConnected(): boolean {\n if (this.accountServices?.size > 0) {\n return Array.from(this.accountServices.values()).some((service) =>\n service.isConnected(),\n );\n }\n return this.connected;\n }\n\n getBotUsername(): string {\n if (this.accountServices?.size > 0) {\n return this.getDefaultAccountService().getBotUsername();\n }\n return this.settings.username;\n }\n\n getAccountId(runtime?: IAgentRuntime): string {\n if (this.accountServices?.size > 0) {\n return this.getDefaultAccountService().getAccountId(runtime);\n }\n return normalizeTwitchAccountId(\n this.settings?.accountId ??\n (runtime ? resolveDefaultTwitchAccountId(runtime) : undefined),\n );\n }\n\n getPrimaryChannel(): string {\n if (this.accountServices?.size > 0) {\n return this.getDefaultAccountService().getPrimaryChannel();\n }\n return this.settings.channel;\n }\n\n getJoinedChannels(): string[] {\n if (this.accountServices?.size > 0) {\n return this.getDefaultAccountService().getJoinedChannels();\n }\n return Array.from(this.joinedChannels);\n }\n\n async handleSendMessage(\n runtime: IAgentRuntime,\n target: TargetInfo,\n content: Content,\n ): Promise<void> {\n const requestedAccountId = normalizeTwitchAccountId(\n target.accountId ??\n readTwitchAccountId(content, target) ??\n this.getAccountId(),\n );\n if (this.accountServices?.size > 0) {\n await this.getAccountService(requestedAccountId).handleSendMessage(\n runtime,\n target,\n content,\n );\n return;\n }\n\n if (requestedAccountId !== this.getAccountId()) {\n throw new Error(\n `Twitch account '${requestedAccountId}' is not available in this service instance`,\n );\n }\n\n const text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n if (!text) {\n throw new Error(\"Twitch connector requires non-empty text content.\");\n }\n\n let channel = target.channelId;\n let replyTo = target.threadId;\n\n if (target.roomId && !channel) {\n const room = await runtime.getRoom(target.roomId);\n channel = room?.channelId;\n const metadata = room?.metadata as Record<string, unknown> | undefined;\n replyTo =\n replyTo ??\n (typeof metadata?.twitchReplyTo === \"string\"\n ? metadata.twitchReplyTo\n : undefined);\n }\n\n await this.sendMessage(text, {\n channel: channel ? normalizeChannel(channel) : this.getPrimaryChannel(),\n replyTo,\n });\n }\n\n async resolveConnectorTargets(\n query: string,\n _context: MessageConnectorQueryContext,\n ): Promise<MessageConnectorTarget[]> {\n const normalizedQuery = normalizeTwitchConnectorQuery(query);\n return this.getConnectorChannels()\n .map((channel) => {\n const score = scoreTwitchChannelMatch(normalizedQuery, channel);\n return score > 0 ? this.buildChannelTarget(channel, score) : null;\n })\n .filter((target): target is MessageConnectorTarget => Boolean(target))\n .slice(0, 25);\n }\n\n async listConnectorRooms(\n _context: MessageConnectorQueryContext,\n ): Promise<MessageConnectorTarget[]> {\n return this.getConnectorChannels()\n .map((channel) => this.buildChannelTarget(channel, 0.5))\n .slice(0, 50);\n }\n\n async listRecentConnectorTargets(\n context: MessageConnectorQueryContext,\n ): Promise<MessageConnectorTarget[]> {\n const targets: MessageConnectorTarget[] = [];\n const room =\n context.roomId && typeof context.runtime.getRoom === \"function\"\n ? await context.runtime.getRoom(context.roomId)\n : null;\n const channel = context.target?.channelId ?? room?.channelId;\n if (channel) {\n targets.push(this.buildChannelTarget(channel, 0.95));\n }\n targets.push(...(await this.listConnectorRooms(context)));\n\n const seen = new Set<string>();\n return targets\n .filter((target) => {\n const channelId = target.target.channelId;\n if (!channelId || seen.has(channelId)) {\n return false;\n }\n seen.add(channelId);\n return true;\n })\n .slice(0, 25);\n }\n\n async handleJoinChannel(\n _runtime: IAgentRuntime,\n params: MessageConnectorChannelOpParams,\n ): Promise<void> {\n const channel = this.resolveChannelOpTarget(params);\n if (!channel) {\n throw new Error(\n \"Twitch MESSAGE operation=join requires channelId, alias, or target channel.\",\n );\n }\n if (this.joinedChannels.has(channel)) {\n return;\n }\n await this.joinChannel(channel);\n }\n\n async handleLeaveChannel(\n _runtime: IAgentRuntime,\n params: MessageConnectorChannelOpParams,\n ): Promise<void> {\n const channel = this.resolveChannelOpTarget(params);\n if (!channel) {\n throw new Error(\n \"Twitch MESSAGE operation=leave requires channelId, alias, or target channel.\",\n );\n }\n if (channel === normalizeChannel(this.getPrimaryChannel())) {\n throw new Error(`Cannot leave the primary Twitch channel #${channel}.`);\n }\n if (!this.joinedChannels.has(channel)) {\n throw new Error(`Not currently in Twitch channel #${channel}.`);\n }\n await this.leaveChannel(channel);\n }\n\n async getConnectorChatContext(\n target: TargetInfo,\n context: MessageConnectorQueryContext,\n ): Promise<MessageConnectorChatContext | null> {\n let channel = target.channelId;\n if (!channel && target.roomId) {\n const room = await context.runtime.getRoom(target.roomId);\n channel = room?.channelId;\n }\n channel = channel ? normalizeChannel(channel) : this.getPrimaryChannel();\n\n return {\n target: {\n source: \"twitch\",\n accountId: this.getAccountId(),\n channelId: channel,\n } as TargetInfo,\n label: formatChannelForDisplay(channel),\n summary:\n \"Twitch chat messages are public and visible to viewers in the channel.\",\n metadata: {\n accountId: this.getAccountId(),\n twitchChannel: channel,\n botUsername: this.getBotUsername(),\n joined: this.joinedChannels.has(channel),\n },\n };\n }\n\n private getConnectorChannels(): string[] {\n const channels = new Set<string>();\n if (this.settings?.channel) {\n channels.add(normalizeChannel(this.settings.channel));\n }\n for (const channel of this.settings?.additionalChannels ?? []) {\n channels.add(normalizeChannel(channel));\n }\n for (const channel of this.joinedChannels) {\n channels.add(normalizeChannel(channel));\n }\n return Array.from(channels);\n }\n\n private resolveChannelOpTarget(\n params: MessageConnectorChannelOpParams,\n ): string | null {\n const targetRecord = params.target as Record<string, unknown> | undefined;\n const raw =\n params.target?.channelId ??\n params.channelId ??\n params.alias ??\n targetRecord?.alias ??\n targetRecord?.name;\n return typeof raw === \"string\" && raw.trim()\n ? normalizeChannel(raw.trim())\n : null;\n }\n\n private buildChannelTarget(\n channel: string,\n score: number,\n ): MessageConnectorTarget {\n const normalized = normalizeChannel(channel);\n return {\n target: {\n source: \"twitch\",\n accountId: this.getAccountId(),\n channelId: normalized,\n } as TargetInfo,\n label: formatChannelForDisplay(normalized),\n kind: \"channel\",\n description: \"Twitch public chat channel\",\n score,\n contexts: [...TWITCH_CONNECTOR_CONTEXTS],\n metadata: {\n accountId: this.getAccountId(),\n twitchChannel: normalized,\n joined: this.joinedChannels.has(normalized),\n primary: normalized === this.getPrimaryChannel(),\n },\n };\n }\n\n isUserAllowed(user: TwitchUserInfo): boolean {\n // Check allowlist first\n if (\n this.settings.allowedUserIds.length > 0 &&\n !this.settings.allowedUserIds.includes(user.userId)\n ) {\n return false;\n }\n\n // Check roles\n if (this.settings.allowedRoles.includes(\"all\")) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"owner\") && user.isBroadcaster) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"moderator\") && user.isModerator) {\n return true;\n }\n\n if (this.settings.allowedRoles.includes(\"vip\") && user.isVip) {\n return true;\n }\n\n if (\n this.settings.allowedRoles.includes(\"subscriber\") &&\n user.isSubscriber\n ) {\n return true;\n }\n\n return false;\n }\n\n async sendMessage(\n text: string,\n options?: TwitchMessageSendOptions,\n ): Promise<TwitchSendResult> {\n if (this.accountServices?.size > 0) {\n const accountId = normalizeTwitchAccountId(\n (options as TwitchMessageSendOptions & { accountId?: string })\n ?.accountId ?? this.getAccountId(),\n );\n return this.getAccountService(accountId).sendMessage(text, options);\n }\n\n if (!this.connected) {\n throw new TwitchNotConnectedError();\n }\n\n const channel = normalizeChannel(options?.channel || this.settings.channel);\n\n // Strip markdown for Twitch\n const cleanedText = stripMarkdownForTwitch(text);\n if (!cleanedText) {\n return { success: true, messageId: \"skipped-empty\" };\n }\n\n // Split long messages\n const chunks = splitMessageForTwitch(cleanedText);\n\n let lastMessageId: string | undefined;\n\n for (const chunk of chunks) {\n await logTwurpleCall(\n \"say\",\n { channel, chunkLen: chunk.length, replyTo: options?.replyTo },\n async () => {\n if (options?.replyTo) {\n await this.client.say(channel, chunk, {\n replyTo: options.replyTo,\n });\n } else {\n await this.client.say(channel, chunk);\n }\n },\n );\n\n // Generate a message ID since Twurple doesn't return one\n lastMessageId = crypto.randomUUID();\n\n // Small delay between chunks\n if (chunks.length > 1) {\n await new Promise((resolve) => setTimeout(resolve, 300));\n }\n }\n\n this.runtime.emitEvent(TwitchEventTypes.MESSAGE_SENT, {\n runtime: this.runtime,\n accountId: this.getAccountId(),\n channel,\n text: cleanedText,\n messageId: lastMessageId,\n } as EventPayload);\n\n return { success: true, messageId: lastMessageId };\n }\n\n async joinChannel(channel: string): Promise<void> {\n if (this.accountServices?.size > 0) {\n await this.getDefaultAccountService().joinChannel(channel);\n return;\n }\n\n const normalized = normalizeChannel(channel);\n await logTwurpleCall(\"join\", { channel: normalized }, async () => {\n await this.client.join(normalized);\n });\n this.joinedChannels.add(normalized);\n }\n\n async leaveChannel(channel: string): Promise<void> {\n if (this.accountServices?.size > 0) {\n await this.getDefaultAccountService().leaveChannel(channel);\n return;\n }\n\n const normalized = normalizeChannel(channel);\n await logTwurpleCall(\"part\", { channel: normalized }, async () => {\n await this.client.part(normalized);\n });\n this.joinedChannels.delete(normalized);\n }\n}\n",
|
|
8
|
+
"/**\n * Type definitions for the Twitch plugin.\n */\n\nimport type { IAgentRuntime, Service } from \"@elizaos/core\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum message length for Twitch chat */\nexport const MAX_TWITCH_MESSAGE_LENGTH = 500;\n\n/** Service name constant */\nexport const TWITCH_SERVICE_NAME = \"twitch\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Event types emitted by the Twitch plugin */\nexport enum TwitchEventTypes {\n MESSAGE_RECEIVED = \"TWITCH_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"TWITCH_MESSAGE_SENT\",\n JOIN_CHANNEL = \"TWITCH_JOIN_CHANNEL\",\n LEAVE_CHANNEL = \"TWITCH_LEAVE_CHANNEL\",\n CONNECTION_READY = \"TWITCH_CONNECTION_READY\",\n CONNECTION_LOST = \"TWITCH_CONNECTION_LOST\",\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/** Twitch user roles for access control */\nexport type TwitchRole = \"moderator\" | \"owner\" | \"vip\" | \"subscriber\" | \"all\";\n\n/** Configuration settings for the Twitch plugin */\nexport interface TwitchSettings {\n /** Connector account identifier for this Twitch bot instance */\n accountId?: string;\n /** Twitch username for the bot account */\n username: string;\n /** Twitch application client ID */\n clientId: string;\n /** OAuth access token */\n accessToken: string;\n /** Optional client secret for token refresh */\n clientSecret?: string;\n /** Optional refresh token for automatic token refresh */\n refreshToken?: string;\n /** Primary channel to join */\n channel: string;\n /** Additional channels to join */\n additionalChannels: string[];\n /** Whether to require @mention to respond */\n requireMention: boolean;\n /** Roles allowed to interact with the bot */\n allowedRoles: TwitchRole[];\n /** Optional allowlist of user IDs */\n allowedUserIds: string[];\n /** Whether this configuration is enabled */\n enabled: boolean;\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Information about the message sender */\nexport interface TwitchUserInfo {\n /** Twitch user ID (numeric string) */\n userId: string;\n /** Twitch username (login name) */\n username: string;\n /** Display name (may include special characters) */\n displayName: string;\n /** Whether the user is a moderator */\n isModerator: boolean;\n /** Whether the user is the channel owner/broadcaster */\n isBroadcaster: boolean;\n /** Whether the user is a VIP */\n isVip: boolean;\n /** Whether the user is a subscriber */\n isSubscriber: boolean;\n /** User's chat color */\n color?: string;\n /** User's badges */\n badges: Map<string, string>;\n}\n\n/** Represents a Twitch chat message */\nexport interface TwitchMessage {\n /** Unique message ID */\n id: string;\n /** Channel name (without # prefix) */\n channel: string;\n /** Message text content */\n text: string;\n /** Sender information */\n user: TwitchUserInfo;\n /** Message timestamp */\n timestamp: Date;\n /** Whether this is an action message (/me) */\n isAction: boolean;\n /** Whether this is a highlighted message */\n isHighlighted: boolean;\n /** Reply thread info if this is a reply */\n replyTo?: {\n messageId: string;\n userId: string;\n username: string;\n text: string;\n };\n}\n\n/** Options for sending a message */\nexport interface TwitchMessageSendOptions {\n /** Channel to send to (defaults to primary channel) */\n channel?: string;\n /** Message ID to reply to */\n replyTo?: string;\n}\n\n/** Result from sending a message */\nexport interface TwitchSendResult {\n /** Whether the send succeeded */\n success: boolean;\n /** Generated message ID (if available) */\n messageId?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================================================\n// Service Interface\n// ============================================================================\n\n/** Interface for the Twitch service */\nexport interface ITwitchService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the bot username */\n getBotUsername(): string;\n\n /** Get the primary channel */\n getPrimaryChannel(): string;\n\n /** Get all joined channels */\n getJoinedChannels(): string[];\n\n /** Send a message to a channel */\n sendMessage(\n text: string,\n options?: TwitchMessageSendOptions,\n ): Promise<TwitchSendResult>;\n\n /** Join a channel */\n joinChannel(channel: string): Promise<void>;\n\n /** Leave a channel */\n leaveChannel(channel: string): Promise<void>;\n\n /** Check if a user is allowed to interact based on settings */\n isUserAllowed(user: TwitchUserInfo): boolean;\n}\n\n// ============================================================================\n// Event Payloads\n// ============================================================================\n\n/** Payload for MESSAGE_RECEIVED event */\nexport interface TwitchMessageReceivedPayload {\n message: TwitchMessage;\n runtime: IAgentRuntime;\n}\n\n/** Payload for MESSAGE_SENT event */\nexport interface TwitchMessageSentPayload {\n channel: string;\n text: string;\n messageId?: string;\n}\n\n/** Payload for JOIN_CHANNEL event */\nexport interface TwitchJoinChannelPayload {\n channel: string;\n}\n\n/** Payload for LEAVE_CHANNEL event */\nexport interface TwitchLeaveChannelPayload {\n channel: string;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Normalize a Twitch channel name (ensure no # prefix).\n */\nexport function normalizeChannel(channel: string): string {\n return channel.startsWith(\"#\") ? channel.slice(1) : channel;\n}\n\n/**\n * Format a channel name for display (with # prefix).\n */\nexport function formatChannelForDisplay(channel: string): string {\n const normalized = normalizeChannel(channel);\n return `#${normalized}`;\n}\n\n/**\n * Get the best display name for a Twitch user.\n */\nexport function getTwitchUserDisplayName(user: TwitchUserInfo): string {\n return user.displayName || user.username;\n}\n\n/**\n * Strip markdown formatting for Twitch chat display.\n * Twitch doesn't render markdown, so we convert it to plain text.\n */\nexport function stripMarkdownForTwitch(text: string): string {\n return (\n text\n // Remove bold\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/__([^_]+)__/g, \"$1\")\n // Remove italic\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/_([^_]+)_/g, \"$1\")\n // Remove strikethrough\n .replace(/~~([^~]+)~~/g, \"$1\")\n // Remove inline code\n .replace(/`([^`]+)`/g, \"$1\")\n // Remove code blocks\n .replace(/```[\\s\\S]*?```/g, \"[code block]\")\n // Remove links, keep text\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n // Remove headers\n .replace(/^#{1,6}\\s+/gm, \"\")\n // Remove blockquotes\n .replace(/^>\\s+/gm, \"\")\n // Remove list markers\n .replace(/^[-*+]\\s+/gm, \"• \")\n .replace(/^\\d+\\.\\s+/gm, \"• \")\n // Collapse multiple newlines\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim()\n );\n}\n\n/**\n * Split a message into chunks that fit Twitch's message limit.\n */\nexport function splitMessageForTwitch(\n text: string,\n maxLength: number = MAX_TWITCH_MESSAGE_LENGTH,\n): string[] {\n if (text.length <= maxLength) {\n return [text];\n }\n\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n // Try to split at a sentence boundary\n let splitIndex = remaining.lastIndexOf(\". \", maxLength);\n if (splitIndex === -1 || splitIndex < maxLength / 2) {\n // Try to split at a word boundary\n splitIndex = remaining.lastIndexOf(\" \", maxLength);\n }\n if (splitIndex === -1 || splitIndex < maxLength / 2) {\n // Force split at max length\n splitIndex = maxLength;\n }\n\n chunks.push(remaining.slice(0, splitIndex).trim());\n remaining = remaining.slice(splitIndex).trim();\n }\n\n return chunks;\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/** Base error class for Twitch plugin errors */\nexport class TwitchPluginError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TwitchPluginError\";\n }\n}\n\n/** Error when the Twitch service is not initialized */\nexport class TwitchServiceNotInitializedError extends TwitchPluginError {\n constructor(message: string = \"Twitch service is not initialized\") {\n super(message);\n this.name = \"TwitchServiceNotInitializedError\";\n }\n}\n\n/** Error when the Twitch client is not connected */\nexport class TwitchNotConnectedError extends TwitchPluginError {\n constructor(message: string = \"Twitch client is not connected\") {\n super(message);\n this.name = \"TwitchNotConnectedError\";\n }\n}\n\n/** Error when there is a configuration problem */\nexport class TwitchConfigurationError extends TwitchPluginError {\n settingName?: string;\n\n constructor(message: string, settingName?: string) {\n super(message);\n this.name = \"TwitchConfigurationError\";\n this.settingName = settingName;\n }\n}\n\n/** Error when an API call fails */\nexport class TwitchApiError extends TwitchPluginError {\n statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = \"TwitchApiError\";\n this.statusCode = statusCode;\n }\n}\n",
|
|
9
|
+
"/**\n * Twitch ConnectorAccountManager provider.\n *\n * Adapts the multi-account scaffolding in `accounts.ts` to the\n * `ConnectorAccountProvider` contract from\n * `@elizaos/core/connectors/account-manager`.\n *\n * Source of truth for accounts is character settings (`character.settings.twitch`)\n * + TWITCH_ACCOUNTS JSON env var + single-account env vars (TWITCH_USERNAME,\n * TWITCH_CLIENT_ID, TWITCH_ACCESS_TOKEN, TWITCH_REFRESH_TOKEN, TWITCH_CHANNEL).\n *\n * AccountKey is the twitch user id (or username when only that's available).\n * Role is `OWNER` since twitch OAuth tokens authenticate the user/channel.\n */\n\nimport type {\n ConnectorAccount,\n ConnectorAccountManager,\n ConnectorAccountPatch,\n ConnectorAccountProvider,\n IAgentRuntime,\n} from \"@elizaos/core\";\nimport {\n DEFAULT_TWITCH_ACCOUNT_ID,\n listTwitchAccountIds,\n normalizeTwitchAccountId,\n resolveTwitchAccountSettings,\n} from \"./accounts.js\";\nimport type { TwitchSettings } from \"./types.js\";\n\nexport const TWITCH_PROVIDER_ID = \"twitch\";\n\nfunction toConnectorAccount(settings: TwitchSettings): ConnectorAccount {\n const now = Date.now();\n const configured = Boolean(\n settings.username && settings.clientId && settings.accessToken,\n );\n return {\n id: normalizeTwitchAccountId(settings.accountId),\n provider: TWITCH_PROVIDER_ID,\n label: settings.username || settings.channel || settings.accountId,\n role: \"OWNER\",\n purpose: [\"messaging\"],\n accessGate: \"open\",\n status: settings.enabled !== false && configured ? \"connected\" : \"disabled\",\n externalId: settings.username || undefined,\n displayHandle: settings.username || undefined,\n createdAt: now,\n updatedAt: now,\n metadata: {\n channel: settings.channel ?? \"\",\n additionalChannels: settings.additionalChannels ?? [],\n requireMention: settings.requireMention ?? false,\n hasRefreshToken: Boolean(settings.refreshToken),\n },\n };\n}\n\nexport function createTwitchConnectorAccountProvider(\n runtime: IAgentRuntime,\n): ConnectorAccountProvider {\n return {\n provider: TWITCH_PROVIDER_ID,\n label: \"Twitch\",\n listAccounts: async (\n _manager: ConnectorAccountManager,\n ): Promise<ConnectorAccount[]> => {\n const ids = listTwitchAccountIds(runtime);\n if (ids.length === 0) {\n return [\n toConnectorAccount(\n resolveTwitchAccountSettings(runtime, DEFAULT_TWITCH_ACCOUNT_ID),\n ),\n ];\n }\n return ids.map((id) =>\n toConnectorAccount(resolveTwitchAccountSettings(runtime, id)),\n );\n },\n createAccount: async (\n input: ConnectorAccountPatch,\n _manager: ConnectorAccountManager,\n ) => {\n return {\n ...input,\n provider: TWITCH_PROVIDER_ID,\n role: input.role ?? \"OWNER\",\n purpose: input.purpose ?? [\"messaging\"],\n accessGate: input.accessGate ?? \"open\",\n status: input.status ?? \"pending\",\n };\n },\n patchAccount: async (\n _accountId: string,\n patch: ConnectorAccountPatch,\n _manager: ConnectorAccountManager,\n ) => {\n return { ...patch, provider: TWITCH_PROVIDER_ID };\n },\n deleteAccount: async (\n _accountId: string,\n _manager: ConnectorAccountManager,\n ) => {\n // No-op at provider layer — runtime credentials live in character\n // settings; deletion of those is out of band.\n },\n };\n}\n",
|
|
10
|
+
"import { type IAgentRuntime, Service } from \"@elizaos/core\";\n\n// Inlined to avoid adding @elizaos/plugin-workflow as a compile-time dependency.\n// The runtime duck-types the service — only the serviceType string and resolve() shape matter.\nconst WORKFLOW_CREDENTIAL_PROVIDER_TYPE = \"workflow_credential_provider\";\ntype CredentialProviderResult =\n | { status: \"credential_data\"; data: Record<string, unknown> }\n | { status: \"needs_auth\"; authUrl: string }\n | null;\n\n// Twitch's workflow node uses httpHeaderAuth with a Bearer token.\nconst SUPPORTED = [\"httpHeaderAuth\"];\n\nexport class TwitchWorkflowCredentialProvider extends Service {\n static override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;\n override capabilityDescription =\n \"Supplies Twitch credentials to the workflow plugin.\";\n\n static async start(\n runtime: IAgentRuntime,\n ): Promise<TwitchWorkflowCredentialProvider> {\n return new TwitchWorkflowCredentialProvider(runtime);\n }\n\n async stop(): Promise<void> {}\n\n async resolve(\n _userId: string,\n credType: string,\n ): Promise<CredentialProviderResult> {\n if (credType !== \"httpHeaderAuth\") return null;\n const accessToken = this.runtime.getSetting(\"TWITCH_ACCESS_TOKEN\") as\n | string\n | undefined;\n if (!accessToken?.trim()) return null;\n return {\n status: \"credential_data\",\n data: { name: \"Authorization\", value: `Bearer ${accessToken.trim()}` },\n };\n }\n\n checkCredentialTypes(credTypes: string[]): {\n supported: string[];\n unsupported: string[];\n } {\n return {\n supported: credTypes.filter((t) => SUPPORTED.includes(t)),\n unsupported: credTypes.filter((t) => !SUPPORTED.includes(t)),\n };\n }\n}\n"
|
|
14
11
|
],
|
|
15
|
-
"mappings": "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",
|
|
16
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "E272CF35229333E264756E2164756E21",
|
|
17
14
|
"names": []
|
|
18
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userContext.d.ts","sourceRoot":"","sources":["../../src/providers/userContext.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAGV,QAAQ,EAGT,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"userContext.d.ts","sourceRoot":"","sources":["../../src/providers/userContext.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAGV,QAAQ,EAGT,MAAM,eAAe,CAAC;AAavB;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAiHjC,CAAC"}
|
package/dist/service.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This service provides Twitch chat integration using the @twurple library.
|
|
5
5
|
*/
|
|
6
|
-
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
6
|
+
import { type Content, type IAgentRuntime, type MessageConnectorChannelOpParams, type MessageConnectorChatContext, type MessageConnectorQueryContext, type MessageConnectorTarget, Service, type TargetInfo } from "@elizaos/core";
|
|
7
7
|
import { type ITwitchService, type TwitchMessageSendOptions, type TwitchSendResult, type TwitchUserInfo } from "./types.js";
|
|
8
8
|
/**
|
|
9
9
|
* Twitch chat service for ElizaOS agents.
|
|
@@ -15,10 +15,12 @@ export declare class TwitchService extends Service implements ITwitchService {
|
|
|
15
15
|
private client;
|
|
16
16
|
private connected;
|
|
17
17
|
private joinedChannels;
|
|
18
|
+
private accountServices;
|
|
18
19
|
/**
|
|
19
20
|
* Start the Twitch service.
|
|
20
21
|
*/
|
|
21
22
|
static start(runtime: IAgentRuntime): Promise<TwitchService>;
|
|
23
|
+
static registerSendHandlers(runtime: IAgentRuntime, serviceInstance: TwitchService): void;
|
|
22
24
|
/**
|
|
23
25
|
* Stop the Twitch service.
|
|
24
26
|
*/
|
|
@@ -27,6 +29,7 @@ export declare class TwitchService extends Service implements ITwitchService {
|
|
|
27
29
|
* Initialize the Twitch service.
|
|
28
30
|
*/
|
|
29
31
|
private initialize;
|
|
32
|
+
private initializeAccount;
|
|
30
33
|
/**
|
|
31
34
|
* Load settings from runtime.
|
|
32
35
|
*/
|
|
@@ -59,10 +62,24 @@ export declare class TwitchService extends Service implements ITwitchService {
|
|
|
59
62
|
* Stop the service.
|
|
60
63
|
*/
|
|
61
64
|
stop(): Promise<void>;
|
|
65
|
+
private getAccountServiceList;
|
|
66
|
+
private getDefaultAccountService;
|
|
67
|
+
private getAccountService;
|
|
62
68
|
isConnected(): boolean;
|
|
63
69
|
getBotUsername(): string;
|
|
70
|
+
getAccountId(runtime?: IAgentRuntime): string;
|
|
64
71
|
getPrimaryChannel(): string;
|
|
65
72
|
getJoinedChannels(): string[];
|
|
73
|
+
handleSendMessage(runtime: IAgentRuntime, target: TargetInfo, content: Content): Promise<void>;
|
|
74
|
+
resolveConnectorTargets(query: string, _context: MessageConnectorQueryContext): Promise<MessageConnectorTarget[]>;
|
|
75
|
+
listConnectorRooms(_context: MessageConnectorQueryContext): Promise<MessageConnectorTarget[]>;
|
|
76
|
+
listRecentConnectorTargets(context: MessageConnectorQueryContext): Promise<MessageConnectorTarget[]>;
|
|
77
|
+
handleJoinChannel(_runtime: IAgentRuntime, params: MessageConnectorChannelOpParams): Promise<void>;
|
|
78
|
+
handleLeaveChannel(_runtime: IAgentRuntime, params: MessageConnectorChannelOpParams): Promise<void>;
|
|
79
|
+
getConnectorChatContext(target: TargetInfo, context: MessageConnectorQueryContext): Promise<MessageConnectorChatContext | null>;
|
|
80
|
+
private getConnectorChannels;
|
|
81
|
+
private resolveChannelOpTarget;
|
|
82
|
+
private buildChannelTarget;
|
|
66
83
|
isUserAllowed(user: TwitchUserInfo): boolean;
|
|
67
84
|
sendMessage(text: string, options?: TwitchMessageSendOptions): Promise<TwitchSendResult>;
|
|
68
85
|
joinChannel(channel: string): Promise<void>;
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/toon.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toon.d.ts","sourceRoot":"","sources":["../src/toon.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,CAuBV"}
|
package/dist/types.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export declare enum TwitchEventTypes {
|
|
|
19
19
|
export type TwitchRole = "moderator" | "owner" | "vip" | "subscriber" | "all";
|
|
20
20
|
/** Configuration settings for the Twitch plugin */
|
|
21
21
|
export interface TwitchSettings {
|
|
22
|
+
/** Connector account identifier for this Twitch bot instance */
|
|
23
|
+
accountId?: string;
|
|
22
24
|
/** Twitch username for the bot account */
|
|
23
25
|
username: string;
|
|
24
26
|
/** Twitch application client ID */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type IAgentRuntime, Service } from "@elizaos/core";
|
|
2
|
+
type CredentialProviderResult = {
|
|
3
|
+
status: "credential_data";
|
|
4
|
+
data: Record<string, unknown>;
|
|
5
|
+
} | {
|
|
6
|
+
status: "needs_auth";
|
|
7
|
+
authUrl: string;
|
|
8
|
+
} | null;
|
|
9
|
+
export declare class TwitchWorkflowCredentialProvider extends Service {
|
|
10
|
+
static readonly serviceType = "workflow_credential_provider";
|
|
11
|
+
capabilityDescription: string;
|
|
12
|
+
static start(runtime: IAgentRuntime): Promise<TwitchWorkflowCredentialProvider>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
resolve(_userId: string, credType: string): Promise<CredentialProviderResult>;
|
|
15
|
+
checkCredentialTypes(credTypes: string[]): {
|
|
16
|
+
supported: string[];
|
|
17
|
+
unsupported: string[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=workflow-credential-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-credential-provider.d.ts","sourceRoot":"","sources":["../src/workflow-credential-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAK5D,KAAK,wBAAwB,GACzB;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC,IAAI,CAAC;AAKT,qBAAa,gCAAiC,SAAQ,OAAO;IAC3D,gBAAyB,WAAW,kCAAqC;IAChE,qBAAqB,SAC0B;WAE3C,KAAK,CAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,gCAAgC,CAAC;IAItC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAErB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,CAAC;IAYpC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG;QACzC,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;CAMF"}
|