@elizaos/plugin-matrix 2.0.0-alpha.3 → 2.0.0-alpha.5

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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Join room action for Matrix plugin.
3
+ */
4
+ import type { Action } from "@elizaos/core";
5
+ export declare const joinRoom: Action;
6
+ //# sourceMappingURL=joinRoom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joinRoom.d.ts","sourceRoot":"","sources":["../../src/actions/joinRoom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA+E,MAAM,eAAe,CAAC;AA2BzH,eAAO,MAAM,QAAQ,EAAE,MAmHtB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * List rooms action for Matrix plugin.
3
+ */
4
+ import type { Action } from "@elizaos/core";
5
+ export declare const listRooms: Action;
6
+ //# sourceMappingURL=listRooms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listRooms.d.ts","sourceRoot":"","sources":["../../src/actions/listRooms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA+E,MAAM,eAAe,CAAC;AAIzH,eAAO,MAAM,SAAS,EAAE,MAsFvB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Send message action for Matrix plugin.
3
+ */
4
+ import type { Action } from "@elizaos/core";
5
+ export declare const sendMessage: Action;
6
+ //# sourceMappingURL=sendMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMessage.d.ts","sourceRoot":"","sources":["../../src/actions/sendMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA+E,MAAM,eAAe,CAAC;AA6BzH,eAAO,MAAM,WAAW,EAAE,MA6IzB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Send reaction action for Matrix plugin.
3
+ */
4
+ import type { Action } from "@elizaos/core";
5
+ export declare const sendReaction: Action;
6
+ //# sourceMappingURL=sendReaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendReaction.d.ts","sourceRoot":"","sources":["../../src/actions/sendReaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA+E,MAAM,eAAe,CAAC;AAwBzH,eAAO,MAAM,YAAY,EAAE,MAqI1B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Matrix messaging integration plugin for ElizaOS.
3
+ *
4
+ * This plugin provides Matrix protocol integration using matrix-js-sdk.
5
+ */
6
+ import type { Plugin } from "@elizaos/core";
7
+ export { MatrixService } from "./service.js";
8
+ export * from "./types.js";
9
+ import { sendMessage } from "./actions/sendMessage.js";
10
+ import { sendReaction } from "./actions/sendReaction.js";
11
+ import { listRooms } from "./actions/listRooms.js";
12
+ import { joinRoom } from "./actions/joinRoom.js";
13
+ export { sendMessage, sendReaction, listRooms, joinRoom };
14
+ import { roomStateProvider } from "./providers/roomState.js";
15
+ import { userContextProvider } from "./providers/userContext.js";
16
+ export { roomStateProvider, userContextProvider };
17
+ /**
18
+ * Matrix plugin definition.
19
+ */
20
+ declare const matrixPlugin: Plugin;
21
+ export default matrixPlugin;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AAI3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;AAKlD;;GAEG;AACH,QAAA,MAAM,YAAY,EAAE,MAmEnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/service.ts", "../src/types.ts", "../src/actions/sendMessage.ts", "../src/actions/sendReaction.ts", "../src/actions/listRooms.ts", "../src/actions/joinRoom.ts", "../src/providers/roomState.ts", "../src/providers/userContext.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Matrix messaging integration plugin for ElizaOS.\n *\n * This plugin provides Matrix protocol integration using matrix-js-sdk.\n */\n\nimport type { Plugin, IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\n// Service\nexport { MatrixService } from \"./service.js\";\n\n// Types\nexport * from \"./types.js\";\n\n// Actions\nimport { sendMessage } from \"./actions/sendMessage.js\";\nimport { sendReaction } from \"./actions/sendReaction.js\";\nimport { listRooms } from \"./actions/listRooms.js\";\nimport { joinRoom } from \"./actions/joinRoom.js\";\n\nexport { sendMessage, sendReaction, listRooms, joinRoom };\n\n// Providers\nimport { roomStateProvider } from \"./providers/roomState.js\";\nimport { userContextProvider } from \"./providers/userContext.js\";\n\nexport { roomStateProvider, userContextProvider };\n\n// Import service for plugin\nimport { MatrixService } from \"./service.js\";\n\n/**\n * Matrix plugin definition.\n */\nconst matrixPlugin: Plugin = {\n name: \"matrix\",\n description: \"Matrix messaging integration plugin for ElizaOS with E2EE support\",\n\n services: [MatrixService],\n\n actions: [sendMessage, sendReaction, listRooms, joinRoom],\n\n providers: [roomStateProvider, userContextProvider],\n\n tests: [],\n\n init: async (\n _config: Record<string, string>,\n runtime: IAgentRuntime\n ): Promise<void> => {\n const homeserver = runtime.getSetting(\"MATRIX_HOMESERVER\");\n const userId = runtime.getSetting(\"MATRIX_USER_ID\");\n const accessToken = runtime.getSetting(\"MATRIX_ACCESS_TOKEN\");\n\n logger.info(\"=\".repeat(60));\n logger.info(\"Matrix Plugin Configuration\");\n logger.info(\"=\".repeat(60));\n logger.info(` Homeserver: ${homeserver ? `✓ ${homeserver}` : \"✗ Missing (required)\"}`);\n logger.info(` User ID: ${userId ? `✓ ${userId}` : \"✗ Missing (required)\"}`);\n logger.info(` Access Token: ${accessToken ? \"✓ Set\" : \"✗ Missing (required)\"}`);\n logger.info(\"=\".repeat(60));\n\n // Validate required settings\n const missing: string[] = [];\n if (!homeserver) missing.push(\"MATRIX_HOMESERVER\");\n if (!userId) missing.push(\"MATRIX_USER_ID\");\n if (!accessToken) missing.push(\"MATRIX_ACCESS_TOKEN\");\n\n if (missing.length > 0) {\n logger.warn(\n `Matrix plugin: Missing required configuration: ${missing.join(\", \")}`\n );\n }\n\n // Additional optional settings\n const deviceId = runtime.getSetting(\"MATRIX_DEVICE_ID\");\n const rooms = runtime.getSetting(\"MATRIX_ROOMS\");\n const autoJoin = runtime.getSetting(\"MATRIX_AUTO_JOIN\");\n const encryption = runtime.getSetting(\"MATRIX_ENCRYPTION\");\n const requireMention = runtime.getSetting(\"MATRIX_REQUIRE_MENTION\");\n\n if (deviceId) {\n logger.info(` Device ID: ${deviceId}`);\n }\n\n if (rooms) {\n logger.info(` Auto-join Rooms: ${rooms}`);\n }\n\n if (autoJoin === \"true\") {\n logger.info(\" Auto-join Invites: ✓ Enabled\");\n }\n\n if (encryption === \"true\") {\n logger.info(\" End-to-End Encryption: ✓ Enabled\");\n }\n\n if (requireMention === \"true\") {\n logger.info(\" Require Mention: ✓ Enabled (will only respond to mentions in rooms)\");\n }\n },\n};\n\nexport default matrixPlugin;\n",
6
+ "/**\n * Matrix service implementation for ElizaOS.\n *\n * This service provides Matrix messaging capabilities using matrix-js-sdk.\n */\n\nimport { Service, type IAgentRuntime, type EventPayload, logger } from \"@elizaos/core\";\nimport * as sdk from \"matrix-js-sdk\";\nimport {\n type IMatrixService,\n type MatrixMessage,\n type MatrixMessageSendOptions,\n type MatrixRoom,\n type MatrixSendResult,\n type MatrixSettings,\n type MatrixUserInfo,\n MatrixConfigurationError,\n MatrixEventTypes,\n MatrixNotConnectedError,\n MATRIX_SERVICE_NAME,\n getMatrixLocalpart,\n isValidMatrixRoomAlias,\n isValidMatrixRoomId,\n} from \"./types.js\";\n\n/**\n * Matrix messaging service for ElizaOS agents.\n */\nexport class MatrixService extends Service implements IMatrixService {\n static serviceType: string = MATRIX_SERVICE_NAME;\n\n capabilityDescription = \"Matrix messaging service for chat communication\";\n\n declare protected runtime: IAgentRuntime;\n private settings!: MatrixSettings;\n private client!: sdk.MatrixClient;\n private connected: boolean = false;\n private syncing: boolean = false;\n\n /**\n * Start the Matrix service.\n */\n static async start(runtime: IAgentRuntime): Promise<MatrixService> {\n const service = new MatrixService();\n await service.initialize(runtime);\n return service;\n }\n\n /**\n * Stop the Matrix service.\n */\n static override async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n /**\n * Initialize the Matrix 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 Matrix client\n this.client = sdk.createClient({\n baseUrl: this.settings.homeserver,\n userId: this.settings.userId,\n accessToken: this.settings.accessToken,\n deviceId: this.settings.deviceId,\n });\n\n // Set up event handlers\n this.setupEventHandlers();\n\n // Start client\n await this.connect();\n\n logger.info(\n `Matrix service initialized for ${this.settings.userId} on ${this.settings.homeserver}`\n );\n }\n\n /**\n * Load settings from runtime.\n */\n private loadSettings(): MatrixSettings {\n // Helper to safely get string settings\n const getStringSetting = (key: string): string | undefined => {\n const value = this.runtime.getSetting(key);\n return typeof value === \"string\" ? value : undefined;\n };\n\n const homeserver = getStringSetting(\"MATRIX_HOMESERVER\");\n const userId = getStringSetting(\"MATRIX_USER_ID\");\n const accessToken = getStringSetting(\"MATRIX_ACCESS_TOKEN\");\n const deviceId = getStringSetting(\"MATRIX_DEVICE_ID\");\n const roomsStr = getStringSetting(\"MATRIX_ROOMS\");\n const autoJoinStr = getStringSetting(\"MATRIX_AUTO_JOIN\");\n const encryptionStr = getStringSetting(\"MATRIX_ENCRYPTION\");\n const requireMentionStr = getStringSetting(\"MATRIX_REQUIRE_MENTION\");\n\n const rooms = roomsStr\n ? roomsStr.split(\",\").map((r: string) => r.trim()).filter(Boolean)\n : [];\n\n return {\n homeserver: homeserver || \"\",\n userId: userId || \"\",\n accessToken: accessToken || \"\",\n deviceId,\n rooms,\n autoJoin: autoJoinStr === \"true\",\n encryption: encryptionStr === \"true\",\n requireMention: requireMentionStr === \"true\",\n enabled: true,\n };\n }\n\n /**\n * Validate the settings.\n */\n private validateSettings(): void {\n if (!this.settings.homeserver) {\n throw new MatrixConfigurationError(\n \"MATRIX_HOMESERVER is required\",\n \"MATRIX_HOMESERVER\"\n );\n }\n\n if (!this.settings.userId) {\n throw new MatrixConfigurationError(\n \"MATRIX_USER_ID is required\",\n \"MATRIX_USER_ID\"\n );\n }\n\n if (!this.settings.accessToken) {\n throw new MatrixConfigurationError(\n \"MATRIX_ACCESS_TOKEN is required\",\n \"MATRIX_ACCESS_TOKEN\"\n );\n }\n }\n\n /**\n * Set up event handlers for the Matrix client.\n */\n private setupEventHandlers(): void {\n // Sync events\n this.client.on(sdk.ClientEvent.Sync, (state) => {\n if (state === \"PREPARED\") {\n this.syncing = true;\n logger.info(\"Matrix sync complete\");\n this.runtime.emitEvent(MatrixEventTypes.SYNC_COMPLETE, {\n runtime: this.runtime,\n } as EventPayload);\n }\n });\n\n // Room timeline events (messages)\n this.client.on(\n sdk.RoomEvent.Timeline,\n (event, room, toStartOfTimeline) => {\n if (toStartOfTimeline) return;\n if (event.getType() !== \"m.room.message\") return;\n if (event.getSender() === this.settings.userId) return;\n\n this.handleRoomMessage(event, room);\n }\n );\n\n // Room membership events\n this.client.on(sdk.RoomMemberEvent.Membership, (event, member) => {\n if (member.userId !== this.settings.userId) return;\n\n if (member.membership === \"invite\" && this.settings.autoJoin) {\n const roomId = event.getRoomId();\n if (roomId) {\n logger.info(`Auto-joining room ${roomId}`);\n this.client.joinRoom(roomId).catch((err) => {\n logger.error(`Failed to auto-join room: ${err.message}`);\n });\n }\n }\n });\n }\n\n /**\n * Handle an incoming room message.\n */\n private handleRoomMessage(\n event: sdk.MatrixEvent,\n room: sdk.Room | undefined\n ): void {\n const content = event.getContent();\n const msgType = content.msgtype;\n\n // Only handle text messages for now\n if (msgType !== \"m.text\") return;\n\n const roomId = event.getRoomId();\n if (!roomId || !room) return;\n\n // Check mention requirement\n if (this.settings.requireMention) {\n const body = content.body || \"\";\n const localpart = getMatrixLocalpart(this.settings.userId);\n const mentionPattern = new RegExp(`@?${localpart}`, \"i\");\n if (!mentionPattern.test(body)) {\n return;\n }\n }\n\n const sender = event.getSender();\n const senderMember = room.getMember(sender || \"\");\n\n const senderInfo: MatrixUserInfo = {\n userId: sender || \"\",\n displayName: senderMember?.name,\n avatarUrl: senderMember?.getMxcAvatarUrl() || undefined,\n };\n\n // Check for reply/thread\n const relatesTo = content[\"m.relates_to\"];\n const isEdit = relatesTo?.rel_type === \"m.replace\";\n const threadId = relatesTo?.rel_type === \"m.thread\" ? relatesTo.event_id : undefined;\n const replyTo = relatesTo?.[\"m.in_reply_to\"]?.event_id;\n\n const message: MatrixMessage = {\n eventId: event.getId() || \"\",\n roomId,\n sender: sender || \"\",\n senderInfo,\n content: content.body || \"\",\n msgType,\n formattedBody: content.formatted_body,\n timestamp: event.getTs(),\n threadId,\n replyTo,\n isEdit,\n replacesEventId: isEdit ? relatesTo?.event_id : undefined,\n };\n\n const matrixRoom: MatrixRoom = {\n roomId,\n name: room.name,\n topic: room.currentState.getStateEvents(\"m.room.topic\", \"\")?.getContent()?.topic,\n canonicalAlias: room.getCanonicalAlias() || undefined,\n isEncrypted: room.hasEncryptionStateEvent(),\n isDirect: this.client.getAccountData(\"m.direct\")?.getContent()?.[sender || \"\"]?.includes(roomId) || false,\n memberCount: room.getJoinedMemberCount(),\n };\n\n logger.debug(\n `Matrix message from ${senderInfo.displayName || sender} in ${room.name || roomId}: ${message.content.slice(0, 50)}...`\n );\n\n this.runtime.emitEvent(MatrixEventTypes.MESSAGE_RECEIVED, {\n message,\n room: matrixRoom,\n runtime: this.runtime,\n } as EventPayload);\n }\n\n /**\n * Connect to Matrix.\n */\n private async connect(): Promise<void> {\n await this.client.startClient({ initialSyncLimit: 10 });\n this.connected = true;\n\n // Wait for initial sync\n await new Promise<void>((resolve) => {\n const listener = (state: string) => {\n if (state === \"PREPARED\") {\n this.client.removeListener(sdk.ClientEvent.Sync, listener);\n resolve();\n }\n };\n this.client.on(sdk.ClientEvent.Sync, listener);\n });\n\n // Join configured rooms\n for (const room of this.settings.rooms) {\n try {\n await this.joinRoom(room);\n } catch (err) {\n logger.warn(`Failed to join room ${room}: ${err}`);\n }\n }\n }\n\n /**\n * Shutdown the service.\n */\n async stop(): Promise<void> {\n if (this.client) {\n this.client.stopClient();\n }\n this.connected = false;\n logger.info(\"Matrix service stopped\");\n }\n\n // ============================================================================\n // Public Interface\n // ============================================================================\n\n isConnected(): boolean {\n return this.connected && this.syncing;\n }\n\n getUserId(): string {\n return this.settings.userId;\n }\n\n getHomeserver(): string {\n return this.settings.homeserver;\n }\n\n async getJoinedRooms(): Promise<MatrixRoom[]> {\n const rooms = this.client.getRooms();\n return rooms\n .filter((room) => room.getMyMembership() === \"join\")\n .map((room) => ({\n roomId: room.roomId,\n name: room.name,\n topic: room.currentState.getStateEvents(\"m.room.topic\", \"\")?.getContent()?.topic,\n canonicalAlias: room.getCanonicalAlias() || undefined,\n isEncrypted: room.hasEncryptionStateEvent(),\n isDirect: false,\n memberCount: room.getJoinedMemberCount(),\n }));\n }\n\n async sendMessage(\n text: string,\n options?: MatrixMessageSendOptions\n ): Promise<MatrixSendResult> {\n if (!this.isConnected()) {\n throw new MatrixNotConnectedError();\n }\n\n const roomId = options?.roomId;\n if (!roomId) {\n return { success: false, error: \"Room ID is required\" };\n }\n\n // Resolve room ID from alias if needed\n let resolvedRoomId = roomId;\n if (isValidMatrixRoomAlias(roomId)) {\n const resolved = await this.client.getRoomIdForAlias(roomId);\n resolvedRoomId = resolved.room_id;\n }\n\n // Build content\n const content: Record<string, unknown> = {\n msgtype: \"m.text\",\n body: text,\n };\n\n if (options?.formatted) {\n content.format = \"org.matrix.custom.html\";\n content.formatted_body = text;\n }\n\n // Handle reply/thread\n if (options?.threadId || options?.replyTo) {\n content[\"m.relates_to\"] = {};\n\n if (options.threadId) {\n (content[\"m.relates_to\"] as Record<string, unknown>).rel_type = \"m.thread\";\n (content[\"m.relates_to\"] as Record<string, unknown>).event_id = options.threadId;\n }\n\n if (options.replyTo) {\n (content[\"m.relates_to\"] as Record<string, unknown>)[\"m.in_reply_to\"] = {\n event_id: options.replyTo,\n };\n }\n }\n\n const response = await this.client.sendMessage(resolvedRoomId, content);\n const eventId = response.event_id;\n\n this.runtime.emitEvent(MatrixEventTypes.MESSAGE_SENT, {\n roomId: resolvedRoomId,\n eventId,\n content: text,\n runtime: this.runtime,\n } as EventPayload);\n\n return {\n success: true,\n eventId,\n roomId: resolvedRoomId,\n };\n }\n\n async sendReaction(\n roomId: string,\n eventId: string,\n emoji: string\n ): Promise<MatrixSendResult> {\n if (!this.isConnected()) {\n throw new MatrixNotConnectedError();\n }\n\n const content = {\n \"m.relates_to\": {\n rel_type: \"m.annotation\",\n event_id: eventId,\n key: emoji,\n },\n };\n\n const response = await this.client.sendEvent(roomId, \"m.reaction\", content);\n\n return {\n success: true,\n eventId: response.event_id,\n roomId,\n };\n }\n\n async joinRoom(roomIdOrAlias: string): Promise<string> {\n if (!this.isConnected()) {\n throw new MatrixNotConnectedError();\n }\n\n const response = await this.client.joinRoom(roomIdOrAlias);\n const roomId = response.roomId;\n\n logger.info(`Joined room ${roomId}`);\n this.runtime.emitEvent(MatrixEventTypes.ROOM_JOINED, {\n room: { roomId },\n runtime: this.runtime,\n } as EventPayload);\n\n return roomId;\n }\n\n async leaveRoom(roomId: string): Promise<void> {\n if (!this.isConnected()) {\n throw new MatrixNotConnectedError();\n }\n\n await this.client.leave(roomId);\n logger.info(`Left room ${roomId}`);\n this.runtime.emitEvent(MatrixEventTypes.ROOM_LEFT, {\n roomId,\n runtime: this.runtime,\n } as EventPayload);\n }\n\n async sendTyping(\n roomId: string,\n typing: boolean,\n timeout: number = 30000\n ): Promise<void> {\n if (!this.isConnected()) {\n return;\n }\n\n await this.client.sendTyping(roomId, typing, timeout);\n }\n\n async sendReadReceipt(roomId: string, eventId: string): Promise<void> {\n if (!this.isConnected()) {\n return;\n }\n\n await this.client.sendReadReceipt(\n new sdk.MatrixEvent({ event_id: eventId, room_id: roomId })\n );\n }\n}\n",
7
+ "/**\n * Type definitions for the Matrix plugin.\n */\n\nimport type { Service, IAgentRuntime } from \"@elizaos/core\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum message length for Matrix */\nexport const MAX_MATRIX_MESSAGE_LENGTH = 4000;\n\n/** Service name constant */\nexport const MATRIX_SERVICE_NAME = \"matrix\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Event types emitted by the Matrix plugin */\nexport enum MatrixEventTypes {\n MESSAGE_RECEIVED = \"MATRIX_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"MATRIX_MESSAGE_SENT\",\n ROOM_JOINED = \"MATRIX_ROOM_JOINED\",\n ROOM_LEFT = \"MATRIX_ROOM_LEFT\",\n INVITE_RECEIVED = \"MATRIX_INVITE_RECEIVED\",\n REACTION_RECEIVED = \"MATRIX_REACTION_RECEIVED\",\n TYPING_RECEIVED = \"MATRIX_TYPING_RECEIVED\",\n SYNC_COMPLETE = \"MATRIX_SYNC_COMPLETE\",\n CONNECTION_READY = \"MATRIX_CONNECTION_READY\",\n CONNECTION_LOST = \"MATRIX_CONNECTION_LOST\",\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/** Configuration settings for the Matrix plugin */\nexport interface MatrixSettings {\n /** Matrix homeserver URL */\n homeserver: string;\n /** Matrix user ID (@user:homeserver) */\n userId: string;\n /** Access token for authentication */\n accessToken: string;\n /** Device ID for this session */\n deviceId?: string;\n /** Rooms to auto-join */\n rooms: string[];\n /** Whether to auto-accept invites */\n autoJoin: boolean;\n /** Enable end-to-end encryption */\n encryption: boolean;\n /** Require mention to respond in rooms */\n requireMention: boolean;\n /** Whether this configuration is enabled */\n enabled: boolean;\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Information about a Matrix user */\nexport interface MatrixUserInfo {\n /** Matrix user ID (@user:homeserver) */\n userId: string;\n /** Display name */\n displayName?: string;\n /** Avatar URL */\n avatarUrl?: string;\n}\n\n/** Represents a Matrix room */\nexport interface MatrixRoom {\n /** Room ID (!room:homeserver) */\n roomId: string;\n /** Room name */\n name?: string;\n /** Room topic */\n topic?: string;\n /** Room alias (#alias:homeserver) */\n canonicalAlias?: string;\n /** Whether room is encrypted */\n isEncrypted: boolean;\n /** Whether this is a direct message room */\n isDirect: boolean;\n /** Member count */\n memberCount: number;\n}\n\n/** Represents a Matrix message */\nexport interface MatrixMessage {\n /** Event ID */\n eventId: string;\n /** Room ID */\n roomId: string;\n /** Sender user ID */\n sender: string;\n /** Sender info */\n senderInfo: MatrixUserInfo;\n /** Message content */\n content: string;\n /** Message type (m.text, m.image, etc.) */\n msgType: string;\n /** Formatted body (HTML) */\n formattedBody?: string;\n /** Timestamp */\n timestamp: number;\n /** Thread root event ID */\n threadId?: string;\n /** Reply-to event ID */\n replyTo?: string;\n /** Whether this is an edit */\n isEdit: boolean;\n /** Original event ID if this is an edit */\n replacesEventId?: string;\n}\n\n/** Options for sending a message */\nexport interface MatrixMessageSendOptions {\n /** Room ID or alias to send to */\n roomId?: string;\n /** Event ID to reply to */\n replyTo?: string;\n /** Thread root event ID */\n threadId?: string;\n /** Format as HTML */\n formatted?: boolean;\n /** Media URL to attach */\n mediaUrl?: string;\n}\n\n/** Result from sending a message */\nexport interface MatrixSendResult {\n /** Whether the send succeeded */\n success: boolean;\n /** Event ID of the sent message */\n eventId?: string;\n /** Room ID */\n roomId?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================================================\n// Service Interface\n// ============================================================================\n\n/** Interface for the Matrix service */\nexport interface IMatrixService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the user ID */\n getUserId(): string;\n\n /** Get the homeserver URL */\n getHomeserver(): string;\n\n /** Get joined rooms */\n getJoinedRooms(): Promise<MatrixRoom[]>;\n\n /** Send a message */\n sendMessage(\n text: string,\n options?: MatrixMessageSendOptions\n ): Promise<MatrixSendResult>;\n\n /** Send a reaction */\n sendReaction(\n roomId: string,\n eventId: string,\n emoji: string\n ): Promise<MatrixSendResult>;\n\n /** Join a room */\n joinRoom(roomIdOrAlias: string): Promise<string>;\n\n /** Leave a room */\n leaveRoom(roomId: string): Promise<void>;\n\n /** Send typing indicator */\n sendTyping(roomId: string, typing: boolean, timeout?: number): Promise<void>;\n\n /** Send read receipt */\n sendReadReceipt(roomId: string, eventId: string): Promise<void>;\n}\n\n// ============================================================================\n// Event Payloads\n// ============================================================================\n\n/** Payload for MESSAGE_RECEIVED event */\nexport interface MatrixMessageReceivedPayload {\n message: MatrixMessage;\n room: MatrixRoom;\n runtime: IAgentRuntime;\n}\n\n/** Payload for MESSAGE_SENT event */\nexport interface MatrixMessageSentPayload {\n roomId: string;\n eventId: string;\n content: string;\n}\n\n/** Payload for ROOM_JOINED event */\nexport interface MatrixRoomJoinedPayload {\n room: MatrixRoom;\n}\n\n/** Payload for INVITE_RECEIVED event */\nexport interface MatrixInviteReceivedPayload {\n roomId: string;\n inviter: string;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a string is a valid Matrix user ID.\n */\nexport function isValidMatrixUserId(userId: string): boolean {\n return /^@[^:]+:.+$/.test(userId);\n}\n\n/**\n * Check if a string is a valid Matrix room ID.\n */\nexport function isValidMatrixRoomId(roomId: string): boolean {\n return /^![^:]+:.+$/.test(roomId);\n}\n\n/**\n * Check if a string is a valid Matrix room alias.\n */\nexport function isValidMatrixRoomAlias(alias: string): boolean {\n return /^#[^:]+:.+$/.test(alias);\n}\n\n/**\n * Extract the localpart from a Matrix ID.\n */\nexport function getMatrixLocalpart(matrixId: string): string {\n const match = matrixId.match(/^[@#!]([^:]+):/);\n return match ? match[1] : matrixId;\n}\n\n/**\n * Extract the server part from a Matrix ID.\n */\nexport function getMatrixServerpart(matrixId: string): string {\n const match = matrixId.match(/:(.+)$/);\n return match ? match[1] : \"\";\n}\n\n/**\n * Get the best display name for a Matrix user.\n */\nexport function getMatrixUserDisplayName(user: MatrixUserInfo): string {\n return user.displayName || getMatrixLocalpart(user.userId);\n}\n\n/**\n * Convert a media URL to an HTTP URL via homeserver.\n */\nexport function matrixMxcToHttp(\n mxcUrl: string,\n homeserver: string\n): string | undefined {\n if (!mxcUrl.startsWith(\"mxc://\")) {\n return undefined;\n }\n const [serverName, mediaId] = mxcUrl.slice(6).split(\"/\");\n if (!serverName || !mediaId) {\n return undefined;\n }\n const base = homeserver.replace(/\\/$/, \"\");\n return `${base}/_matrix/media/v3/download/${serverName}/${mediaId}`;\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/** Base error class for Matrix plugin errors */\nexport class MatrixPluginError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MatrixPluginError\";\n }\n}\n\n/** Error when the Matrix service is not initialized */\nexport class MatrixServiceNotInitializedError extends MatrixPluginError {\n constructor(message: string = \"Matrix service is not initialized\") {\n super(message);\n this.name = \"MatrixServiceNotInitializedError\";\n }\n}\n\n/** Error when the Matrix client is not connected */\nexport class MatrixNotConnectedError extends MatrixPluginError {\n constructor(message: string = \"Matrix client is not connected\") {\n super(message);\n this.name = \"MatrixNotConnectedError\";\n }\n}\n\n/** Error when there is a configuration problem */\nexport class MatrixConfigurationError extends MatrixPluginError {\n settingName?: string;\n\n constructor(message: string, settingName?: string) {\n super(message);\n this.name = \"MatrixConfigurationError\";\n this.settingName = settingName;\n }\n}\n\n/** Error when an API call fails */\nexport class MatrixApiError extends MatrixPluginError {\n errcode?: string;\n\n constructor(message: string, errcode?: string) {\n super(message);\n this.name = \"MatrixApiError\";\n this.errcode = errcode;\n }\n}\n",
8
+ "/**\n * Send message action for Matrix plugin.\n */\n\nimport type { Action, ActionResult, HandlerCallback, HandlerOptions, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { composePromptFromState, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport { MATRIX_SERVICE_NAME, isValidMatrixRoomId, isValidMatrixRoomAlias } from \"../types.js\";\n\nconst SEND_MESSAGE_TEMPLATE = `You are helping to extract send message parameters for Matrix.\n\nThe user wants to send a message to a Matrix room.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n1. text: The message text to send\n2. roomId: The room ID (!room:server) or alias (#alias:server), or \"current\" for the current room\n\nRespond with a JSON object like:\n{\n \"text\": \"The message to send\",\n \"roomId\": \"current\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\ninterface SendMessageParams {\n text: string;\n roomId: string;\n}\n\nexport const sendMessage: Action = {\n name: \"MATRIX_SEND_MESSAGE\",\n similes: [\n \"SEND_MATRIX_MESSAGE\",\n \"MESSAGE_MATRIX\",\n \"MATRIX_TEXT\",\n ],\n description: \"Send a message to a Matrix room\",\n\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State\n ): Promise<boolean> => {\n return message.content.source === \"matrix\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n if (callback) {\n await callback({ text: \"Matrix service is not available.\", source: \"matrix\" });\n }\n return { success: false, error: \"Matrix service not available\" };\n }\n\n // Compose prompt - ensure state has required properties\n const composedState: State = state ?? {\n values: {},\n data: {},\n text: \"\",\n };\n const prompt = await composePromptFromState({\n template: SEND_MESSAGE_TEMPLATE,\n state: composedState,\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(response as string);\n if (parsed?.text) {\n messageInfo = {\n text: String(parsed.text),\n roomId: String(parsed.roomId || \"current\"),\n };\n break;\n }\n }\n\n if (!messageInfo || !messageInfo.text) {\n if (callback) {\n await callback({\n text: \"I couldn't understand what message you want me to send. Please try again.\",\n source: \"matrix\",\n });\n }\n return { success: false, error: \"Could not extract message parameters\" };\n }\n\n // Determine target room\n let targetRoomId: string | undefined;\n if (messageInfo.roomId && messageInfo.roomId !== \"current\") {\n if (isValidMatrixRoomId(messageInfo.roomId) || isValidMatrixRoomAlias(messageInfo.roomId)) {\n targetRoomId = messageInfo.roomId;\n }\n }\n\n // Get room from state context if available\n const roomData = state?.data?.room as Record<string, string> | undefined;\n if (!targetRoomId && roomData?.roomId) {\n targetRoomId = roomData.roomId;\n }\n\n if (!targetRoomId) {\n if (callback) {\n await callback({\n text: \"I couldn't determine which room to send to. Please specify a room.\",\n source: \"matrix\",\n });\n }\n return { success: false, error: \"Could not determine target room\" };\n }\n\n // Send message\n const result = await matrixService.sendMessage(messageInfo.text, {\n roomId: targetRoomId,\n });\n\n if (!result.success) {\n if (callback) {\n await callback({\n text: `Failed to send message: ${result.error}`,\n source: \"matrix\",\n });\n }\n return { success: false, error: result.error };\n }\n\n if (callback) {\n await callback({\n text: \"Message sent successfully.\",\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n roomId: result.roomId,\n eventId: result.eventId,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Send a message saying 'Hello everyone!'\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that message to the room.\",\n actions: [\"MATRIX_SEND_MESSAGE\"],\n },\n },\n ],\n ],\n};\n",
9
+ "/**\n * Send reaction action for Matrix plugin.\n */\n\nimport type { Action, ActionResult, HandlerCallback, HandlerOptions, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { composePromptFromState, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport { MATRIX_SERVICE_NAME } from \"../types.js\";\n\nconst SEND_REACTION_TEMPLATE = `You are helping to extract reaction parameters for Matrix.\n\nThe user wants to react to a Matrix message with an emoji.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n1. emoji: The emoji to react with (single emoji character)\n2. eventId: The event ID of the message to react to (starts with $)\n\nRespond with a JSON object like:\n{\n \"emoji\": \"👍\",\n \"eventId\": \"$event123\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\nexport const sendReaction: Action = {\n name: \"MATRIX_SEND_REACTION\",\n similes: [\n \"REACT_MATRIX\",\n \"MATRIX_REACT\",\n \"ADD_MATRIX_REACTION\",\n ],\n description: \"React to a Matrix message with an emoji\",\n\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State\n ): Promise<boolean> => {\n return message.content.source === \"matrix\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n if (callback) {\n await callback({ text: \"Matrix service is not available.\", source: \"matrix\" });\n }\n return { success: false, error: \"Matrix service not available\" };\n }\n\n // Compose prompt - ensure state has required properties\n const composedState: State = state ?? {\n values: {},\n data: {},\n text: \"\",\n };\n const prompt = await composePromptFromState({\n template: SEND_REACTION_TEMPLATE,\n state: composedState,\n });\n\n // Extract parameters using LLM\n let reactionInfo: { emoji: string; eventId: 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(response as string);\n if (parsed?.emoji && parsed?.eventId) {\n reactionInfo = {\n emoji: String(parsed.emoji),\n eventId: String(parsed.eventId),\n };\n break;\n }\n }\n\n if (!reactionInfo) {\n if (callback) {\n await callback({\n text: \"I couldn't understand the reaction request. Please specify the emoji and message.\",\n source: \"matrix\",\n });\n }\n return { success: false, error: \"Could not extract reaction parameters\" };\n }\n\n // Get room from state\n const roomData = state?.data?.room as Record<string, string> | undefined;\n const roomId = roomData?.roomId;\n if (!roomId) {\n if (callback) {\n await callback({\n text: \"I couldn't determine which room this is in.\",\n source: \"matrix\",\n });\n }\n return { success: false, error: \"Could not determine room\" };\n }\n\n // Send reaction\n const result = await matrixService.sendReaction(\n roomId,\n reactionInfo.eventId,\n reactionInfo.emoji\n );\n\n if (!result.success) {\n if (callback) {\n await callback({\n text: `Failed to add reaction: ${result.error}`,\n source: \"matrix\",\n });\n }\n return { success: false, error: result.error };\n }\n\n if (callback) {\n await callback({\n text: `Added ${reactionInfo.emoji} reaction.`,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n emoji: reactionInfo.emoji,\n eventId: reactionInfo.eventId,\n roomId,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"React to the last message with a thumbs up\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll add a thumbs up reaction.\",\n actions: [\"MATRIX_SEND_REACTION\"],\n },\n },\n ],\n ],\n};\n",
10
+ "/**\n * List rooms action for Matrix plugin.\n */\n\nimport type { Action, ActionResult, HandlerCallback, HandlerOptions, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport { MATRIX_SERVICE_NAME } from \"../types.js\";\n\nexport const listRooms: Action = {\n name: \"MATRIX_LIST_ROOMS\",\n similes: [\n \"LIST_MATRIX_ROOMS\",\n \"SHOW_ROOMS\",\n \"GET_ROOMS\",\n \"MY_ROOMS\",\n ],\n description: \"List all Matrix rooms the bot has joined\",\n\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State\n ): Promise<boolean> => {\n return message.content.source === \"matrix\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n if (callback) {\n await callback({ text: \"Matrix service is not available.\", source: \"matrix\" });\n }\n return { success: false, error: \"Matrix service not available\" };\n }\n\n const rooms = await matrixService.getJoinedRooms();\n\n // Format room list\n const roomList = rooms.map((room) => {\n const name = room.name || room.canonicalAlias || room.roomId;\n const members = `${room.memberCount} members`;\n const encrypted = room.isEncrypted ? \" (encrypted)\" : \"\";\n return `- ${name} (${members})${encrypted}`;\n });\n\n const responseText =\n rooms.length > 0\n ? `Joined ${rooms.length} room(s):\\n\\n${roomList.join(\"\\n\")}`\n : \"Not currently in any rooms.\";\n\n if (callback) {\n await callback({\n text: responseText,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n roomCount: rooms.length,\n rooms: rooms.map((r) => ({\n roomId: r.roomId,\n name: r.name,\n alias: r.canonicalAlias,\n memberCount: r.memberCount,\n isEncrypted: r.isEncrypted,\n })),\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"What rooms are you in?\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll list the rooms I've joined.\",\n actions: [\"MATRIX_LIST_ROOMS\"],\n },\n },\n ],\n ],\n};\n",
11
+ "/**\n * Join room action for Matrix plugin.\n */\n\nimport type { Action, ActionResult, HandlerCallback, HandlerOptions, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { composePromptFromState, ModelType, parseJSONObjectFromText } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport { MATRIX_SERVICE_NAME, isValidMatrixRoomId, isValidMatrixRoomAlias } from \"../types.js\";\n\nconst JOIN_ROOM_TEMPLATE = `You are helping to extract a Matrix room identifier.\n\nThe user wants to join a Matrix room.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the room ID (!room:server) or room alias (#alias:server) to join.\n\nRespond with a JSON object like:\n{\n \"room\": \"!room:matrix.org\"\n}\n\nor:\n\n{\n \"room\": \"#alias:matrix.org\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\nexport const joinRoom: Action = {\n name: \"MATRIX_JOIN_ROOM\",\n similes: [\n \"JOIN_MATRIX_ROOM\",\n \"ENTER_ROOM\",\n ],\n description: \"Join a Matrix room by ID or alias\",\n\n validate: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State\n ): Promise<boolean> => {\n return message.content.source === \"matrix\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult | undefined> => {\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n if (callback) {\n await callback({ text: \"Matrix service is not available.\", source: \"matrix\" });\n }\n return { success: false, error: \"Matrix service not available\" };\n }\n\n // Compose prompt - ensure state has required properties\n const composedState: State = state ?? {\n values: {},\n data: {},\n text: \"\",\n };\n const prompt = await composePromptFromState({\n template: JOIN_ROOM_TEMPLATE,\n state: composedState,\n });\n\n // Extract room using LLM\n let room: 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(response as string);\n if (parsed?.room) {\n const roomStr = String(parsed.room).trim();\n if (isValidMatrixRoomId(roomStr) || isValidMatrixRoomAlias(roomStr)) {\n room = roomStr;\n break;\n }\n }\n }\n\n if (!room) {\n if (callback) {\n await callback({\n text: \"I couldn't understand which room you want me to join. Please specify a room ID (!room:server) or alias (#alias:server).\",\n source: \"matrix\",\n });\n }\n return { success: false, error: \"Could not extract room identifier\" };\n }\n\n // Join room\n try {\n const roomId = await matrixService.joinRoom(room);\n\n if (callback) {\n await callback({\n text: `Joined room ${room}.`,\n source: message.content.source as string,\n });\n }\n\n return {\n success: true,\n data: {\n roomId,\n joined: room,\n },\n };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n if (callback) {\n await callback({\n text: `Failed to join room: ${error}`,\n source: \"matrix\",\n });\n }\n return { success: false, error };\n }\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Join #general:matrix.org\" },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll join that room.\",\n actions: [\"MATRIX_JOIN_ROOM\"],\n },\n },\n ],\n ],\n};\n",
12
+ "/**\n * Room state provider for Matrix plugin.\n */\n\nimport type { Provider, ProviderResult, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport { MATRIX_SERVICE_NAME, getMatrixLocalpart } from \"../types.js\";\n\n/**\n * Provider that gives the agent information about the current Matrix room context.\n */\nexport const roomStateProvider: Provider = {\n name: \"matrixRoomState\",\n description: \"Provides information about the current Matrix room context\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State\n ): Promise<ProviderResult> => {\n // Only provide context for Matrix messages\n if (message.content.source !== \"matrix\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n return {\n data: { connected: false },\n values: { connected: false },\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 as Record<string, unknown> | undefined;\n const roomId = room?.roomId as string | undefined;\n const roomName = room?.name as string | undefined;\n const isEncrypted = room?.isEncrypted as boolean | undefined;\n const isDirect = room?.isDirect as boolean | undefined;\n const memberCount = room?.memberCount as number | undefined;\n\n const userId = matrixService.getUserId();\n const displayName = getMatrixLocalpart(userId);\n\n let responseText = \"\";\n\n if (isDirect) {\n responseText = `${agentName} is in a direct message conversation on Matrix.`;\n } else {\n const roomLabel = roomName || roomId || \"a Matrix room\";\n responseText = `${agentName} is currently in Matrix room \"${roomLabel}\".`;\n \n if (memberCount) {\n responseText += ` The room has ${memberCount} members.`;\n }\n }\n\n if (isEncrypted) {\n responseText += \" This room has end-to-end encryption enabled.\";\n }\n\n responseText += `\\n\\nMatrix is a decentralized communication protocol. ${agentName} is logged in as ${userId}.`;\n\n return {\n data: {\n roomId,\n roomName,\n isEncrypted: isEncrypted || false,\n isDirect: isDirect || false,\n memberCount: memberCount || 0,\n userId,\n displayName,\n homeserver: matrixService.getHomeserver(),\n connected: true,\n },\n values: {\n roomId,\n roomName,\n isEncrypted: isEncrypted || false,\n isDirect: isDirect || false,\n memberCount: memberCount || 0,\n userId,\n },\n text: responseText,\n };\n },\n};\n",
13
+ "/**\n * User context provider for Matrix plugin.\n */\n\nimport type { Provider, ProviderResult, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { MatrixService } from \"../service.js\";\nimport {\n MATRIX_SERVICE_NAME,\n getMatrixLocalpart,\n getMatrixUserDisplayName,\n type MatrixUserInfo,\n} from \"../types.js\";\n\n/**\n * Provider that gives the agent information about the Matrix user context.\n */\nexport const userContextProvider: Provider = {\n name: \"matrixUserContext\",\n description: \"Provides information about the Matrix user in the current conversation\",\n\n get: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State\n ): Promise<ProviderResult> => {\n // Only provide context for Matrix messages\n if (message.content.source !== \"matrix\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const matrixService = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n\n if (!matrixService || !matrixService.isConnected()) {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const agentName = state?.agentName || \"The agent\";\n\n // Try to get sender info from message metadata\n const metadata = message.content.metadata as Record<string, unknown> | undefined;\n const senderInfo = metadata?.senderInfo as MatrixUserInfo | undefined;\n\n if (!senderInfo) {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const displayName = getMatrixUserDisplayName(senderInfo);\n const localpart = getMatrixLocalpart(senderInfo.userId);\n\n const responseText = `${agentName} is talking to ${displayName} (${senderInfo.userId}) on Matrix.`;\n\n return {\n data: {\n userId: senderInfo.userId,\n displayName,\n localpart,\n avatarUrl: senderInfo.avatarUrl,\n },\n values: {\n userId: senderInfo.userId,\n displayName,\n localpart,\n },\n text: responseText,\n };\n },\n};\n"
14
+ ],
15
+ "mappings": "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",
16
+ "debugId": "35E58066575BB30D64756E2164756E21",
17
+ "names": []
18
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Room state provider for Matrix plugin.
3
+ */
4
+ import type { Provider } from "@elizaos/core";
5
+ /**
6
+ * Provider that gives the agent information about the current Matrix room context.
7
+ */
8
+ export declare const roomStateProvider: Provider;
9
+ //# sourceMappingURL=roomState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomState.d.ts","sourceRoot":"","sources":["../../src/providers/roomState.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAgD,MAAM,eAAe,CAAC;AAI5F;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAmF/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * User context provider for Matrix plugin.
3
+ */
4
+ import type { Provider } from "@elizaos/core";
5
+ /**
6
+ * Provider that gives the agent information about the Matrix user context.
7
+ */
8
+ export declare const userContextProvider: Provider;
9
+ //# sourceMappingURL=userContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userContext.d.ts","sourceRoot":"","sources":["../../src/providers/userContext.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAgD,MAAM,eAAe,CAAC;AAS5F;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,QA8DjC,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Matrix service implementation for ElizaOS.
3
+ *
4
+ * This service provides Matrix messaging capabilities using matrix-js-sdk.
5
+ */
6
+ import { Service, type IAgentRuntime } from "@elizaos/core";
7
+ import { type IMatrixService, type MatrixMessageSendOptions, type MatrixRoom, type MatrixSendResult } from "./types.js";
8
+ /**
9
+ * Matrix messaging service for ElizaOS agents.
10
+ */
11
+ export declare class MatrixService extends Service implements IMatrixService {
12
+ static serviceType: string;
13
+ capabilityDescription: string;
14
+ protected runtime: IAgentRuntime;
15
+ private settings;
16
+ private client;
17
+ private connected;
18
+ private syncing;
19
+ /**
20
+ * Start the Matrix service.
21
+ */
22
+ static start(runtime: IAgentRuntime): Promise<MatrixService>;
23
+ /**
24
+ * Stop the Matrix service.
25
+ */
26
+ static stopRuntime(runtime: IAgentRuntime): Promise<void>;
27
+ /**
28
+ * Initialize the Matrix service.
29
+ */
30
+ private initialize;
31
+ /**
32
+ * Load settings from runtime.
33
+ */
34
+ private loadSettings;
35
+ /**
36
+ * Validate the settings.
37
+ */
38
+ private validateSettings;
39
+ /**
40
+ * Set up event handlers for the Matrix client.
41
+ */
42
+ private setupEventHandlers;
43
+ /**
44
+ * Handle an incoming room message.
45
+ */
46
+ private handleRoomMessage;
47
+ /**
48
+ * Connect to Matrix.
49
+ */
50
+ private connect;
51
+ /**
52
+ * Shutdown the service.
53
+ */
54
+ stop(): Promise<void>;
55
+ isConnected(): boolean;
56
+ getUserId(): string;
57
+ getHomeserver(): string;
58
+ getJoinedRooms(): Promise<MatrixRoom[]>;
59
+ sendMessage(text: string, options?: MatrixMessageSendOptions): Promise<MatrixSendResult>;
60
+ sendReaction(roomId: string, eventId: string, emoji: string): Promise<MatrixSendResult>;
61
+ joinRoom(roomIdOrAlias: string): Promise<string>;
62
+ leaveRoom(roomId: string): Promise<void>;
63
+ sendTyping(roomId: string, typing: boolean, timeout?: number): Promise<void>;
64
+ sendReadReceipt(roomId: string, eventId: string): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAA6B,MAAM,eAAe,CAAC;AAEvF,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,gBAAgB,EAUtB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAQ,YAAW,cAAc;IAClE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAuB;IAEjD,qBAAqB,SAAqD;IAE1E,UAAkB,OAAO,EAAE,aAAa,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,OAAO,CAAkB;IAEjC;;OAEG;WACU,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlE;;OAEG;WACmB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE;;OAEG;YACW,UAAU;IA4BxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0EzB;;OAEG;YACW,OAAO;IAyBrB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,WAAW,IAAI,OAAO;IAItB,SAAS,IAAI,MAAM;IAInB,aAAa,IAAI,MAAM;IAIjB,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAevC,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,gBAAgB,CAAC;IA6DtB,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,CAAC;IAsBtB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBhD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAQV,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAStE"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Type definitions for the Matrix plugin.
3
+ */
4
+ import type { Service, IAgentRuntime } from "@elizaos/core";
5
+ /** Maximum message length for Matrix */
6
+ export declare const MAX_MATRIX_MESSAGE_LENGTH = 4000;
7
+ /** Service name constant */
8
+ export declare const MATRIX_SERVICE_NAME = "matrix";
9
+ /** Event types emitted by the Matrix plugin */
10
+ export declare enum MatrixEventTypes {
11
+ MESSAGE_RECEIVED = "MATRIX_MESSAGE_RECEIVED",
12
+ MESSAGE_SENT = "MATRIX_MESSAGE_SENT",
13
+ ROOM_JOINED = "MATRIX_ROOM_JOINED",
14
+ ROOM_LEFT = "MATRIX_ROOM_LEFT",
15
+ INVITE_RECEIVED = "MATRIX_INVITE_RECEIVED",
16
+ REACTION_RECEIVED = "MATRIX_REACTION_RECEIVED",
17
+ TYPING_RECEIVED = "MATRIX_TYPING_RECEIVED",
18
+ SYNC_COMPLETE = "MATRIX_SYNC_COMPLETE",
19
+ CONNECTION_READY = "MATRIX_CONNECTION_READY",
20
+ CONNECTION_LOST = "MATRIX_CONNECTION_LOST"
21
+ }
22
+ /** Configuration settings for the Matrix plugin */
23
+ export interface MatrixSettings {
24
+ /** Matrix homeserver URL */
25
+ homeserver: string;
26
+ /** Matrix user ID (@user:homeserver) */
27
+ userId: string;
28
+ /** Access token for authentication */
29
+ accessToken: string;
30
+ /** Device ID for this session */
31
+ deviceId?: string;
32
+ /** Rooms to auto-join */
33
+ rooms: string[];
34
+ /** Whether to auto-accept invites */
35
+ autoJoin: boolean;
36
+ /** Enable end-to-end encryption */
37
+ encryption: boolean;
38
+ /** Require mention to respond in rooms */
39
+ requireMention: boolean;
40
+ /** Whether this configuration is enabled */
41
+ enabled: boolean;
42
+ }
43
+ /** Information about a Matrix user */
44
+ export interface MatrixUserInfo {
45
+ /** Matrix user ID (@user:homeserver) */
46
+ userId: string;
47
+ /** Display name */
48
+ displayName?: string;
49
+ /** Avatar URL */
50
+ avatarUrl?: string;
51
+ }
52
+ /** Represents a Matrix room */
53
+ export interface MatrixRoom {
54
+ /** Room ID (!room:homeserver) */
55
+ roomId: string;
56
+ /** Room name */
57
+ name?: string;
58
+ /** Room topic */
59
+ topic?: string;
60
+ /** Room alias (#alias:homeserver) */
61
+ canonicalAlias?: string;
62
+ /** Whether room is encrypted */
63
+ isEncrypted: boolean;
64
+ /** Whether this is a direct message room */
65
+ isDirect: boolean;
66
+ /** Member count */
67
+ memberCount: number;
68
+ }
69
+ /** Represents a Matrix message */
70
+ export interface MatrixMessage {
71
+ /** Event ID */
72
+ eventId: string;
73
+ /** Room ID */
74
+ roomId: string;
75
+ /** Sender user ID */
76
+ sender: string;
77
+ /** Sender info */
78
+ senderInfo: MatrixUserInfo;
79
+ /** Message content */
80
+ content: string;
81
+ /** Message type (m.text, m.image, etc.) */
82
+ msgType: string;
83
+ /** Formatted body (HTML) */
84
+ formattedBody?: string;
85
+ /** Timestamp */
86
+ timestamp: number;
87
+ /** Thread root event ID */
88
+ threadId?: string;
89
+ /** Reply-to event ID */
90
+ replyTo?: string;
91
+ /** Whether this is an edit */
92
+ isEdit: boolean;
93
+ /** Original event ID if this is an edit */
94
+ replacesEventId?: string;
95
+ }
96
+ /** Options for sending a message */
97
+ export interface MatrixMessageSendOptions {
98
+ /** Room ID or alias to send to */
99
+ roomId?: string;
100
+ /** Event ID to reply to */
101
+ replyTo?: string;
102
+ /** Thread root event ID */
103
+ threadId?: string;
104
+ /** Format as HTML */
105
+ formatted?: boolean;
106
+ /** Media URL to attach */
107
+ mediaUrl?: string;
108
+ }
109
+ /** Result from sending a message */
110
+ export interface MatrixSendResult {
111
+ /** Whether the send succeeded */
112
+ success: boolean;
113
+ /** Event ID of the sent message */
114
+ eventId?: string;
115
+ /** Room ID */
116
+ roomId?: string;
117
+ /** Error message if failed */
118
+ error?: string;
119
+ }
120
+ /** Interface for the Matrix service */
121
+ export interface IMatrixService extends Service {
122
+ /** Check if the service is connected */
123
+ isConnected(): boolean;
124
+ /** Get the user ID */
125
+ getUserId(): string;
126
+ /** Get the homeserver URL */
127
+ getHomeserver(): string;
128
+ /** Get joined rooms */
129
+ getJoinedRooms(): Promise<MatrixRoom[]>;
130
+ /** Send a message */
131
+ sendMessage(text: string, options?: MatrixMessageSendOptions): Promise<MatrixSendResult>;
132
+ /** Send a reaction */
133
+ sendReaction(roomId: string, eventId: string, emoji: string): Promise<MatrixSendResult>;
134
+ /** Join a room */
135
+ joinRoom(roomIdOrAlias: string): Promise<string>;
136
+ /** Leave a room */
137
+ leaveRoom(roomId: string): Promise<void>;
138
+ /** Send typing indicator */
139
+ sendTyping(roomId: string, typing: boolean, timeout?: number): Promise<void>;
140
+ /** Send read receipt */
141
+ sendReadReceipt(roomId: string, eventId: string): Promise<void>;
142
+ }
143
+ /** Payload for MESSAGE_RECEIVED event */
144
+ export interface MatrixMessageReceivedPayload {
145
+ message: MatrixMessage;
146
+ room: MatrixRoom;
147
+ runtime: IAgentRuntime;
148
+ }
149
+ /** Payload for MESSAGE_SENT event */
150
+ export interface MatrixMessageSentPayload {
151
+ roomId: string;
152
+ eventId: string;
153
+ content: string;
154
+ }
155
+ /** Payload for ROOM_JOINED event */
156
+ export interface MatrixRoomJoinedPayload {
157
+ room: MatrixRoom;
158
+ }
159
+ /** Payload for INVITE_RECEIVED event */
160
+ export interface MatrixInviteReceivedPayload {
161
+ roomId: string;
162
+ inviter: string;
163
+ }
164
+ /**
165
+ * Check if a string is a valid Matrix user ID.
166
+ */
167
+ export declare function isValidMatrixUserId(userId: string): boolean;
168
+ /**
169
+ * Check if a string is a valid Matrix room ID.
170
+ */
171
+ export declare function isValidMatrixRoomId(roomId: string): boolean;
172
+ /**
173
+ * Check if a string is a valid Matrix room alias.
174
+ */
175
+ export declare function isValidMatrixRoomAlias(alias: string): boolean;
176
+ /**
177
+ * Extract the localpart from a Matrix ID.
178
+ */
179
+ export declare function getMatrixLocalpart(matrixId: string): string;
180
+ /**
181
+ * Extract the server part from a Matrix ID.
182
+ */
183
+ export declare function getMatrixServerpart(matrixId: string): string;
184
+ /**
185
+ * Get the best display name for a Matrix user.
186
+ */
187
+ export declare function getMatrixUserDisplayName(user: MatrixUserInfo): string;
188
+ /**
189
+ * Convert a media URL to an HTTP URL via homeserver.
190
+ */
191
+ export declare function matrixMxcToHttp(mxcUrl: string, homeserver: string): string | undefined;
192
+ /** Base error class for Matrix plugin errors */
193
+ export declare class MatrixPluginError extends Error {
194
+ constructor(message: string);
195
+ }
196
+ /** Error when the Matrix service is not initialized */
197
+ export declare class MatrixServiceNotInitializedError extends MatrixPluginError {
198
+ constructor(message?: string);
199
+ }
200
+ /** Error when the Matrix client is not connected */
201
+ export declare class MatrixNotConnectedError extends MatrixPluginError {
202
+ constructor(message?: string);
203
+ }
204
+ /** Error when there is a configuration problem */
205
+ export declare class MatrixConfigurationError extends MatrixPluginError {
206
+ settingName?: string;
207
+ constructor(message: string, settingName?: string);
208
+ }
209
+ /** Error when an API call fails */
210
+ export declare class MatrixApiError extends MatrixPluginError {
211
+ errcode?: string;
212
+ constructor(message: string, errcode?: string);
213
+ }
214
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}