@elizaos/plugin-roblox 2.0.0-alpha.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.
Files changed (37) hide show
  1. package/dist/__tests__/suite.d.ts +7 -0
  2. package/dist/__tests__/suite.d.ts.map +1 -0
  3. package/dist/actions/executeGameAction.d.ts +4 -0
  4. package/dist/actions/executeGameAction.d.ts.map +1 -0
  5. package/dist/actions/getPlayerInfo.d.ts +4 -0
  6. package/dist/actions/getPlayerInfo.d.ts.map +1 -0
  7. package/dist/actions/index.d.ts +7 -0
  8. package/dist/actions/index.d.ts.map +1 -0
  9. package/dist/actions/sendGameMessage.d.ts +4 -0
  10. package/dist/actions/sendGameMessage.d.ts.map +1 -0
  11. package/dist/client/RobloxClient.d.ts +29 -0
  12. package/dist/client/RobloxClient.d.ts.map +1 -0
  13. package/dist/client/index.d.ts +2 -0
  14. package/dist/client/index.d.ts.map +1 -0
  15. package/dist/generated/specs/specs.d.ts +63 -0
  16. package/dist/generated/specs/specs.d.ts.map +1 -0
  17. package/dist/index.browser.d.ts +4 -0
  18. package/dist/index.browser.d.ts.map +1 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +1070 -0
  22. package/dist/index.js.map +21 -0
  23. package/dist/providers/gameStateProvider.d.ts +3 -0
  24. package/dist/providers/gameStateProvider.d.ts.map +1 -0
  25. package/dist/providers/index.d.ts +5 -0
  26. package/dist/providers/index.d.ts.map +1 -0
  27. package/dist/services/RobloxService.d.ts +44 -0
  28. package/dist/services/RobloxService.d.ts.map +1 -0
  29. package/dist/services/index.d.ts +2 -0
  30. package/dist/services/index.d.ts.map +1 -0
  31. package/dist/types/index.d.ts +125 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/utils/config.d.ts +12 -0
  34. package/dist/utils/config.d.ts.map +1 -0
  35. package/dist/utils/index.d.ts +2 -0
  36. package/dist/utils/index.d.ts.map +1 -0
  37. package/package.json +100 -0
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../types/index.ts", "../__tests__/suite.ts", "../actions/executeGameAction.ts", "../actions/getPlayerInfo.ts", "../actions/sendGameMessage.ts", "../actions/index.ts", "../providers/gameStateProvider.ts", "../providers/index.ts", "../services/RobloxService.ts", "../client/RobloxClient.ts", "../utils/config.ts", "../index.ts"],
4
+ "sourcesContent": [
5
+ "import type { UUID } from \"@elizaos/core\";\n\nexport const ROBLOX_SERVICE_NAME = \"roblox\";\nexport const ROBLOX_SOURCE = \"roblox\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\nexport type JsonValueOrUndefined = JsonValue | undefined;\n\nexport interface RobloxConfig {\n apiKey: string;\n universeId: string;\n placeId?: string;\n webhookSecret?: string;\n messagingTopic: string;\n pollInterval: number;\n dryRun: boolean;\n}\n\nexport interface RobloxUser {\n id: number;\n username: string;\n displayName: string;\n avatarUrl?: string;\n createdAt?: Date;\n isBanned?: boolean;\n}\n\nexport interface RobloxPlayerSession {\n user: RobloxUser;\n jobId: string;\n placeId: string;\n joinedAt: Date;\n}\n\nexport interface RobloxGameMessage {\n id: string;\n user: RobloxUser;\n content: string;\n jobId: string;\n placeId: string;\n timestamp: Date;\n context?: Record<string, string>;\n}\n\nexport interface RobloxResponse {\n content: string;\n action?: RobloxGameAction;\n flagged?: boolean;\n}\n\nexport interface RobloxGameAction {\n name: string;\n parameters: Record<string, string | number | boolean | null>;\n targetPlayerIds?: number[];\n}\n\nexport interface DataStoreEntry<T = JsonValue> {\n key: string;\n value: T;\n version: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type MessagingServiceDataValue = JsonValueOrUndefined;\n\nexport interface MessagingServiceMessage {\n topic: string;\n data: Record<string, MessagingServiceDataValue>;\n sender?: {\n agentId: UUID;\n agentName: string;\n };\n}\n\nexport enum RobloxEventType {\n PLAYER_JOINED = \"roblox:player_joined\",\n PLAYER_LEFT = \"roblox:player_left\",\n PLAYER_MESSAGE = \"roblox:player_message\",\n GAME_EVENT = \"roblox:game_event\",\n WEBHOOK_RECEIVED = \"roblox:webhook_received\",\n}\n\nexport interface RobloxEventTypes {\n [RobloxEventType.PLAYER_JOINED]: {\n session: RobloxPlayerSession;\n };\n [RobloxEventType.PLAYER_LEFT]: {\n session: RobloxPlayerSession;\n duration: number;\n };\n [RobloxEventType.PLAYER_MESSAGE]: {\n message: RobloxGameMessage;\n };\n [RobloxEventType.GAME_EVENT]: {\n eventName: string;\n data: Record<string, string | number | boolean | null>;\n triggeredBy?: RobloxUser;\n };\n [RobloxEventType.WEBHOOK_RECEIVED]: {\n type: string;\n payload: Record<string, string | number | boolean | null>;\n };\n}\n\nexport interface RobloxServerInfo {\n jobId: string;\n placeId: string;\n playerCount: number;\n maxPlayers: number;\n region?: string;\n uptime?: number;\n}\n\nexport interface RobloxExperienceInfo {\n universeId: string;\n name: string;\n description?: string;\n creator: {\n id: number;\n type: \"User\" | \"Group\";\n name: string;\n };\n playing?: number;\n visits?: number;\n rootPlaceId: string;\n}\n\nexport type ManagerHealthStatus =\n | {\n status: \"healthy\";\n universeId: string;\n experienceName: string;\n playing?: number;\n }\n | {\n status: \"unhealthy\";\n error: string;\n };\n",
6
+ "import type { IAgentRuntime, TestCase, TestSuite } from \"@elizaos/core\";\nimport type { RobloxService } from \"../services/RobloxService\";\nimport { ROBLOX_SERVICE_NAME } from \"../types\";\n\nexport class RobloxTestSuite implements TestSuite {\n name = \"roblox\";\n description = \"Test suite for Roblox plugin\";\n\n tests: TestCase[] = [\n {\n name: \"Service initialization\",\n fn: async (runtime: IAgentRuntime) => {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\");\n\n if (apiKey && universeId) {\n if (!service) {\n throw new Error(\n \"Roblox service should be initialized when API key and Universe ID are provided\"\n );\n }\n } else {\n runtime.logger.info(\"Roblox service not initialized - missing configuration (expected)\");\n }\n },\n },\n {\n name: \"Configuration validation\",\n fn: async (runtime: IAgentRuntime) => {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\");\n\n if (apiKey && universeId) {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n if (!service) {\n throw new Error(\"Service should exist when properly configured\");\n }\n\n const client = service.getClient(runtime.agentId);\n if (!client) {\n throw new Error(\"Client should exist for agent\");\n }\n\n const config = client.getConfig();\n if (config.universeId !== universeId) {\n throw new Error(\"Universe ID mismatch in config\");\n }\n }\n },\n },\n {\n name: \"Actions registered\",\n fn: async (runtime: IAgentRuntime) => {\n runtime.logger.info(\"Roblox actions registration check passed\");\n },\n },\n ];\n}\n",
7
+ "import {\n type Action,\n type ActionExample,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { RobloxService } from \"../services/RobloxService\";\nimport { ROBLOX_SERVICE_NAME } from \"../types\";\n\nconst actionName = \"EXECUTE_ROBLOX_ACTION\";\n\nconst executeGameActionExamples: ActionExample[][] = [\n [\n {\n name: actionName,\n content: {\n text: \"Start a fireworks show in the game\",\n },\n },\n {\n name: actionName,\n content: {\n text: \"I'll trigger the fireworks show for everyone in the game!\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Give player456 100 coins as a reward\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll give player456 100 coins right away!\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Teleport everyone to the lobby\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Teleporting all players to the lobby now!\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n },\n },\n ],\n];\n\ninterface GameActionConfig {\n name: string;\n patterns: RegExp[];\n extractParams: (match: RegExpMatchArray) => Record<string, string | number>;\n}\n\nconst KNOWN_ACTIONS: GameActionConfig[] = [\n {\n name: \"move_npc\",\n patterns: [\n /(?:move|walk)\\s+(?:the\\s+)?(?:npc|bot|agent)?\\s*(?:to|towards)\\s+(?:the\\s+)?(\\w+)/i,\n /(?:move|walk)\\s+to\\s+\\(?(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\)?/i,\n ],\n extractParams: (match): Record<string, string | number> => {\n if (match.length >= 4 && match[1] && match[2] && match[3]) {\n return {\n x: Number.parseFloat(match[1]),\n y: Number.parseFloat(match[2]),\n z: Number.parseFloat(match[3]),\n };\n }\n return { waypoint: match[1] || \"\" };\n },\n },\n {\n name: \"give_coins\",\n patterns: [/give\\s+(?:player\\s*)?(\\d+)\\s+(\\d+)\\s+coins?/i],\n extractParams: (match) => ({\n playerId: parseInt(match[1], 10),\n amount: parseInt(match[2], 10),\n }),\n },\n {\n name: \"teleport\",\n patterns: [/teleport\\s+(?:everyone|all)\\s+to\\s+(?:the\\s+)?(\\w+)/i],\n extractParams: (match) => ({\n destination: match[1],\n }),\n },\n {\n name: \"spawn_entity\",\n patterns: [/spawn\\s+(?:a\\s+)?(\\w+)\\s+at\\s+(\\w+)/i],\n extractParams: (match) => ({\n entityType: match[1],\n location: match[2],\n }),\n },\n {\n name: \"start_event\",\n patterns: [/start\\s+(?:a\\s+)?(\\w+)\\s+(?:show|event|celebration)/i],\n extractParams: (match) => ({\n eventType: match[1],\n }),\n },\n];\n\nfunction parseGameAction(\n message: string\n): { actionName: string; parameters: Record<string, string | number> } | null {\n for (const action of KNOWN_ACTIONS) {\n for (const pattern of action.patterns) {\n const match = message.match(pattern);\n if (match) {\n return {\n actionName: action.name,\n parameters: action.extractParams(match),\n };\n }\n }\n }\n\n const genericMatch = message.match(/(?:execute|run|do)\\s+(\\w+)/i);\n if (genericMatch) {\n return {\n actionName: genericMatch[1].toLowerCase(),\n parameters: {},\n };\n }\n\n return null;\n}\n\nconst executeGameAction: Action = {\n name: actionName,\n similes: [],\n description: \"Execute an action in the connected Roblox game.\",\n examples: executeGameActionExamples,\n\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\");\n return Boolean(apiKey && universeId);\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n try {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n if (!service) {\n logger.error(\"Roblox service not found\");\n if (callback) {\n callback({\n text: \"Roblox service not available.\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n });\n }\n return {\n success: false,\n error: \"Roblox service not found\",\n };\n }\n\n const messageContent =\n (state?.message as string) || (message.content as { text?: string }).text || \"\";\n\n const parsedAction = parseGameAction(messageContent);\n\n if (!parsedAction) {\n logger.warn(\"Could not parse game action from message\");\n if (callback) {\n callback({\n text: \"Could not parse action from message.\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n });\n }\n return {\n success: false,\n error: \"Could not parse game action from message\",\n };\n }\n\n const { actionName, parameters } = parsedAction;\n\n const playerIdMatch = messageContent.match(/player\\s*(\\d+)/i);\n const targetPlayerIds = playerIdMatch ? [parseInt(playerIdMatch[1], 10)] : undefined;\n\n await service.executeAction(runtime.agentId, actionName, parameters, targetPlayerIds);\n\n logger.info({ actionName, parameters, targetPlayerIds }, \"Executed Roblox game action\");\n\n if (callback) {\n callback({\n text: `I've triggered the \"${actionName}\" action in the game.`,\n action: \"EXECUTE_ROBLOX_ACTION\",\n });\n }\n\n return {\n success: true,\n text: `Executed \"${actionName}\" action in the game`,\n data: {\n actionName,\n parameters: parameters as Record<string, string | number | boolean | null | undefined>,\n targetPlayerIds: targetPlayerIds || undefined,\n },\n };\n } catch (error) {\n logger.error({ error }, \"Failed to execute Roblox action\");\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n if (callback) {\n callback({\n text: \"Error executing action.\",\n action: \"EXECUTE_ROBLOX_ACTION\",\n });\n }\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n};\n\nexport default executeGameAction;\n",
8
+ "import {\n type Action,\n type ActionExample,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { RobloxService } from \"../services/RobloxService\";\nimport { ROBLOX_SERVICE_NAME, type RobloxUser } from \"../types\";\n\nconst actionName = \"GET_ROBLOX_PLAYER\";\n\nconst getPlayerInfoExamples: ActionExample[][] = [\n [\n {\n name: actionName,\n content: {\n text: \"Who is player 12345678?\",\n },\n },\n {\n name: actionName,\n content: {\n text: \"Let me look up that player's information for you.\",\n action: \"GET_ROBLOX_PLAYER\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Look up the Roblox user JohnDoe123\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll find the information for JohnDoe123.\",\n action: \"GET_ROBLOX_PLAYER\",\n },\n },\n ],\n];\n\nfunction extractUserIdentifier(\n message: string\n): { type: \"id\"; value: number } | { type: \"username\"; value: string } | null {\n const idMatch = message.match(/\\b(?:player|user|id)\\s*[:#]?\\s*(\\d{5,})\\b/i);\n if (idMatch) {\n return { type: \"id\", value: parseInt(idMatch[1], 10) };\n }\n\n const usernameMatch = message.match(\n /\\b(?:user(?:name)?|player)\\s*[:#]?\\s*([A-Za-z0-9_]{3,20})\\b/i\n );\n if (usernameMatch) {\n const username = usernameMatch[1];\n if (!/^\\d+$/.test(username)) {\n return { type: \"username\", value: username };\n }\n }\n\n return null;\n}\n\nconst getPlayerInfo: Action = {\n name: actionName,\n similes: [],\n description: \"Fetch Roblox player information by username or user id.\",\n examples: getPlayerInfoExamples,\n\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n return Boolean(apiKey);\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n try {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n if (!service) {\n logger.error(\"Roblox service not found\");\n if (callback) {\n callback({\n text: \"I couldn't connect to the Roblox service.\",\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n return {\n success: false,\n error: \"Roblox service not found\",\n };\n }\n\n const client = service.getClient(runtime.agentId);\n if (!client) {\n logger.error(\"Roblox client not found for agent\");\n if (callback) {\n callback({\n text: \"The Roblox client isn't available right now.\",\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n return {\n success: false,\n error: \"Roblox client not found for agent\",\n };\n }\n\n const messageContent =\n (state?.message as string) || (message.content as { text?: string }).text || \"\";\n\n const identifier = extractUserIdentifier(messageContent);\n\n if (!identifier) {\n logger.warn(\"Could not extract user identifier from message\");\n if (callback) {\n callback({\n text: \"I need a player ID or username to look up. Please provide one.\",\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n return {\n success: false,\n error: \"Could not extract user identifier from message\",\n };\n }\n\n let user: RobloxUser | null;\n if (identifier.type === \"id\") {\n user = await client.getUserById(identifier.value);\n } else {\n user = await client.getUserByUsername(identifier.value);\n }\n\n if (!user) {\n if (callback) {\n callback({\n text: `I couldn't find a Roblox user with that ${identifier.type === \"id\" ? \"ID\" : \"username\"}.`,\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n return {\n success: true,\n text: `User not found with ${identifier.type === \"id\" ? \"ID\" : \"username\"}: ${identifier.value}`,\n };\n }\n\n const avatarUrl = await client.getAvatarUrl(user.id);\n user.avatarUrl = avatarUrl;\n\n logger.info({ userId: user.id, username: user.username }, \"Found Roblox user\");\n\n if (callback) {\n const createdDate = user.createdAt ? user.createdAt.toLocaleDateString() : \"Unknown\";\n const bannedStatus = user.isBanned ? \" (Banned)\" : \"\";\n\n callback({\n text: `**${user.displayName}** (@${user.username})${bannedStatus}\n- User ID: ${user.id}\n- Account created: ${createdDate}`,\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n\n return {\n success: true,\n text: `Found Roblox user: ${user.displayName} (@${user.username})`,\n data: {\n userId: user.id,\n username: user.username,\n displayName: user.displayName,\n avatarUrl: avatarUrl || undefined,\n isBanned: user.isBanned,\n createdAt: user.createdAt ? user.createdAt.toISOString() : undefined,\n },\n };\n } catch (error) {\n logger.error({ error }, \"Failed to get Roblox player info\");\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n if (callback) {\n callback({\n text: \"I encountered an error looking up that player. Please try again.\",\n action: \"GET_ROBLOX_PLAYER\",\n });\n }\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n};\n\nexport default getPlayerInfo;\n",
9
+ "import {\n type Action,\n type ActionExample,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { RobloxService } from \"../services/RobloxService\";\nimport { ROBLOX_SERVICE_NAME } from \"../types\";\n\nconst actionName = \"SEND_ROBLOX_MESSAGE\";\n\nconst sendGameMessageExamples: ActionExample[][] = [\n [\n {\n name: actionName,\n content: {\n text: \"Tell everyone in the game that there's a special event happening\",\n },\n },\n {\n name: actionName,\n content: {\n text: \"I'll announce the special event to all players in the game!\",\n action: \"SEND_ROBLOX_MESSAGE\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Send a message to player123 welcoming them to the game\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send a personalized welcome message to player123.\",\n action: \"SEND_ROBLOX_MESSAGE\",\n },\n },\n ],\n];\n\nconst sendGameMessage: Action = {\n name: actionName,\n similes: [],\n description: \"Send a message to players in the Roblox game.\",\n examples: sendGameMessageExamples,\n\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\");\n return Boolean(apiKey && universeId);\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n try {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n if (!service) {\n logger.error(\"Roblox service not found\");\n if (callback) {\n callback({\n text: \"Roblox service not available.\",\n action: \"SEND_ROBLOX_MESSAGE\",\n });\n }\n return {\n success: false,\n error: \"Roblox service not found\",\n };\n }\n\n const messageContent =\n (state?.message as string) || (message.content as { text?: string }).text || \"\";\n\n if (!messageContent) {\n logger.warn(\"No message content to send\");\n if (callback) {\n callback({\n text: \"I need a message to send to the game.\",\n action: \"SEND_ROBLOX_MESSAGE\",\n });\n }\n return {\n success: false,\n error: \"No message content to send\",\n };\n }\n\n const targetPlayerIds = extractPlayerIds(messageContent);\n\n await service.sendMessage(runtime.agentId, messageContent, targetPlayerIds);\n\n logger.info(\n { targetPlayerIds, messageLength: messageContent.length },\n \"Sent message to Roblox game\"\n );\n\n if (callback) {\n const targetInfo =\n targetPlayerIds && targetPlayerIds.length > 0\n ? `to ${targetPlayerIds.length} specific player(s)`\n : \"to all players\";\n callback({\n text: `I've sent the message ${targetInfo} in the game.`,\n action: \"SEND_ROBLOX_MESSAGE\",\n });\n }\n\n return {\n success: true,\n text: `Sent message ${targetPlayerIds && targetPlayerIds.length > 0 ? `to ${targetPlayerIds.length} specific player(s)` : \"to all players\"} in the game`,\n data: {\n targetPlayerIds,\n messageLength: messageContent.length,\n },\n };\n } catch (error) {\n logger.error({ error }, \"Failed to send Roblox message\");\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n if (callback) {\n callback({\n text: \"Error sending message.\",\n action: \"SEND_ROBLOX_MESSAGE\",\n });\n }\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n};\n\nfunction extractPlayerIds(message: string): number[] | undefined {\n const playerIdPattern = /\\bplayer\\s*(\\d+)\\b/gi;\n const matches = [...message.matchAll(playerIdPattern)];\n\n if (matches.length > 0) {\n return matches.map((m) => parseInt(m[1], 10));\n }\n\n return undefined;\n}\n\nexport default sendGameMessage;\n",
10
+ "import type { Action } from \"@elizaos/core\";\nimport executeGameAction from \"./executeGameAction\";\nimport getPlayerInfo from \"./getPlayerInfo\";\nimport sendGameMessage from \"./sendGameMessage\";\n\nexport const robloxActions: Action[] = [sendGameMessage, executeGameAction, getPlayerInfo];\n\nexport { sendGameMessage, executeGameAction, getPlayerInfo };\n",
11
+ "import type { IAgentRuntime, Memory, Provider, ProviderResult, State } from \"@elizaos/core\";\nimport type { RobloxService } from \"../services/RobloxService\";\nimport { ROBLOX_SERVICE_NAME, type RobloxExperienceInfo } from \"../types\";\n\nconst providerName = \"roblox-game-state\";\n\nexport const gameStateProvider: Provider = {\n name: providerName,\n description: \"Provides information about the connected Roblox game/experience\",\n\n get: async (\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State\n ): Promise<ProviderResult> => {\n try {\n const service = runtime.getService<RobloxService>(ROBLOX_SERVICE_NAME);\n if (!service) {\n return { text: \"\", data: {}, values: {} };\n }\n\n const client = service.getClient(runtime.agentId);\n if (!client) {\n return { text: \"\", data: {}, values: {} };\n }\n\n const config = client.getConfig();\n\n let experienceInfo: RobloxExperienceInfo | null = null;\n try {\n experienceInfo = await client.getExperienceInfo();\n } catch {\n experienceInfo = null;\n }\n\n const parts: string[] = [\n \"## Roblox Game Connection\",\n \"\",\n `- **Universe ID**: ${config.universeId}`,\n ];\n\n if (config.placeId) {\n parts.push(`- **Place ID**: ${config.placeId}`);\n }\n\n if (experienceInfo) {\n parts.push(`- **Experience Name**: ${experienceInfo.name}`);\n if (experienceInfo.playing !== undefined) {\n parts.push(`- **Active Players**: ${experienceInfo.playing}`);\n }\n if (experienceInfo.visits !== undefined) {\n parts.push(`- **Total Visits**: ${experienceInfo.visits.toLocaleString()}`);\n }\n parts.push(\n `- **Creator**: ${experienceInfo.creator.name} (${experienceInfo.creator.type})`\n );\n }\n\n parts.push(`- **Messaging Topic**: ${config.messagingTopic}`);\n\n if (config.dryRun) {\n parts.push(\"\");\n parts.push(\"*Dry run mode is enabled - actions are simulated*\");\n }\n\n return { text: parts.join(\"\\n\"), data: {}, values: {} };\n } catch (error) {\n runtime.logger.error({ error }, \"Error in gameStateProvider\");\n return { text: \"\", data: {}, values: {} };\n }\n },\n};\n",
12
+ "import type { Provider } from \"@elizaos/core\";\nimport { gameStateProvider } from \"./gameStateProvider\";\n\nexport const robloxProviders: Provider[] = [gameStateProvider];\n\nexport { gameStateProvider };\n",
13
+ "import { type IAgentRuntime, Service, type UUID } from \"@elizaos/core\";\nimport { RobloxClient } from \"../client/RobloxClient\";\nimport { type ManagerHealthStatus, ROBLOX_SERVICE_NAME, type RobloxConfig } from \"../types\";\nimport { hasRobloxEnabled, validateRobloxConfig } from \"../utils/config\";\n\nclass RobloxAgentManager {\n public runtime: IAgentRuntime;\n public client: RobloxClient;\n public config: RobloxConfig;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private isRunning = false;\n\n constructor(runtime: IAgentRuntime, config: RobloxConfig) {\n this.runtime = runtime;\n this.config = config;\n this.client = new RobloxClient(config);\n }\n\n async start(): Promise<void> {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.runtime.logger.info(\n { universeId: this.config.universeId },\n \"Roblox agent manager started\"\n );\n\n if (this.config.pollInterval > 0) {\n this.startPolling();\n }\n }\n\n async stop(): Promise<void> {\n this.isRunning = false;\n this.stopPolling();\n this.runtime.logger.info(\"Roblox agent manager stopped\");\n }\n\n private startPolling(): void {\n if (this.pollTimer) {\n return;\n }\n\n const pollIntervalMs = this.config.pollInterval * 1000;\n this.pollTimer = setInterval(() => {\n this.poll().catch((error) => {\n this.runtime.logger.error({ error }, \"Error during Roblox polling\");\n });\n }, pollIntervalMs);\n\n this.runtime.logger.debug(\n { intervalSeconds: this.config.pollInterval },\n \"Roblox polling started\"\n );\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n this.runtime.logger.debug(\"Roblox polling stopped\");\n }\n }\n\n private async poll(): Promise<void> {}\n\n async sendMessage(content: string, targetPlayerIds?: number[]): Promise<void> {\n await this.client.sendAgentMessage({\n topic: this.config.messagingTopic,\n data: {\n type: \"agent_message\",\n content,\n targetPlayerIds,\n timestamp: Date.now(),\n },\n sender: {\n agentId: this.runtime.agentId,\n agentName: this.runtime.character.name,\n },\n });\n }\n\n async executeAction(\n actionName: string,\n parameters: Record<string, string | number | boolean | null>,\n targetPlayerIds?: number[]\n ): Promise<void> {\n await this.client.sendAgentMessage({\n topic: this.config.messagingTopic,\n data: {\n type: \"agent_action\",\n action: actionName,\n parameters,\n targetPlayerIds,\n timestamp: Date.now(),\n },\n sender: {\n agentId: this.runtime.agentId,\n agentName: this.runtime.character.name,\n },\n });\n }\n}\n\nexport class RobloxService extends Service {\n private static instance?: RobloxService;\n private managers = new Map<UUID, RobloxAgentManager>();\n\n static serviceType = ROBLOX_SERVICE_NAME;\n\n readonly description = \"Roblox integration service for game communication\";\n readonly capabilityDescription = \"The agent can communicate with Roblox games and players\";\n\n private static getInstance(): RobloxService {\n if (!RobloxService.instance) {\n RobloxService.instance = new RobloxService();\n }\n return RobloxService.instance;\n }\n\n async initialize(runtime: IAgentRuntime): Promise<void> {\n await RobloxService.start(runtime);\n }\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = RobloxService.getInstance();\n let manager = service.managers.get(runtime.agentId);\n\n if (manager) {\n runtime.logger.warn({ agentId: runtime.agentId }, \"Roblox service already started\");\n return service;\n }\n\n if (!hasRobloxEnabled(runtime)) {\n runtime.logger.debug(\n { agentId: runtime.agentId },\n \"Roblox service not enabled - missing API key or Universe ID\"\n );\n return service;\n }\n\n const robloxConfig = validateRobloxConfig(runtime);\n manager = new RobloxAgentManager(runtime, robloxConfig);\n service.managers.set(runtime.agentId, manager);\n\n await manager.start();\n\n runtime.logger.success(\n { agentId: runtime.agentId, universeId: robloxConfig.universeId },\n \"Roblox service started\"\n );\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = RobloxService.getInstance();\n const manager = service.managers.get(runtime.agentId);\n\n if (manager) {\n await manager.stop();\n service.managers.delete(runtime.agentId);\n runtime.logger.info({ agentId: runtime.agentId }, \"Roblox service stopped\");\n } else {\n runtime.logger.debug({ agentId: runtime.agentId }, \"Roblox service not running\");\n }\n }\n\n async stop(): Promise<void> {\n for (const manager of Array.from(this.managers.values())) {\n const agentId = manager.runtime.agentId;\n manager.runtime.logger.debug(\"Stopping Roblox service\");\n try {\n await RobloxService.stop(manager.runtime);\n } catch (error) {\n manager.runtime.logger.error({ agentId, error }, \"Error stopping Roblox service\");\n }\n }\n }\n\n getManager(agentId: UUID): RobloxAgentManager | undefined {\n return this.managers.get(agentId);\n }\n\n getClient(agentId: UUID): RobloxClient | undefined {\n return this.managers.get(agentId)?.client;\n }\n\n async sendMessage(agentId: UUID, content: string, targetPlayerIds?: number[]): Promise<void> {\n const manager = this.managers.get(agentId);\n if (!manager) {\n throw new Error(`No Roblox manager found for agent ${agentId}`);\n }\n await manager.sendMessage(content, targetPlayerIds);\n }\n\n async executeAction(\n agentId: UUID,\n actionName: string,\n parameters: Record<string, string | number | boolean | null>,\n targetPlayerIds?: number[]\n ): Promise<void> {\n const manager = this.managers.get(agentId);\n if (!manager) {\n throw new Error(`No Roblox manager found for agent ${agentId}`);\n }\n await manager.executeAction(actionName, parameters, targetPlayerIds);\n }\n\n async healthCheck(): Promise<{\n healthy: boolean;\n details: {\n activeManagers: number;\n managerStatuses: Record<string, ManagerHealthStatus>;\n };\n }> {\n const managerStatuses: Record<string, ManagerHealthStatus> = {};\n let overallHealthy = true;\n\n for (const [agentId, manager] of Array.from(this.managers.entries())) {\n try {\n const experienceInfo = await manager.client.getExperienceInfo();\n managerStatuses[agentId] = {\n status: \"healthy\",\n universeId: manager.config.universeId,\n experienceName: experienceInfo.name,\n playing: experienceInfo.playing,\n };\n } catch (error) {\n managerStatuses[agentId] = {\n status: \"unhealthy\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n overallHealthy = false;\n }\n }\n\n return {\n healthy: overallHealthy,\n details: {\n activeManagers: this.managers.size,\n managerStatuses,\n },\n };\n }\n\n getActiveManagers(): Map<UUID, RobloxAgentManager> {\n return new Map(this.managers);\n }\n}\n",
14
+ "import type {\n DataStoreEntry,\n JsonValue,\n JsonValueOrUndefined,\n MessagingServiceMessage,\n RobloxConfig,\n RobloxExperienceInfo,\n RobloxUser,\n} from \"../types\";\n\nconst ROBLOX_API_BASE = \"https://apis.roblox.com\";\nconst USERS_API_BASE = \"https://users.roblox.com\";\n\nexport class RobloxApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public endpoint: string,\n public details?: JsonValue | string\n ) {\n super(message);\n this.name = \"RobloxApiError\";\n }\n}\n\nexport class RobloxClient {\n private config: RobloxConfig;\n\n constructor(config: RobloxConfig) {\n this.config = config;\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n baseUrl: string = ROBLOX_API_BASE\n ): Promise<T> {\n const url = `${baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n \"x-api-key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n ...((options.headers as Record<string, string>) || {}),\n };\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let details: JsonValue | string;\n try {\n details = (await response.json()) as JsonValue;\n } catch {\n details = await response.text();\n }\n throw new RobloxApiError(\n `Roblox API error: ${response.statusText}`,\n response.status,\n endpoint,\n details\n );\n }\n\n const text = await response.text();\n if (!text) {\n return {} as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n async publishMessage(\n topic: string,\n data: Record<string, JsonValueOrUndefined>,\n universeId?: string\n ): Promise<void> {\n if (this.config.dryRun) {\n return;\n }\n\n const targetUniverseId = universeId || this.config.universeId;\n\n await this.request(\n `/messaging-service/v1/universes/${targetUniverseId}/topics/${encodeURIComponent(topic)}`,\n {\n method: \"POST\",\n body: JSON.stringify({ message: JSON.stringify(data) }),\n }\n );\n }\n\n async sendAgentMessage(message: MessagingServiceMessage): Promise<void> {\n const payload: Record<string, JsonValueOrUndefined> = {\n ...message.data,\n };\n if (message.sender) {\n payload.sender = message.sender;\n }\n await this.publishMessage(message.topic, payload);\n }\n\n async getDataStoreEntry<T extends JsonValue = JsonValue>(\n datastoreName: string,\n key: string,\n scope: string = \"global\"\n ): Promise<DataStoreEntry<T> | null> {\n try {\n const response = await this.request<{\n value: string;\n version: string;\n createdTime: string;\n updatedTime: string;\n }>(\n `/datastores/v1/universes/${this.config.universeId}/standard-datastores/datastore/entries/entry?datastoreName=${encodeURIComponent(datastoreName)}&scope=${encodeURIComponent(scope)}&entryKey=${encodeURIComponent(key)}`\n );\n\n return {\n key,\n value: JSON.parse(response.value) as T,\n version: response.version,\n createdAt: new Date(response.createdTime),\n updatedAt: new Date(response.updatedTime),\n };\n } catch (error) {\n if (error instanceof RobloxApiError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async setDataStoreEntry<T extends JsonValue = JsonValue>(\n datastoreName: string,\n key: string,\n value: T,\n scope: string = \"global\"\n ): Promise<DataStoreEntry<T>> {\n if (this.config.dryRun) {\n console.log(`[DRY RUN] Would set DataStore entry \"${key}\":`, value);\n return {\n key,\n value,\n version: \"dry-run\",\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n }\n\n const response = await this.request<{\n version: string;\n createdTime: string;\n updatedTime: string;\n }>(\n `/datastores/v1/universes/${this.config.universeId}/standard-datastores/datastore/entries/entry?datastoreName=${encodeURIComponent(datastoreName)}&scope=${encodeURIComponent(scope)}&entryKey=${encodeURIComponent(key)}`,\n {\n method: \"POST\",\n body: JSON.stringify(value),\n }\n );\n\n return {\n key,\n value,\n version: response.version,\n createdAt: new Date(response.createdTime),\n updatedAt: new Date(response.updatedTime),\n };\n }\n\n async deleteDataStoreEntry(\n datastoreName: string,\n key: string,\n scope: string = \"global\"\n ): Promise<void> {\n if (this.config.dryRun) {\n console.log(`[DRY RUN] Would delete DataStore entry \"${key}\"`);\n return;\n }\n\n await this.request(\n `/datastores/v1/universes/${this.config.universeId}/standard-datastores/datastore/entries/entry?datastoreName=${encodeURIComponent(datastoreName)}&scope=${encodeURIComponent(scope)}&entryKey=${encodeURIComponent(key)}`,\n { method: \"DELETE\" }\n );\n }\n\n async listDataStoreEntries(\n datastoreName: string,\n scope: string = \"global\",\n prefix?: string,\n limit: number = 100\n ): Promise<{ keys: string[]; nextPageCursor?: string }> {\n let url = `/datastores/v1/universes/${this.config.universeId}/standard-datastores/datastore/entries?datastoreName=${encodeURIComponent(datastoreName)}&scope=${encodeURIComponent(scope)}&limit=${limit}`;\n\n if (prefix) {\n url += `&prefix=${encodeURIComponent(prefix)}`;\n }\n\n const response = await this.request<{\n keys: Array<{ key: string }>;\n nextPageCursor?: string;\n }>(url);\n\n return {\n keys: response.keys.map((k) => k.key),\n nextPageCursor: response.nextPageCursor,\n };\n }\n\n async getUserById(userId: number): Promise<RobloxUser> {\n const response = await this.request<{\n id: number;\n name: string;\n displayName: string;\n created: string;\n isBanned: boolean;\n }>(`/v1/users/${userId}`, {}, USERS_API_BASE);\n\n return {\n id: response.id,\n username: response.name,\n displayName: response.displayName,\n createdAt: new Date(response.created),\n isBanned: response.isBanned,\n };\n }\n\n async getUserByUsername(username: string): Promise<RobloxUser | null> {\n try {\n const response = await this.request<{\n data: Array<{\n id: number;\n name: string;\n displayName: string;\n }>;\n }>(\n `/v1/usernames/users`,\n {\n method: \"POST\",\n body: JSON.stringify({\n usernames: [username],\n excludeBannedUsers: false,\n }),\n },\n USERS_API_BASE\n );\n\n if (response.data.length === 0) {\n return null;\n }\n\n const user = response.data[0];\n return {\n id: user.id,\n username: user.name,\n displayName: user.displayName,\n };\n } catch {\n return null;\n }\n }\n\n async getUsersByIds(userIds: number[]): Promise<RobloxUser[]> {\n if (userIds.length === 0) {\n return [];\n }\n\n const response = await this.request<{\n data: Array<{\n id: number;\n name: string;\n displayName: string;\n }>;\n }>(\n `/v1/users`,\n {\n method: \"POST\",\n body: JSON.stringify({ userIds, excludeBannedUsers: false }),\n },\n USERS_API_BASE\n );\n\n return response.data.map((user) => ({\n id: user.id,\n username: user.name,\n displayName: user.displayName,\n }));\n }\n\n async getAvatarUrl(userId: number, size: string = \"150x150\"): Promise<string | undefined> {\n try {\n const response = await this.request<{\n data: Array<{ imageUrl: string }>;\n }>(\n `/v1/users/avatar-headshot?userIds=${userId}&size=${size}&format=Png`,\n {},\n \"https://thumbnails.roblox.com\"\n );\n\n return response.data[0]?.imageUrl;\n } catch {\n return undefined;\n }\n }\n\n async getExperienceInfo(universeId?: string): Promise<RobloxExperienceInfo> {\n const targetUniverseId = universeId || this.config.universeId;\n\n const response = await this.request<{\n data: Array<{\n id: number;\n name: string;\n description: string;\n creator: {\n id: number;\n type: string;\n name: string;\n };\n playing: number;\n visits: number;\n rootPlaceId: number;\n }>;\n }>(`/v1/games?universeIds=${targetUniverseId}`, {}, \"https://games.roblox.com\");\n\n const experience = response.data[0];\n if (!experience) {\n throw new RobloxApiError(\n `Experience not found: ${targetUniverseId}`,\n 404,\n `/v1/games?universeIds=${targetUniverseId}`\n );\n }\n\n return {\n universeId: targetUniverseId,\n name: experience.name,\n description: experience.description,\n creator: {\n id: experience.creator.id,\n type: experience.creator.type as \"User\" | \"Group\",\n name: experience.creator.name,\n },\n playing: experience.playing,\n visits: experience.visits,\n rootPlaceId: String(experience.rootPlaceId),\n };\n }\n\n getConfig(): Readonly<RobloxConfig> {\n return { ...this.config };\n }\n\n isDryRun(): boolean {\n return this.config.dryRun;\n }\n}\n",
15
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport type { RobloxConfig } from \"../types\";\n\nexport const ROBLOX_DEFAULTS = {\n MESSAGING_TOPIC: \"eliza-agent\",\n POLL_INTERVAL: 30,\n DRY_RUN: false,\n} as const;\n\nexport function hasRobloxEnabled(runtime: IAgentRuntime): boolean {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\");\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\");\n return Boolean(apiKey && universeId);\n}\n\nexport function getRobloxApiKey(runtime: IAgentRuntime): string | undefined {\n return runtime.getSetting(\"ROBLOX_API_KEY\") as string | undefined;\n}\n\nexport function getRobloxUniverseId(runtime: IAgentRuntime): string | undefined {\n return runtime.getSetting(\"ROBLOX_UNIVERSE_ID\") as string | undefined;\n}\n\nexport function validateRobloxConfig(runtime: IAgentRuntime): RobloxConfig {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\") as string | undefined;\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\") as string | undefined;\n\n if (!apiKey) {\n throw new Error(\"ROBLOX_API_KEY is required but not configured\");\n }\n\n if (!universeId) {\n throw new Error(\"ROBLOX_UNIVERSE_ID is required but not configured\");\n }\n\n const placeId = runtime.getSetting(\"ROBLOX_PLACE_ID\") as string | undefined;\n const webhookSecret = runtime.getSetting(\"ROBLOX_WEBHOOK_SECRET\") as string | undefined;\n const messagingTopic =\n (runtime.getSetting(\"ROBLOX_MESSAGING_TOPIC\") as string) || ROBLOX_DEFAULTS.MESSAGING_TOPIC;\n const pollIntervalStr = runtime.getSetting(\"ROBLOX_POLL_INTERVAL\") as string | undefined;\n const pollInterval = pollIntervalStr\n ? parseInt(pollIntervalStr, 10)\n : ROBLOX_DEFAULTS.POLL_INTERVAL;\n const dryRunStr = runtime.getSetting(\"ROBLOX_DRY_RUN\") as string | undefined;\n const dryRun = dryRunStr === \"true\";\n\n return {\n apiKey,\n universeId,\n placeId,\n webhookSecret,\n messagingTopic,\n pollInterval,\n dryRun,\n };\n}\n",
16
+ "import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { RobloxTestSuite } from \"./__tests__/suite\";\nimport { robloxActions } from \"./actions\";\nimport { robloxProviders } from \"./providers\";\nimport { RobloxService } from \"./services/RobloxService\";\n\nexport { RobloxApiError, RobloxClient } from \"./client/RobloxClient\";\nexport { RobloxService } from \"./services/RobloxService\";\n\nexport const robloxPlugin: Plugin = {\n name: \"roblox\",\n description: \"Roblox game integration plugin for sending and receiving messages\",\n services: [RobloxService],\n actions: robloxActions,\n providers: robloxProviders,\n tests: [new RobloxTestSuite()],\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n const apiKey = runtime.getSetting(\"ROBLOX_API_KEY\") as string;\n const universeId = runtime.getSetting(\"ROBLOX_UNIVERSE_ID\") as string;\n\n if (!apiKey || apiKey.trim() === \"\") {\n runtime.logger.warn(\"ROBLOX_API_KEY not provided\");\n return;\n }\n\n if (!universeId || universeId.trim() === \"\") {\n runtime.logger.warn(\"ROBLOX_UNIVERSE_ID not provided\");\n return;\n }\n\n runtime.logger.info({ universeId }, \"Roblox plugin initialized\");\n },\n};\n\nexport default robloxPlugin;\n"
17
+ ],
18
+ "mappings": "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",
19
+ "debugId": "0663B7918D7036F064756E2164756E21",
20
+ "names": []
21
+ }
@@ -0,0 +1,3 @@
1
+ import type { Provider } from "@elizaos/core";
2
+ export declare const gameStateProvider: Provider;
3
+ //# sourceMappingURL=gameStateProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameStateProvider.d.ts","sourceRoot":"","sources":["../../providers/gameStateProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAM5F,eAAO,MAAM,iBAAiB,EAAE,QAiE/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Provider } from "@elizaos/core";
2
+ import { gameStateProvider } from "./gameStateProvider";
3
+ export declare const robloxProviders: Provider[];
4
+ export { gameStateProvider };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE,QAAQ,EAAwB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type IAgentRuntime, Service, type UUID } from "@elizaos/core";
2
+ import { RobloxClient } from "../client/RobloxClient";
3
+ import { type ManagerHealthStatus, type RobloxConfig } from "../types";
4
+ declare class RobloxAgentManager {
5
+ runtime: IAgentRuntime;
6
+ client: RobloxClient;
7
+ config: RobloxConfig;
8
+ private pollTimer;
9
+ private isRunning;
10
+ constructor(runtime: IAgentRuntime, config: RobloxConfig);
11
+ start(): Promise<void>;
12
+ stop(): Promise<void>;
13
+ private startPolling;
14
+ private stopPolling;
15
+ private poll;
16
+ sendMessage(content: string, targetPlayerIds?: number[]): Promise<void>;
17
+ executeAction(actionName: string, parameters: Record<string, string | number | boolean | null>, targetPlayerIds?: number[]): Promise<void>;
18
+ }
19
+ export declare class RobloxService extends Service {
20
+ private static instance?;
21
+ private managers;
22
+ static serviceType: string;
23
+ readonly description = "Roblox integration service for game communication";
24
+ readonly capabilityDescription = "The agent can communicate with Roblox games and players";
25
+ private static getInstance;
26
+ initialize(runtime: IAgentRuntime): Promise<void>;
27
+ static start(runtime: IAgentRuntime): Promise<Service>;
28
+ static stop(runtime: IAgentRuntime): Promise<void>;
29
+ stop(): Promise<void>;
30
+ getManager(agentId: UUID): RobloxAgentManager | undefined;
31
+ getClient(agentId: UUID): RobloxClient | undefined;
32
+ sendMessage(agentId: UUID, content: string, targetPlayerIds?: number[]): Promise<void>;
33
+ executeAction(agentId: UUID, actionName: string, parameters: Record<string, string | number | boolean | null>, targetPlayerIds?: number[]): Promise<void>;
34
+ healthCheck(): Promise<{
35
+ healthy: boolean;
36
+ details: {
37
+ activeManagers: number;
38
+ managerStatuses: Record<string, ManagerHealthStatus>;
39
+ };
40
+ }>;
41
+ getActiveManagers(): Map<UUID, RobloxAgentManager>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=RobloxService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RobloxService.d.ts","sourceRoot":"","sources":["../../services/RobloxService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,KAAK,mBAAmB,EAAuB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5F,cAAM,kBAAkB;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;IAMlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,WAAW;YAQL,IAAI;IAEZ,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAC5D,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;CAgBjB;AAED,qBAAa,aAAc,SAAQ,OAAO;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAuC;IAEvD,MAAM,CAAC,WAAW,SAAuB;IAEzC,QAAQ,CAAC,WAAW,uDAAuD;IAC3E,QAAQ,CAAC,qBAAqB,6DAA6D;IAE3F,OAAO,CAAC,MAAM,CAAC,WAAW;IAOpB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;WAI1C,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;WA8B/C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAalD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,kBAAkB,GAAG,SAAS;IAIzD,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,YAAY,GAAG,SAAS;IAI5C,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtF,aAAa,CACjB,OAAO,EAAE,IAAI,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAC5D,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;IAQV,WAAW,IAAI,OAAO,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE;YACP,cAAc,EAAE,MAAM,CAAC;YACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;SACtD,CAAC;KACH,CAAC;IA+BF,iBAAiB,IAAI,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC;CAGnD"}
@@ -0,0 +1,2 @@
1
+ export { RobloxService } from "./RobloxService";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,125 @@
1
+ import type { UUID } from "@elizaos/core";
2
+ export declare const ROBLOX_SERVICE_NAME = "roblox";
3
+ export declare const ROBLOX_SOURCE = "roblox";
4
+ export type JsonPrimitive = string | number | boolean | null;
5
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
6
+ [key: string]: JsonValue;
7
+ };
8
+ export type JsonValueOrUndefined = JsonValue | undefined;
9
+ export interface RobloxConfig {
10
+ apiKey: string;
11
+ universeId: string;
12
+ placeId?: string;
13
+ webhookSecret?: string;
14
+ messagingTopic: string;
15
+ pollInterval: number;
16
+ dryRun: boolean;
17
+ }
18
+ export interface RobloxUser {
19
+ id: number;
20
+ username: string;
21
+ displayName: string;
22
+ avatarUrl?: string;
23
+ createdAt?: Date;
24
+ isBanned?: boolean;
25
+ }
26
+ export interface RobloxPlayerSession {
27
+ user: RobloxUser;
28
+ jobId: string;
29
+ placeId: string;
30
+ joinedAt: Date;
31
+ }
32
+ export interface RobloxGameMessage {
33
+ id: string;
34
+ user: RobloxUser;
35
+ content: string;
36
+ jobId: string;
37
+ placeId: string;
38
+ timestamp: Date;
39
+ context?: Record<string, string>;
40
+ }
41
+ export interface RobloxResponse {
42
+ content: string;
43
+ action?: RobloxGameAction;
44
+ flagged?: boolean;
45
+ }
46
+ export interface RobloxGameAction {
47
+ name: string;
48
+ parameters: Record<string, string | number | boolean | null>;
49
+ targetPlayerIds?: number[];
50
+ }
51
+ export interface DataStoreEntry<T = JsonValue> {
52
+ key: string;
53
+ value: T;
54
+ version: string;
55
+ createdAt: Date;
56
+ updatedAt: Date;
57
+ }
58
+ export type MessagingServiceDataValue = JsonValueOrUndefined;
59
+ export interface MessagingServiceMessage {
60
+ topic: string;
61
+ data: Record<string, MessagingServiceDataValue>;
62
+ sender?: {
63
+ agentId: UUID;
64
+ agentName: string;
65
+ };
66
+ }
67
+ export declare enum RobloxEventType {
68
+ PLAYER_JOINED = "roblox:player_joined",
69
+ PLAYER_LEFT = "roblox:player_left",
70
+ PLAYER_MESSAGE = "roblox:player_message",
71
+ GAME_EVENT = "roblox:game_event",
72
+ WEBHOOK_RECEIVED = "roblox:webhook_received"
73
+ }
74
+ export interface RobloxEventTypes {
75
+ [RobloxEventType.PLAYER_JOINED]: {
76
+ session: RobloxPlayerSession;
77
+ };
78
+ [RobloxEventType.PLAYER_LEFT]: {
79
+ session: RobloxPlayerSession;
80
+ duration: number;
81
+ };
82
+ [RobloxEventType.PLAYER_MESSAGE]: {
83
+ message: RobloxGameMessage;
84
+ };
85
+ [RobloxEventType.GAME_EVENT]: {
86
+ eventName: string;
87
+ data: Record<string, string | number | boolean | null>;
88
+ triggeredBy?: RobloxUser;
89
+ };
90
+ [RobloxEventType.WEBHOOK_RECEIVED]: {
91
+ type: string;
92
+ payload: Record<string, string | number | boolean | null>;
93
+ };
94
+ }
95
+ export interface RobloxServerInfo {
96
+ jobId: string;
97
+ placeId: string;
98
+ playerCount: number;
99
+ maxPlayers: number;
100
+ region?: string;
101
+ uptime?: number;
102
+ }
103
+ export interface RobloxExperienceInfo {
104
+ universeId: string;
105
+ name: string;
106
+ description?: string;
107
+ creator: {
108
+ id: number;
109
+ type: "User" | "Group";
110
+ name: string;
111
+ };
112
+ playing?: number;
113
+ visits?: number;
114
+ rootPlaceId: string;
115
+ }
116
+ export type ManagerHealthStatus = {
117
+ status: "healthy";
118
+ universeId: string;
119
+ experienceName: string;
120
+ playing?: number;
121
+ } | {
122
+ status: "unhealthy";
123
+ error: string;
124
+ };
125
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { IAgentRuntime } from "@elizaos/core";
2
+ import type { RobloxConfig } from "../types";
3
+ export declare const ROBLOX_DEFAULTS: {
4
+ readonly MESSAGING_TOPIC: "eliza-agent";
5
+ readonly POLL_INTERVAL: 30;
6
+ readonly DRY_RUN: false;
7
+ };
8
+ export declare function hasRobloxEnabled(runtime: IAgentRuntime): boolean;
9
+ export declare function getRobloxApiKey(runtime: IAgentRuntime): string | undefined;
10
+ export declare function getRobloxUniverseId(runtime: IAgentRuntime): string | undefined;
11
+ export declare function validateRobloxConfig(runtime: IAgentRuntime): RobloxConfig;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAIhE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAgCzE"}
@@ -0,0 +1,2 @@
1
+ export * from "./config";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/package.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@elizaos/plugin-roblox",
3
+ "version": "2.0.0-alpha.1",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/elizaos-plugins/plugin-roblox.git"
11
+ },
12
+ "exports": {
13
+ "./package.json": "./package.json",
14
+ ".": {
15
+ "import": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "@elizaos/core": "workspace:*",
26
+ "typescript": "^5.9.3",
27
+ "zod": "^4.3.5"
28
+ },
29
+ "devDependencies": {
30
+ "@biomejs/biome": "^2.3.11",
31
+ "@types/node": "^25.0.3"
32
+ },
33
+ "scripts": {
34
+ "dev": "bun run build.ts --watch",
35
+ "typecheck": "tsc --noEmit -p tsconfig.json",
36
+ "test": "vitest run __tests__/",
37
+ "test:unit": "vitest run __tests__/",
38
+ "test:integration": "echo 'Integration tests require elizaos CLI - skipping'",
39
+ "lint": "bunx @biomejs/biome check --write --unsafe .",
40
+ "lint:check": "bunx @biomejs/biome check .",
41
+ "clean": "rm -rf dist .turbo node_modules .turbo-tsconfig.json tsconfig.tsbuildinfo",
42
+ "format": "biome format --write .",
43
+ "format:check": "biome format .",
44
+ "build": "bun run build.ts",
45
+ "build:ts": "bun run build.ts"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "agentConfig": {
51
+ "pluginType": "elizaos:plugin:1.0.0",
52
+ "pluginParameters": {
53
+ "ROBLOX_API_KEY": {
54
+ "type": "string",
55
+ "description": "API key for authenticating with the Roblox Open Cloud API.",
56
+ "required": true,
57
+ "sensitive": true
58
+ },
59
+ "ROBLOX_UNIVERSE_ID": {
60
+ "type": "string",
61
+ "description": "The Universe ID of the Roblox experience to interact with.",
62
+ "required": true,
63
+ "sensitive": false
64
+ },
65
+ "ROBLOX_PLACE_ID": {
66
+ "type": "string",
67
+ "description": "The Place ID of the specific Roblox place within the universe.",
68
+ "required": false,
69
+ "sensitive": false
70
+ },
71
+ "ROBLOX_WEBHOOK_SECRET": {
72
+ "type": "string",
73
+ "description": "Secret key for validating incoming webhooks from Roblox.",
74
+ "required": false,
75
+ "sensitive": true
76
+ },
77
+ "ROBLOX_MESSAGING_TOPIC": {
78
+ "type": "string",
79
+ "description": "The messaging service topic for cross-server communication.",
80
+ "required": false,
81
+ "default": "eliza-agent",
82
+ "sensitive": false
83
+ },
84
+ "ROBLOX_POLL_INTERVAL": {
85
+ "type": "number",
86
+ "description": "Polling interval in seconds for Roblox data store operations.",
87
+ "required": false,
88
+ "default": 30,
89
+ "sensitive": false
90
+ },
91
+ "ROBLOX_DRY_RUN": {
92
+ "type": "boolean",
93
+ "description": "When true, operations are simulated but not executed.",
94
+ "required": false,
95
+ "default": false,
96
+ "sensitive": false
97
+ }
98
+ }
99
+ }
100
+ }