@elizaos/plugin-signal 2.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accounts.d.ts +124 -0
- package/dist/accounts.d.ts.map +1 -0
- package/dist/actions/listContacts.d.ts +4 -0
- package/dist/actions/listContacts.d.ts.map +1 -0
- package/dist/actions/listGroups.d.ts +4 -0
- package/dist/actions/listGroups.d.ts.map +1 -0
- package/dist/actions/sendMessage.d.ts +4 -0
- package/dist/actions/sendMessage.d.ts.map +1 -0
- package/dist/actions/sendReaction.d.ts +4 -0
- package/dist/actions/sendReaction.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1488 -0
- package/dist/index.js.map +19 -0
- package/dist/providers/conversationState.d.ts +7 -0
- package/dist/providers/conversationState.d.ts.map +1 -0
- package/dist/rpc.d.ts +163 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/service.d.ts +53 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/types.ts", "../src/actions/listContacts.ts", "../src/actions/listGroups.ts", "../src/actions/sendMessage.ts", "../src/actions/sendReaction.ts", "../src/providers/conversationState.ts", "../src/service.ts", "../src/accounts.ts", "../src/rpc.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { type IAgentRuntime, logger, type Plugin } from \"@elizaos/core\";\nimport listContacts from \"./actions/listContacts\";\nimport listGroups from \"./actions/listGroups\";\n// Actions\nimport sendMessage from \"./actions/sendMessage\";\nimport sendReaction from \"./actions/sendReaction\";\n\n// Providers\nimport { conversationStateProvider } from \"./providers/conversationState\";\n\n// Service\nimport { SignalService } from \"./service\";\n\n// Types\nimport { normalizeE164 } from \"./types\";\n\nconst signalPlugin: Plugin = {\n name: \"signal\",\n description:\n \"Signal messaging integration plugin for ElizaOS with end-to-end encryption\",\n services: [SignalService],\n actions: [sendMessage, sendReaction, listContacts, listGroups],\n providers: [conversationStateProvider],\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n const accountNumber = runtime.getSetting(\"SIGNAL_ACCOUNT_NUMBER\") as string;\n const httpUrl = runtime.getSetting(\"SIGNAL_HTTP_URL\") as string;\n const cliPath = runtime.getSetting(\"SIGNAL_CLI_PATH\") as string;\n const ignoreGroups = runtime.getSetting(\n \"SIGNAL_SHOULD_IGNORE_GROUP_MESSAGES\",\n ) as string;\n\n // Log configuration status\n const maskNumber = (number: string | undefined): string => {\n if (!number || number.trim() === \"\") return \"[not set]\";\n if (number.length <= 6) return \"***\";\n return `${number.slice(0, 3)}...${number.slice(-2)}`;\n };\n\n logger.info(\n {\n src: \"plugin:signal\",\n agentId: runtime.agentId,\n settings: {\n accountNumber: maskNumber(accountNumber),\n httpUrl: httpUrl || \"[not set]\",\n cliPath: cliPath || \"[not set]\",\n ignoreGroups: ignoreGroups || \"false\",\n },\n },\n \"Signal plugin initializing\",\n );\n\n if (!accountNumber || accountNumber.trim() === \"\") {\n logger.warn(\n { src: \"plugin:signal\", agentId: runtime.agentId },\n \"SIGNAL_ACCOUNT_NUMBER not provided - Signal plugin is loaded but will not be functional\",\n );\n return;\n }\n\n const normalizedNumber = normalizeE164(accountNumber);\n if (!normalizedNumber) {\n logger.error(\n { src: \"plugin:signal\", agentId: runtime.agentId, accountNumber },\n \"SIGNAL_ACCOUNT_NUMBER is not a valid E.164 phone number\",\n );\n return;\n }\n\n if (!httpUrl && !cliPath) {\n logger.warn(\n { src: \"plugin:signal\", agentId: runtime.agentId },\n \"Neither SIGNAL_HTTP_URL nor SIGNAL_CLI_PATH provided - Signal plugin will not be able to communicate\",\n );\n return;\n }\n\n logger.info(\n { src: \"plugin:signal\", agentId: runtime.agentId },\n \"Signal plugin configuration validated successfully\",\n );\n },\n};\n\nexport default signalPlugin;\n\n// Account management exports\nexport {\n DEFAULT_ACCOUNT_ID,\n isMultiAccountEnabled,\n listEnabledSignalAccounts,\n listSignalAccountIds,\n normalizeAccountId,\n type ResolvedSignalAccount,\n resolveDefaultSignalAccountId,\n resolveSignalAccount,\n type SignalAccountConfig,\n type SignalDmConfig,\n type SignalGroupConfig,\n type SignalMultiAccountConfig,\n type SignalReactionNotificationMode,\n} from \"./accounts\";\nexport { listContacts } from \"./actions/listContacts\";\nexport { listGroups } from \"./actions/listGroups\";\n// Export actions\nexport { sendMessage } from \"./actions/sendMessage\";\nexport { sendReaction } from \"./actions/sendReaction\";\n// Export providers\nexport { conversationStateProvider } from \"./providers/conversationState\";\n// RPC client exports\nexport {\n createSignalEventStream,\n normalizeBaseUrl,\n parseSignalEventData,\n type SignalCheckResult,\n type SignalRpcError,\n type SignalRpcOptions,\n type SignalRpcResponse,\n type SignalSseEvent,\n signalCheck,\n signalGetVersion,\n signalListAccounts,\n signalListContacts,\n signalListGroups,\n signalRpcRequest,\n signalSend,\n signalSendReaction,\n signalSendReadReceipt,\n signalSendTyping,\n streamSignalEvents,\n} from \"./rpc\";\n// Export service for direct access\nexport { SignalService } from \"./service\";\n// Export types\nexport type {\n ISignalService,\n SignalAttachment,\n SignalContact,\n SignalEventPayloadMap,\n SignalGroup,\n SignalGroupMember,\n SignalMessage,\n SignalMessageReceivedPayload,\n SignalMessageSendOptions,\n SignalMessageSentPayload,\n SignalQuote,\n SignalReactionInfo,\n SignalReactionPayload,\n SignalSettings,\n} from \"./types\";\nexport {\n getSignalContactDisplayName,\n isValidE164,\n isValidGroupId,\n isValidUuid,\n MAX_SIGNAL_ATTACHMENT_SIZE,\n MAX_SIGNAL_MESSAGE_LENGTH,\n normalizeE164,\n SIGNAL_SERVICE_NAME,\n SignalApiError,\n SignalClientNotAvailableError,\n SignalConfigurationError,\n SignalEventTypes,\n SignalPluginError,\n SignalServiceNotInitializedError,\n} from \"./types\";\n",
|
|
6
|
+
"import type {\n Character,\n EventPayload,\n MessagePayload,\n WorldPayload,\n} from \"@elizaos/core\";\n\n/**\n * Signal-specific event types\n */\nexport enum SignalEventTypes {\n MESSAGE_RECEIVED = \"SIGNAL_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"SIGNAL_MESSAGE_SENT\",\n REACTION_RECEIVED = \"SIGNAL_REACTION_RECEIVED\",\n GROUP_JOINED = \"SIGNAL_GROUP_JOINED\",\n GROUP_LEFT = \"SIGNAL_GROUP_LEFT\",\n TYPING_STARTED = \"SIGNAL_TYPING_STARTED\",\n TYPING_STOPPED = \"SIGNAL_TYPING_STOPPED\",\n READ_RECEIPT = \"SIGNAL_READ_RECEIPT\",\n}\n\nexport interface SignalMessageReceivedPayload extends MessagePayload {\n sender: string;\n groupId: string | undefined;\n timestamp: number;\n attachments: SignalAttachment[];\n isGroupMessage: boolean;\n}\n\nexport interface SignalMessageSentPayload extends MessagePayload {\n recipient: string;\n groupId: string | undefined;\n timestamp: number;\n}\n\nexport interface SignalReactionPayload extends EventPayload {\n emoji: string;\n sender: string;\n targetTimestamp: number;\n targetAuthor: string;\n isRemove: boolean;\n}\n\nexport interface SignalGroupPayload extends WorldPayload {\n groupId: string;\n groupName: string;\n members: string[];\n}\n\nexport interface SignalAttachment {\n contentType: string;\n filename: string | undefined;\n id: string;\n size: number;\n width: number | undefined;\n height: number | undefined;\n caption: string | undefined;\n blurhash: string | undefined;\n}\n\nexport interface SignalEventPayloadMap {\n [SignalEventTypes.MESSAGE_RECEIVED]: SignalMessageReceivedPayload;\n [SignalEventTypes.MESSAGE_SENT]: SignalMessageSentPayload;\n [SignalEventTypes.REACTION_RECEIVED]: SignalReactionPayload;\n [SignalEventTypes.GROUP_JOINED]: SignalGroupPayload;\n [SignalEventTypes.GROUP_LEFT]: SignalGroupPayload;\n}\n\nexport interface SignalContact {\n number: string;\n uuid: string | undefined;\n name: string | undefined;\n profileName: string | undefined;\n color: string | undefined;\n blocked: boolean;\n}\n\nexport interface SignalGroup {\n id: string;\n name: string;\n description: string | undefined;\n isMember: boolean;\n isBlocked: boolean;\n members: SignalGroupMember[];\n admins: string[];\n inviteLink: string | undefined;\n}\n\nexport interface SignalGroupMember {\n uuid: string;\n number: string | undefined;\n role: \"ADMINISTRATOR\" | \"DEFAULT\";\n}\n\nexport interface SignalMessage {\n timestamp: number;\n sender: string;\n senderUuid: string | undefined;\n groupId: string | undefined;\n message: string | undefined;\n attachments: SignalAttachment[];\n quote: SignalQuote | undefined;\n reaction: SignalReactionInfo | undefined;\n expiresInSeconds: number | undefined;\n viewOnce: boolean;\n}\n\nexport interface SignalQuote {\n id: number;\n author: string;\n authorUuid: string | undefined;\n text: string;\n attachments: SignalAttachment[];\n}\n\nexport interface SignalReactionInfo {\n emoji: string;\n targetAuthor: string;\n targetAuthorUuid: string | undefined;\n targetSentTimestamp: number;\n isRemove: boolean;\n}\n\nexport interface ISignalService {\n accountNumber: string | null;\n character: Character;\n isConnected: boolean;\n}\n\nexport const SIGNAL_SERVICE_NAME = \"signal\";\n\nexport const ServiceType = {\n SIGNAL: \"signal\",\n} as const;\n\nexport interface SignalSettings {\n shouldIgnoreGroupMessages: boolean;\n allowedGroups: string[] | undefined;\n blockedNumbers: string[] | undefined;\n}\n\nexport interface SignalMessageSendOptions {\n attachments: string[] | undefined;\n quote: { timestamp: number; author: string } | undefined;\n expiresInSeconds: number | undefined;\n}\n\nexport class SignalPluginError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = \"SignalPluginError\";\n }\n}\n\nexport class SignalServiceNotInitializedError extends SignalPluginError {\n constructor() {\n super(\"Signal service is not initialized\", \"SERVICE_NOT_INITIALIZED\");\n this.name = \"SignalServiceNotInitializedError\";\n }\n}\n\nexport class SignalClientNotAvailableError extends SignalPluginError {\n constructor() {\n super(\"Signal client is not available\", \"CLIENT_NOT_AVAILABLE\");\n this.name = \"SignalClientNotAvailableError\";\n }\n}\n\nexport class SignalConfigurationError extends SignalPluginError {\n constructor(missingConfig: string) {\n super(`Missing required configuration: ${missingConfig}`, \"MISSING_CONFIG\");\n this.name = \"SignalConfigurationError\";\n }\n}\n\nexport class SignalApiError extends SignalPluginError {\n constructor(\n message: string,\n public readonly apiErrorCode: string | undefined,\n ) {\n super(message, \"API_ERROR\");\n this.name = \"SignalApiError\";\n }\n}\n\n/**\n * Normalize a phone number to E.164 format\n */\nexport function normalizeE164(number: string): string | null {\n // Remove all non-digit characters except leading +\n let cleaned = number.replace(/[^\\d+]/g, \"\");\n\n // Ensure it starts with +\n if (!cleaned.startsWith(\"+\")) {\n // Assume US number if no country code\n if (cleaned.length === 10) {\n cleaned = `+1${cleaned}`;\n } else if (cleaned.length === 11 && cleaned.startsWith(\"1\")) {\n cleaned = `+${cleaned}`;\n } else {\n cleaned = `+${cleaned}`;\n }\n }\n\n // Validate E.164 format: + followed by 7-15 digits\n if (!/^\\+\\d{7,15}$/.test(cleaned)) {\n return null;\n }\n\n return cleaned;\n}\n\n/**\n * Validates an E.164 phone number format\n */\nexport function isValidE164(number: string): boolean {\n return /^\\+\\d{7,15}$/.test(number);\n}\n\n/**\n * Validates a Signal group ID format (base64-encoded)\n */\nexport function isValidGroupId(id: string): boolean {\n // Signal group IDs are base64-encoded\n return /^[A-Za-z0-9+/]+=*$/.test(id) && id.length >= 32;\n}\n\n/**\n * Validates a Signal UUID format\n */\nexport function isValidUuid(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(\n uuid,\n );\n}\n\n/**\n * Gets the display name for a Signal contact\n */\nexport function getSignalContactDisplayName(contact: SignalContact): string {\n return contact.profileName || contact.name || contact.number;\n}\n\n/**\n * Maximum message length for Signal messages\n */\nexport const MAX_SIGNAL_MESSAGE_LENGTH = 4000;\n\n/**\n * Maximum attachment size (100MB)\n */\nexport const MAX_SIGNAL_ATTACHMENT_SIZE = 100 * 1024 * 1024;\n",
|
|
7
|
+
"import type {\n Action,\n ActionExample,\n ActionResult,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { SignalService } from \"../service\";\nimport { getSignalContactDisplayName, SIGNAL_SERVICE_NAME } from \"../types\";\n\nexport const listContacts: Action = {\n name: \"SIGNAL_LIST_CONTACTS\",\n similes: [\n \"LIST_SIGNAL_CONTACTS\",\n \"SHOW_CONTACTS\",\n \"GET_CONTACTS\",\n \"SIGNAL_CONTACTS\",\n ],\n description: \"List Signal contacts\",\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"signal\";\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 signalService = runtime.getService(\n SIGNAL_SERVICE_NAME,\n ) as SignalService;\n\n if (!signalService || !signalService.isServiceConnected()) {\n await callback?.({\n text: \"Signal service is not available.\",\n source: \"signal\",\n });\n return { success: false, error: \"Signal service not available\" };\n }\n\n const contacts = await signalService.getContacts();\n\n // Filter out blocked contacts and sort by name\n const activeContacts = contacts\n .filter((c) => !c.blocked)\n .sort((a, b) => {\n const nameA = getSignalContactDisplayName(a);\n const nameB = getSignalContactDisplayName(b);\n return nameA.localeCompare(nameB);\n });\n\n // Format contact list\n const contactList = activeContacts.map((c) => {\n const name = getSignalContactDisplayName(c);\n const number = c.number;\n return `• ${name} (${number})`;\n });\n\n const response: Content = {\n text: `Found ${activeContacts.length} contacts:\\n\\n${contactList.join(\"\\n\")}`,\n source: message.content.source,\n };\n\n runtime.logger.debug(\n {\n src: \"plugin:signal:action:list-contacts\",\n contactCount: activeContacts.length,\n },\n \"[SIGNAL_LIST_CONTACTS] Contacts listed\",\n );\n\n await callback?.(response);\n\n return {\n success: true,\n data: {\n contactCount: activeContacts.length,\n contacts: activeContacts.map((c) => ({\n number: c.number,\n name: getSignalContactDisplayName(c),\n uuid: c.uuid,\n })),\n },\n };\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Show me my Signal contacts\",\n },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll list your Signal contacts.\",\n actions: [\"SIGNAL_LIST_CONTACTS\"],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default listContacts;\n",
|
|
8
|
+
"import type {\n Action,\n ActionExample,\n ActionResult,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport type { SignalService } from \"../service\";\nimport { SIGNAL_SERVICE_NAME } from \"../types\";\n\nexport const listGroups: Action = {\n name: \"SIGNAL_LIST_GROUPS\",\n similes: [\"LIST_SIGNAL_GROUPS\", \"SHOW_GROUPS\", \"GET_GROUPS\", \"SIGNAL_GROUPS\"],\n description: \"List Signal groups\",\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"signal\";\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 signalService = runtime.getService(\n SIGNAL_SERVICE_NAME,\n ) as SignalService;\n\n if (!signalService || !signalService.isServiceConnected()) {\n await callback?.({\n text: \"Signal service is not available.\",\n source: \"signal\",\n });\n return { success: false, error: \"Signal service not available\" };\n }\n\n const groups = await signalService.getGroups();\n\n // Filter to groups the bot is a member of and sort by name\n const activeGroups = groups\n .filter((g) => g.isMember && !g.isBlocked)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n // Format group list\n const groupList = activeGroups.map((g) => {\n const memberCount = g.members.length;\n const description = g.description\n ? ` - ${g.description.slice(0, 50)}${g.description.length > 50 ? \"...\" : \"\"}`\n : \"\";\n return `• ${g.name} (${memberCount} members)${description}`;\n });\n\n const response: Content = {\n text: `Found ${activeGroups.length} groups:\\n\\n${groupList.join(\"\\n\")}`,\n source: message.content.source,\n };\n\n runtime.logger.debug(\n {\n src: \"plugin:signal:action:list-groups\",\n groupCount: activeGroups.length,\n },\n \"[SIGNAL_LIST_GROUPS] Groups listed\",\n );\n\n await callback?.(response);\n\n return {\n success: true,\n data: {\n groupCount: activeGroups.length,\n groups: activeGroups.map((g) => ({\n id: g.id,\n name: g.name,\n description: g.description,\n memberCount: g.members.length,\n })),\n },\n };\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Show me my Signal groups\",\n },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll list your Signal groups.\",\n actions: [\"SIGNAL_LIST_GROUPS\"],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default listGroups;\n",
|
|
9
|
+
"import {\n type Action,\n type ActionExample,\n type ActionResult,\n type Content,\n composePromptFromState,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { SignalService } from \"../service\";\nimport { isValidGroupId, normalizeE164, SIGNAL_SERVICE_NAME } from \"../types\";\n\nconst sendMessageTemplate = `You are helping to extract send message parameters for Signal.\n\nThe user wants to send a message to a Signal contact or group.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n1. text: The message text to send\n2. recipient: The phone number (E.164 format like +1234567890) or group ID to send to (default: \"current\" for current conversation)\n\nRespond with a JSON object like:\n{\n \"text\": \"The message to send\",\n \"recipient\": \"current\"\n}\n\nOnly respond with the JSON object, no other text.`;\n\nexport const sendMessage: Action = {\n name: \"SIGNAL_SEND_MESSAGE\",\n similes: [\n \"SEND_SIGNAL_MESSAGE\",\n \"TEXT_SIGNAL\",\n \"MESSAGE_SIGNAL\",\n \"SIGNAL_TEXT\",\n ],\n description: \"Send a message to a Signal contact or group\",\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"signal\";\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 signalService = runtime.getService(\n SIGNAL_SERVICE_NAME,\n ) as SignalService;\n\n if (!signalService || !signalService.isServiceConnected()) {\n await callback?.({\n text: \"Signal service is not available.\",\n source: \"signal\",\n });\n return { success: false, error: \"Signal service not available\" };\n }\n\n const composedState: State = state ?? {\n values: {},\n data: {},\n text: \"\",\n };\n const prompt = composePromptFromState({\n state: composedState,\n template: sendMessageTemplate,\n });\n\n let messageInfo: { text: string; recipient?: string } | null = null;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsedResponse = parseJSONObjectFromText(response);\n if (parsedResponse?.text) {\n messageInfo = {\n text: String(parsedResponse.text),\n recipient: parsedResponse.recipient\n ? String(parsedResponse.recipient)\n : \"current\",\n };\n break;\n }\n }\n\n if (!messageInfo || !messageInfo.text) {\n await callback?.({\n text: \"I couldn't understand what message you want me to send. Please try again with a clearer request.\",\n source: \"signal\",\n });\n return { success: false, error: \"Could not extract message parameters\" };\n }\n\n const stateData = state?.data;\n const room = stateData?.room || (await runtime.getRoom(message.roomId));\n\n if (!room) {\n await callback?.({\n text: \"I couldn't determine the current conversation.\",\n source: \"signal\",\n });\n return { success: false, error: \"Could not determine conversation\" };\n }\n\n let targetRecipient = room.channelId || \"\";\n const isGroup = room.metadata?.isGroup || false;\n\n // If a specific recipient was provided\n if (messageInfo.recipient && messageInfo.recipient !== \"current\") {\n const normalized = normalizeE164(messageInfo.recipient);\n if (normalized) {\n targetRecipient = normalized;\n } else if (isValidGroupId(messageInfo.recipient)) {\n targetRecipient = messageInfo.recipient;\n }\n }\n\n let result: { timestamp: number };\n if (isGroup || isValidGroupId(targetRecipient)) {\n result = await signalService.sendGroupMessage(\n targetRecipient,\n messageInfo.text,\n );\n } else {\n result = await signalService.sendMessage(\n targetRecipient,\n messageInfo.text,\n );\n }\n\n const response: Content = {\n text: \"Message sent successfully.\",\n source: message.content.source,\n };\n\n runtime.logger.debug(\n {\n src: \"plugin:signal:action:send-message\",\n timestamp: result.timestamp,\n recipient: targetRecipient,\n },\n \"[SIGNAL_SEND_MESSAGE] Message sent successfully\",\n );\n\n await callback?.(response);\n\n return {\n success: true,\n data: {\n timestamp: result.timestamp,\n recipient: targetRecipient,\n },\n };\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"Send a message to +1234567890 saying 'Hello!'\",\n },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll send that message for you.\",\n actions: [\"SIGNAL_SEND_MESSAGE\"],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default sendMessage;\n",
|
|
10
|
+
"import {\n type Action,\n type ActionExample,\n type ActionResult,\n type Content,\n composePromptFromState,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport type { SignalService } from \"../service\";\nimport { SIGNAL_SERVICE_NAME } from \"../types\";\n\nconst sendReactionTemplate = `You are helping to extract reaction parameters for Signal.\n\nThe user wants to react to a Signal message with an emoji.\n\nRecent conversation:\n{{recentMessages}}\n\nExtract the following:\n1. emoji: The emoji to react with (single emoji character)\n2. targetTimestamp: The timestamp of the message to react to (number)\n3. targetAuthor: The phone number of the message author\n4. remove: Whether to remove the reaction instead of adding it (default: false)\n\nRespond with a JSON object like:\n{\n \"emoji\": \"👍\",\n \"targetTimestamp\": 1234567890000,\n \"targetAuthor\": \"+1234567890\",\n \"remove\": false\n}\n\nOnly respond with the JSON object, no other text.`;\n\nexport const sendReaction: Action = {\n name: \"SIGNAL_SEND_REACTION\",\n similes: [\n \"REACT_SIGNAL\",\n \"SIGNAL_REACT\",\n \"ADD_SIGNAL_REACTION\",\n \"SIGNAL_EMOJI\",\n ],\n description: \"React to a Signal message with an emoji\",\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n ): Promise<boolean> => {\n return message.content.source === \"signal\";\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 signalService = runtime.getService(\n SIGNAL_SERVICE_NAME,\n ) as SignalService;\n\n if (!signalService || !signalService.isServiceConnected()) {\n await callback?.({\n text: \"Signal service is not available.\",\n source: \"signal\",\n });\n return { success: false, error: \"Signal service not available\" };\n }\n\n const composedState: State = state ?? {\n values: {},\n data: {},\n text: \"\",\n };\n const prompt = composePromptFromState({\n state: composedState,\n template: sendReactionTemplate,\n });\n\n let reactionInfo: {\n emoji: string;\n targetTimestamp: number;\n targetAuthor: string;\n remove?: boolean;\n } | null = null;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsedResponse = parseJSONObjectFromText(response);\n if (\n parsedResponse?.emoji &&\n parsedResponse?.targetTimestamp &&\n parsedResponse?.targetAuthor\n ) {\n reactionInfo = {\n emoji: String(parsedResponse.emoji),\n targetTimestamp: Number(parsedResponse.targetTimestamp),\n targetAuthor: String(parsedResponse.targetAuthor),\n remove: Boolean(parsedResponse.remove),\n };\n break;\n }\n }\n\n if (!reactionInfo) {\n await callback?.({\n text: \"I couldn't understand the reaction request. Please specify the emoji and message to react to.\",\n source: \"signal\",\n });\n return { success: false, error: \"Could not extract reaction parameters\" };\n }\n\n const stateData = state?.data;\n const room = stateData?.room || (await runtime.getRoom(message.roomId));\n const recipient = room?.channelId || reactionInfo.targetAuthor;\n\n if (reactionInfo.remove) {\n await signalService.removeReaction(\n recipient,\n reactionInfo.emoji,\n reactionInfo.targetTimestamp,\n reactionInfo.targetAuthor,\n );\n } else {\n await signalService.sendReaction(\n recipient,\n reactionInfo.emoji,\n reactionInfo.targetTimestamp,\n reactionInfo.targetAuthor,\n );\n }\n\n const actionWord = reactionInfo.remove ? \"removed\" : \"added\";\n const response: Content = {\n text: `Reaction ${reactionInfo.emoji} ${actionWord} successfully.`,\n source: message.content.source,\n };\n\n await callback?.(response);\n\n return {\n success: true,\n data: {\n emoji: reactionInfo.emoji,\n targetTimestamp: reactionInfo.targetTimestamp,\n targetAuthor: reactionInfo.targetAuthor,\n action: actionWord,\n },\n };\n },\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: {\n text: \"React to the last message with a thumbs up\",\n },\n },\n {\n name: \"{{agent}}\",\n content: {\n text: \"I'll add a thumbs up reaction.\",\n actions: [\"SIGNAL_SEND_REACTION\"],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default sendReaction;\n",
|
|
11
|
+
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { SignalService } from \"../service\";\nimport { getSignalContactDisplayName, ServiceType } from \"../types\";\n\n/**\n * Provider for retrieving Signal conversation state information.\n */\nexport const conversationStateProvider: Provider = {\n name: \"signalConversationState\",\n description:\n \"Provides information about the current Signal conversation context\",\n get: async (runtime: IAgentRuntime, message: Memory, state: State) => {\n const room = state.data?.room ?? (await runtime.getRoom(message.roomId));\n if (!room) {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n // If message source is not signal, return empty\n if (message.content.source !== \"signal\") {\n return {\n data: {},\n values: {},\n text: \"\",\n };\n }\n\n const agentName = String(state?.agentName || \"The agent\");\n const senderName = String(state?.senderName || \"someone\");\n\n let responseText = \"\";\n let conversationType = \"\";\n let contactName = \"\";\n let groupName = \"\";\n const channelId = room.channelId ?? \"\";\n\n const signalService = runtime.getService(\n ServiceType.SIGNAL,\n ) as SignalService;\n if (!signalService || !signalService.isServiceConnected()) {\n return {\n data: {\n room,\n conversationType: \"unknown\",\n channelId,\n },\n values: {\n conversationType: \"unknown\",\n channelId,\n },\n text: \"\",\n };\n }\n\n const isGroup = room.metadata?.isGroup || false;\n\n if (isGroup) {\n conversationType = \"GROUP\";\n const groupId = room.metadata?.groupId as string;\n const group = signalService.getCachedGroup(groupId);\n groupName = group?.name || room.name || \"Unknown Group\";\n\n responseText = `${agentName} is currently in a Signal group chat: \"${groupName}\".`;\n responseText += `\\n${agentName} should be aware that multiple people can see this conversation and should participate when relevant.`;\n\n if (group?.description) {\n responseText += `\\nGroup description: ${group.description}`;\n }\n } else {\n conversationType = \"DM\";\n const contact = signalService.getContact(channelId);\n contactName = contact\n ? String(getSignalContactDisplayName(contact))\n : senderName;\n\n responseText = `${agentName} is currently in a direct message conversation with ${contactName} on Signal.`;\n responseText += `\\n${agentName} should engage naturally in conversation, responding to messages addressed to them.`;\n }\n\n responseText +=\n \"\\n\\nSignal is an encrypted messaging platform, so all messages are secure and private.\";\n\n return {\n data: {\n room,\n conversationType,\n contactName,\n groupName,\n channelId,\n isGroup,\n accountNumber: signalService.getAccountNumber(),\n },\n values: {\n conversationType,\n contactName,\n groupName,\n channelId,\n isGroup,\n },\n text: responseText,\n };\n },\n};\n\nexport default conversationStateProvider;\n",
|
|
12
|
+
"import {\n ChannelType,\n type Character,\n type Content,\n type ContentType,\n createUniqueUuid,\n type HandlerCallback,\n type IAgentRuntime,\n type Media,\n type Memory,\n type Room,\n Service,\n stringToUuid,\n type UUID,\n} from \"@elizaos/core\";\n\ntype MessageService = {\n handleMessage: (\n runtime: IAgentRuntime,\n message: Memory,\n callback: HandlerCallback,\n ) => Promise<void>;\n};\n\nconst getMessageService = (runtime: IAgentRuntime): MessageService | null => {\n if (\"messageService\" in runtime) {\n const withMessageService = runtime as IAgentRuntime & {\n messageService?: MessageService | null;\n };\n return withMessageService.messageService ?? null;\n }\n return null;\n};\n\nimport {\n getSignalContactDisplayName,\n type ISignalService,\n MAX_SIGNAL_MESSAGE_LENGTH,\n normalizeE164,\n SIGNAL_SERVICE_NAME,\n type SignalContact,\n SignalEventTypes,\n type SignalGroup,\n type SignalMessage,\n type SignalMessageSendOptions,\n type SignalSettings,\n} from \"./types\";\n\n/**\n * Signal API client for HTTP API mode\n */\nclass SignalApiClient {\n constructor(\n private baseUrl: string,\n private accountNumber: string,\n ) {}\n\n private async request<T>(\n method: string,\n endpoint: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const options: RequestInit = {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Signal API error: ${response.status} - ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : ({} as T);\n }\n\n async sendMessage(\n recipient: string,\n message: string,\n options?: SignalMessageSendOptions,\n ): Promise<{ timestamp: number }> {\n const body: Record<string, unknown> = {\n message,\n number: this.accountNumber,\n recipients: [recipient],\n };\n\n if (options?.attachments) {\n body.base64_attachments = options.attachments;\n }\n\n if (options?.quote) {\n body.quote_timestamp = options.quote.timestamp;\n body.quote_author = options.quote.author;\n }\n\n return this.request<{ timestamp: number }>(\"POST\", \"/v2/send\", body);\n }\n\n async sendGroupMessage(\n groupId: string,\n message: string,\n options?: SignalMessageSendOptions,\n ): Promise<{ timestamp: number }> {\n const body: Record<string, unknown> = {\n message,\n number: this.accountNumber,\n recipients: [`group.${groupId}`],\n };\n\n if (options?.attachments) {\n body.base64_attachments = options.attachments;\n }\n\n return this.request<{ timestamp: number }>(\"POST\", \"/v2/send\", body);\n }\n\n async sendReaction(\n recipient: string,\n emoji: string,\n targetTimestamp: number,\n targetAuthor: string,\n remove = false,\n ): Promise<void> {\n await this.request(\"POST\", `/v1/reactions/${this.accountNumber}`, {\n recipient,\n reaction: emoji,\n target_author: targetAuthor,\n timestamp: targetTimestamp,\n remove,\n });\n }\n\n async getContacts(): Promise<SignalContact[]> {\n const result = await this.request<{ contacts: SignalContact[] }>(\n \"GET\",\n `/v1/contacts/${this.accountNumber}`,\n );\n return result.contacts || [];\n }\n\n async getGroups(): Promise<SignalGroup[]> {\n const result = await this.request<SignalGroup[]>(\n \"GET\",\n `/v1/groups/${this.accountNumber}`,\n );\n return result || [];\n }\n\n async getGroup(groupId: string): Promise<SignalGroup | null> {\n const groups = await this.getGroups();\n return groups.find((g) => g.id === groupId) || null;\n }\n\n async receive(): Promise<SignalMessage[]> {\n const result = await this.request<SignalMessage[]>(\n \"GET\",\n `/v1/receive/${this.accountNumber}`,\n );\n return result || [];\n }\n\n async sendTyping(recipient: string, stop = false): Promise<void> {\n await this.request(\"PUT\", `/v1/typing-indicator/${this.accountNumber}`, {\n recipient,\n stop,\n });\n }\n\n async setProfile(name: string, about?: string): Promise<void> {\n await this.request(\"PUT\", `/v1/profiles/${this.accountNumber}`, {\n name,\n about: about || \"\",\n });\n }\n\n async getIdentities(): Promise<\n Array<{ number: string; safety_number: string; trust_level: string }>\n > {\n const result = await this.request<\n Array<{ number: string; safety_number: string; trust_level: string }>\n >(\"GET\", `/v1/identities/${this.accountNumber}`);\n return result || [];\n }\n\n async trustIdentity(\n number: string,\n trustLevel: \"TRUSTED_VERIFIED\" | \"TRUSTED_UNVERIFIED\" | \"UNTRUSTED\",\n ): Promise<void> {\n await this.request(\n \"PUT\",\n `/v1/identities/${this.accountNumber}/trust/${number}`,\n {\n trust_level: trustLevel,\n },\n );\n }\n}\n\n/**\n * SignalService class for interacting with Signal via HTTP API or CLI\n */\nexport class SignalService extends Service implements ISignalService {\n static serviceType: string = SIGNAL_SERVICE_NAME;\n capabilityDescription =\n \"The agent is able to send and receive messages on Signal\";\n\n async stop(): Promise<void> {\n await this.shutdown();\n }\n\n character: Character;\n accountNumber: string | null = null;\n isConnected = false;\n\n private client: SignalApiClient | null = null;\n private settings: SignalSettings;\n private contactCache: Map<string, SignalContact> = new Map();\n private groupCache: Map<string, SignalGroup> = new Map();\n private pollInterval: NodeJS.Timeout | null = null;\n private isPolling = false;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n if (runtime) {\n this.character = runtime.character;\n this.settings = this.loadSettings();\n } else {\n this.character = {} as Character;\n this.settings = {\n shouldIgnoreGroupMessages: false,\n allowedGroups: undefined,\n blockedNumbers: undefined,\n };\n }\n }\n\n private loadSettings(): SignalSettings {\n const ignoreGroups = this.runtime.getSetting(\n \"SIGNAL_SHOULD_IGNORE_GROUP_MESSAGES\",\n );\n\n return {\n shouldIgnoreGroupMessages:\n ignoreGroups === \"true\" || ignoreGroups === true,\n allowedGroups: undefined,\n blockedNumbers: undefined,\n };\n }\n\n static async start(runtime: IAgentRuntime): Promise<SignalService> {\n const service = new SignalService(runtime);\n\n const accountNumber = runtime.getSetting(\"SIGNAL_ACCOUNT_NUMBER\") as string;\n const httpUrl = runtime.getSetting(\"SIGNAL_HTTP_URL\") as string;\n\n if (!accountNumber) {\n runtime.logger.warn(\n { src: \"plugin:signal\", agentId: runtime.agentId },\n \"SIGNAL_ACCOUNT_NUMBER not provided, Signal service will not start\",\n );\n return service;\n }\n\n const normalizedNumber = normalizeE164(accountNumber);\n if (!normalizedNumber) {\n runtime.logger.error(\n { src: \"plugin:signal\", agentId: runtime.agentId, accountNumber },\n \"Invalid SIGNAL_ACCOUNT_NUMBER format\",\n );\n return service;\n }\n\n service.accountNumber = normalizedNumber;\n\n if (httpUrl) {\n service.client = new SignalApiClient(httpUrl, normalizedNumber);\n await service.initialize();\n } else {\n runtime.logger.warn(\n { src: \"plugin:signal\", agentId: runtime.agentId },\n \"SIGNAL_HTTP_URL not provided, Signal service will not be able to communicate\",\n );\n }\n\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(SIGNAL_SERVICE_NAME) as\n | SignalService\n | undefined;\n if (service) {\n await service.shutdown();\n }\n }\n\n private async initialize(): Promise<void> {\n if (!this.client) return;\n\n this.runtime.logger.info(\n {\n src: \"plugin:signal\",\n agentId: this.runtime.agentId,\n accountNumber: this.accountNumber,\n },\n \"Initializing Signal service\",\n );\n\n // Test connection by getting contacts\n const contacts = await this.client.getContacts();\n this.runtime.logger.info(\n {\n src: \"plugin:signal\",\n agentId: this.runtime.agentId,\n contactCount: contacts.length,\n },\n \"Signal service connected\",\n );\n\n // Cache contacts\n for (const contact of contacts) {\n this.contactCache.set(contact.number, contact);\n }\n\n // Cache groups\n const groups = await this.client.getGroups();\n for (const group of groups) {\n this.groupCache.set(group.id, group);\n }\n\n this.isConnected = true;\n\n // Start polling for messages\n this.startPolling();\n }\n\n private async shutdown(): Promise<void> {\n this.stopPolling();\n this.client = null;\n this.isConnected = false;\n\n this.runtime.logger.info(\n { src: \"plugin:signal\", agentId: this.runtime.agentId },\n \"Signal service stopped\",\n );\n }\n\n private startPolling(): void {\n if (this.pollInterval) return;\n\n this.pollInterval = setInterval(async () => {\n await this.pollMessages();\n }, 2000); // Poll every 2 seconds\n }\n\n private stopPolling(): void {\n if (this.pollInterval) {\n clearInterval(this.pollInterval);\n this.pollInterval = null;\n }\n }\n\n private async pollMessages(): Promise<void> {\n if (!this.client || this.isPolling) return;\n\n this.isPolling = true;\n\n const messages = await this.client.receive();\n\n for (const msg of messages) {\n await this.handleIncomingMessage(msg);\n }\n\n this.isPolling = false;\n }\n\n private async handleIncomingMessage(msg: SignalMessage): Promise<void> {\n // Handle reactions separately\n if (msg.reaction) {\n await this.handleReaction(msg);\n return;\n }\n\n // Skip if no message content\n if (!msg.message && msg.attachments.length === 0) {\n return;\n }\n\n const isGroupMessage = Boolean(msg.groupId);\n\n // Check if we should ignore group messages\n if (isGroupMessage && this.settings.shouldIgnoreGroupMessages) {\n return;\n }\n\n // Build memory from message\n const memory = await this.buildMemoryFromMessage(msg);\n if (!memory) return;\n\n // Get or create room\n const room = await this.ensureRoomExists(msg.sender, msg.groupId);\n\n // Store the memory\n await this.runtime.createMemory(memory, \"messages\");\n\n // Emit event\n await this.runtime.emitEvent(SignalEventTypes.MESSAGE_RECEIVED as string, {\n runtime: this.runtime,\n source: \"signal\",\n });\n\n // Process the message through the agent\n await this.processMessage(memory, room, msg.sender, msg.groupId);\n }\n\n private async handleReaction(msg: SignalMessage): Promise<void> {\n if (!msg.reaction) return;\n\n await this.runtime.emitEvent(SignalEventTypes.REACTION_RECEIVED as string, {\n runtime: this.runtime,\n source: \"signal\",\n });\n }\n\n private async processMessage(\n memory: Memory,\n room: Room,\n sender: string,\n groupId?: string,\n ): Promise<void> {\n const callback: HandlerCallback = async (\n response: Content,\n ): Promise<Memory[]> => {\n if (groupId) {\n await this.sendGroupMessage(groupId, response.text || \"\");\n } else {\n await this.sendMessage(sender, response.text || \"\");\n }\n\n // Create memory for the response\n const responseMemory: Memory = {\n id: createUniqueUuid(this.runtime, `signal-response-${Date.now()}`),\n agentId: this.runtime.agentId,\n roomId: room.id,\n entityId: this.runtime.agentId,\n content: {\n text: response.text || \"\",\n source: \"signal\",\n inReplyTo: memory.id,\n },\n createdAt: Date.now(),\n };\n\n await this.runtime.createMemory(responseMemory, \"messages\");\n\n await this.runtime.emitEvent(SignalEventTypes.MESSAGE_SENT as string, {\n runtime: this.runtime,\n source: \"signal\",\n });\n\n return [responseMemory];\n };\n\n const messageService = getMessageService(this.runtime);\n if (messageService) {\n await messageService.handleMessage(this.runtime, memory, callback);\n }\n }\n\n private async buildMemoryFromMessage(\n msg: SignalMessage,\n ): Promise<Memory | null> {\n const roomId = await this.getRoomId(msg.sender, msg.groupId);\n const entityId = this.getEntityId(msg.sender);\n\n // Get contact info for display name\n const contact = this.contactCache.get(msg.sender);\n const displayName = contact\n ? getSignalContactDisplayName(contact)\n : msg.sender;\n\n // Extract media from attachments\n const media: Media[] = msg.attachments.map((att) => ({\n id: att.id,\n url: `signal://attachment/${att.id}`,\n title: att.filename || att.id,\n source: \"signal\",\n description: att.caption || att.filename,\n contentType: att.contentType as ContentType | undefined,\n }));\n\n const memory: Memory = {\n id: createUniqueUuid(this.runtime, `signal-${msg.timestamp}`),\n agentId: this.runtime.agentId,\n roomId,\n entityId,\n content: {\n text: msg.message || \"\",\n source: \"signal\",\n name: displayName,\n ...(media.length > 0 ? { attachments: media } : {}),\n },\n createdAt: msg.timestamp,\n };\n\n return memory;\n }\n\n private async getRoomId(sender: string, groupId?: string): Promise<UUID> {\n const roomKey = groupId || sender;\n return createUniqueUuid(this.runtime, `signal-room-${roomKey}`);\n }\n\n private getEntityId(number: string): UUID {\n return stringToUuid(`signal-user-${number}`);\n }\n\n private async ensureRoomExists(\n sender: string,\n groupId?: string,\n ): Promise<Room> {\n const roomId = await this.getRoomId(sender, groupId);\n\n const existingRoom = await this.runtime.getRoom(roomId);\n if (existingRoom) return existingRoom;\n\n const isGroup = Boolean(groupId);\n const group = groupId ? this.groupCache.get(groupId) : null;\n const contact = this.contactCache.get(sender);\n\n const room: Room = {\n id: roomId,\n name: isGroup\n ? group?.name || `Signal Group ${groupId}`\n : contact\n ? getSignalContactDisplayName(contact)\n : sender,\n agentId: this.runtime.agentId,\n source: \"signal\",\n type: isGroup ? ChannelType.GROUP : ChannelType.DM,\n channelId: groupId || sender,\n metadata: {\n isGroup,\n groupId,\n sender,\n groupName: group?.name,\n groupDescription: group?.description,\n },\n };\n\n await this.runtime.createRoom(room);\n\n return room;\n }\n\n async sendMessage(\n recipient: string,\n text: string,\n options?: SignalMessageSendOptions,\n ): Promise<{ timestamp: number }> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n // Normalize recipient number\n const normalizedRecipient = normalizeE164(recipient);\n if (!normalizedRecipient) {\n throw new Error(`Invalid recipient number: ${recipient}`);\n }\n\n // Split message if too long\n const messages = this.splitMessage(text);\n let lastTimestamp = 0;\n\n for (const msg of messages) {\n const result = await this.client.sendMessage(\n normalizedRecipient,\n msg,\n options,\n );\n lastTimestamp = result.timestamp;\n }\n\n return { timestamp: lastTimestamp };\n }\n\n async sendGroupMessage(\n groupId: string,\n text: string,\n options?: SignalMessageSendOptions,\n ): Promise<{ timestamp: number }> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n // Split message if too long\n const messages = this.splitMessage(text);\n let lastTimestamp = 0;\n\n for (const msg of messages) {\n const result = await this.client.sendGroupMessage(groupId, msg, options);\n lastTimestamp = result.timestamp;\n }\n\n return { timestamp: lastTimestamp };\n }\n\n async sendReaction(\n recipient: string,\n emoji: string,\n targetTimestamp: number,\n targetAuthor: string,\n ): Promise<void> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n await this.client.sendReaction(\n recipient,\n emoji,\n targetTimestamp,\n targetAuthor,\n );\n }\n\n async removeReaction(\n recipient: string,\n emoji: string,\n targetTimestamp: number,\n targetAuthor: string,\n ): Promise<void> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n await this.client.sendReaction(\n recipient,\n emoji,\n targetTimestamp,\n targetAuthor,\n true,\n );\n }\n\n async getContacts(): Promise<SignalContact[]> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n const contacts = await this.client.getContacts();\n\n // Update cache\n for (const contact of contacts) {\n this.contactCache.set(contact.number, contact);\n }\n\n return contacts;\n }\n\n async getGroups(): Promise<SignalGroup[]> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n const groups = await this.client.getGroups();\n\n // Update cache\n for (const group of groups) {\n this.groupCache.set(group.id, group);\n }\n\n return groups;\n }\n\n async getGroup(groupId: string): Promise<SignalGroup | null> {\n if (!this.client) {\n throw new Error(\"Signal client not initialized\");\n }\n\n const group = await this.client.getGroup(groupId);\n if (group) {\n this.groupCache.set(group.id, group);\n }\n\n return group;\n }\n\n async sendTypingIndicator(recipient: string): Promise<void> {\n if (!this.client) return;\n await this.client.sendTyping(recipient);\n }\n\n async stopTypingIndicator(recipient: string): Promise<void> {\n if (!this.client) return;\n await this.client.sendTyping(recipient, true);\n }\n\n private splitMessage(text: string): string[] {\n if (text.length <= MAX_SIGNAL_MESSAGE_LENGTH) {\n return [text];\n }\n\n const messages: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= MAX_SIGNAL_MESSAGE_LENGTH) {\n messages.push(remaining);\n break;\n }\n\n let splitIndex = MAX_SIGNAL_MESSAGE_LENGTH;\n\n const lastNewline = remaining.lastIndexOf(\n \"\\n\",\n MAX_SIGNAL_MESSAGE_LENGTH,\n );\n if (lastNewline > MAX_SIGNAL_MESSAGE_LENGTH / 2) {\n splitIndex = lastNewline + 1;\n } else {\n const lastSpace = remaining.lastIndexOf(\" \", MAX_SIGNAL_MESSAGE_LENGTH);\n if (lastSpace > MAX_SIGNAL_MESSAGE_LENGTH / 2) {\n splitIndex = lastSpace + 1;\n }\n }\n\n messages.push(remaining.slice(0, splitIndex));\n remaining = remaining.slice(splitIndex);\n }\n\n return messages;\n }\n\n getContact(number: string): SignalContact | null {\n return this.contactCache.get(number) || null;\n }\n\n getCachedGroup(groupId: string): SignalGroup | null {\n return this.groupCache.get(groupId) || null;\n }\n\n getAccountNumber(): string | null {\n return this.accountNumber;\n }\n\n isServiceConnected(): boolean {\n return this.isConnected;\n }\n}\n",
|
|
13
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\n\n/**\n * Default account identifier used when no specific account is configured\n */\nexport const DEFAULT_ACCOUNT_ID = \"default\";\n\n/**\n * DM-specific configuration\n */\nexport interface SignalDmConfig {\n /** If false, ignore all incoming Signal DMs */\n enabled?: boolean;\n /** Direct message access policy */\n policy?: \"open\" | \"disabled\" | \"allowlist\" | \"pairing\";\n /** Allowlist for DM senders (phone numbers or UUIDs) */\n allowFrom?: Array<string | number>;\n}\n\n/**\n * Group-specific configuration\n */\nexport interface SignalGroupConfig {\n /** If false, ignore all group messages */\n enabled?: boolean;\n /** Group message access policy */\n policy?: \"open\" | \"disabled\" | \"allowlist\";\n /** Require bot mention to respond in groups */\n requireMention?: boolean;\n /** Allowlist for groups (IDs or names) */\n allowFrom?: Array<string | number>;\n}\n\n/**\n * Reaction notification mode\n */\nexport type SignalReactionNotificationMode =\n | \"off\"\n | \"own\"\n | \"all\"\n | \"allowlist\";\n\n/**\n * Configuration for a single Signal account\n */\nexport interface SignalAccountConfig {\n /** Optional display name for this account */\n name?: string;\n /** If false, do not start this Signal account */\n enabled?: boolean;\n /** Signal account phone number in E.164 format */\n account?: string;\n /** Signal CLI HTTP server URL */\n httpUrl?: string;\n /** Signal CLI HTTP server host */\n httpHost?: string;\n /** Signal CLI HTTP server port */\n httpPort?: number;\n /** Path to signal-cli binary */\n cliPath?: string;\n /** Auto-start signal-cli daemon if not running */\n autoStart?: boolean;\n /** Outbound text chunk size (chars) */\n textChunkLimit?: number;\n /** History limit for context */\n historyLimit?: number;\n /** Reaction notification mode */\n reactionNotifications?: SignalReactionNotificationMode;\n /** Reaction allowlist when mode is 'allowlist' */\n reactionAllowlist?: Array<string | number>;\n /** DM configuration */\n dm?: SignalDmConfig;\n /** Group configuration */\n group?: SignalGroupConfig;\n /** Whether to ignore group messages */\n shouldIgnoreGroupMessages?: boolean;\n /** Allowed groups */\n allowedGroups?: string[];\n /** Blocked numbers */\n blockedNumbers?: string[];\n}\n\n/**\n * Multi-account Signal configuration structure\n */\nexport interface SignalMultiAccountConfig {\n /** Default/base configuration applied to all accounts */\n enabled?: boolean;\n account?: string;\n httpUrl?: string;\n /** Per-account configuration overrides */\n accounts?: Record<string, SignalAccountConfig>;\n}\n\n/**\n * Resolved Signal account with all configuration merged\n */\nexport interface ResolvedSignalAccount {\n accountId: string;\n enabled: boolean;\n name?: string;\n account?: string;\n baseUrl: string;\n configured: boolean;\n config: SignalAccountConfig;\n}\n\n/**\n * Normalizes an account ID, returning the default if not provided\n */\nexport function normalizeAccountId(accountId?: string | null): string {\n if (!accountId || typeof accountId !== \"string\") {\n return DEFAULT_ACCOUNT_ID;\n }\n const trimmed = accountId.trim().toLowerCase();\n return trimmed || DEFAULT_ACCOUNT_ID;\n}\n\n/**\n * Gets the multi-account configuration from runtime settings\n */\nexport function getMultiAccountConfig(\n runtime: IAgentRuntime,\n): SignalMultiAccountConfig {\n const characterSignal = runtime.character?.settings?.signal as\n | SignalMultiAccountConfig\n | undefined;\n\n return {\n enabled: characterSignal?.enabled,\n account: characterSignal?.account,\n httpUrl: characterSignal?.httpUrl,\n accounts: characterSignal?.accounts,\n };\n}\n\n/**\n * Lists all configured account IDs\n */\nexport function listSignalAccountIds(runtime: IAgentRuntime): string[] {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n\n if (!accounts || typeof accounts !== \"object\") {\n return [DEFAULT_ACCOUNT_ID];\n }\n\n const ids = Object.keys(accounts).filter(Boolean);\n if (ids.length === 0) {\n return [DEFAULT_ACCOUNT_ID];\n }\n\n return ids.toSorted((a: string, b: string) => a.localeCompare(b));\n}\n\n/**\n * Resolves the default account ID to use\n */\nexport function resolveDefaultSignalAccountId(runtime: IAgentRuntime): string {\n const ids = listSignalAccountIds(runtime);\n if (ids.includes(DEFAULT_ACCOUNT_ID)) {\n return DEFAULT_ACCOUNT_ID;\n }\n return ids[0] ?? DEFAULT_ACCOUNT_ID;\n}\n\n/**\n * Gets the account-specific configuration\n */\nfunction getAccountConfig(\n runtime: IAgentRuntime,\n accountId: string,\n): SignalAccountConfig | undefined {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n\n if (!accounts || typeof accounts !== \"object\") {\n return undefined;\n }\n\n return accounts[accountId];\n}\n\n/**\n * Removes undefined values from an object to prevent them from overwriting during spread\n */\nfunction filterDefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\n/**\n * Merges base configuration with account-specific overrides\n */\nfunction mergeSignalAccountConfig(\n runtime: IAgentRuntime,\n accountId: string,\n): SignalAccountConfig {\n const multiConfig = getMultiAccountConfig(runtime);\n const { accounts: _ignored, ...baseConfig } = multiConfig;\n const accountConfig = getAccountConfig(runtime, accountId) ?? {};\n\n // Get environment/runtime settings for the base config\n const envAccount = runtime.getSetting(\"SIGNAL_ACCOUNT_NUMBER\") as\n | string\n | undefined;\n const envHttpUrl = runtime.getSetting(\"SIGNAL_HTTP_URL\") as\n | string\n | undefined;\n const envCliPath = runtime.getSetting(\"SIGNAL_CLI_PATH\") as\n | string\n | undefined;\n const envIgnoreGroups = runtime.getSetting(\n \"SIGNAL_SHOULD_IGNORE_GROUP_MESSAGES\",\n ) as string | undefined;\n\n const envConfig: SignalAccountConfig = {\n account: envAccount || undefined,\n httpUrl: envHttpUrl || undefined,\n cliPath: envCliPath || undefined,\n shouldIgnoreGroupMessages: envIgnoreGroups?.toLowerCase() === \"true\",\n };\n\n // Merge order: env defaults < base config < account config\n // Filter undefined values to prevent them from overwriting defined values\n return {\n ...filterDefined(envConfig),\n ...filterDefined(baseConfig),\n ...filterDefined(accountConfig),\n };\n}\n\n/**\n * Resolves the base URL for Signal CLI HTTP server\n */\nfunction resolveBaseUrl(config: SignalAccountConfig): string {\n if (config.httpUrl?.trim()) {\n return config.httpUrl.trim().replace(/\\/+$/, \"\");\n }\n const host = config.httpHost?.trim() || \"127.0.0.1\";\n const port = config.httpPort ?? 8080;\n return `http://${host}:${port}`;\n}\n\n/**\n * Resolves a complete Signal account configuration\n */\nexport function resolveSignalAccount(\n runtime: IAgentRuntime,\n accountId?: string | null,\n): ResolvedSignalAccount {\n const normalizedAccountId = normalizeAccountId(accountId);\n const multiConfig = getMultiAccountConfig(runtime);\n\n const baseEnabled = multiConfig.enabled !== false;\n const merged = mergeSignalAccountConfig(runtime, normalizedAccountId);\n const accountEnabled = merged.enabled !== false;\n const enabled = baseEnabled && accountEnabled;\n\n const baseUrl = resolveBaseUrl(merged);\n\n // Determine if this account is actually configured\n const configured = Boolean(\n merged.account?.trim() ||\n merged.httpUrl?.trim() ||\n merged.cliPath?.trim() ||\n merged.httpHost?.trim() ||\n typeof merged.httpPort === \"number\" ||\n typeof merged.autoStart === \"boolean\",\n );\n\n return {\n accountId: normalizedAccountId,\n enabled,\n name: merged.name?.trim() || undefined,\n account: merged.account?.trim(),\n baseUrl,\n configured,\n config: merged,\n };\n}\n\n/**\n * Lists all enabled Signal accounts\n */\nexport function listEnabledSignalAccounts(\n runtime: IAgentRuntime,\n): ResolvedSignalAccount[] {\n return listSignalAccountIds(runtime)\n .map((accountId) => resolveSignalAccount(runtime, accountId))\n .filter((account) => account.enabled && account.configured);\n}\n\n/**\n * Checks if multi-account mode is enabled\n */\nexport function isMultiAccountEnabled(runtime: IAgentRuntime): boolean {\n const accounts = listEnabledSignalAccounts(runtime);\n return accounts.length > 1;\n}\n",
|
|
14
|
+
"/**\n * Options for Signal RPC requests\n */\nexport interface SignalRpcOptions {\n baseUrl: string;\n timeoutMs?: number;\n}\n\n/**\n * Signal RPC error structure\n */\nexport interface SignalRpcError {\n code?: number;\n message?: string;\n data?: unknown;\n}\n\n/**\n * Signal RPC response structure\n */\nexport interface SignalRpcResponse<T> {\n jsonrpc?: string;\n result?: T;\n error?: SignalRpcError;\n id?: string | number | null;\n}\n\n/**\n * Signal SSE event structure\n */\nexport interface SignalSseEvent {\n event?: string;\n data?: string;\n id?: string;\n}\n\n/**\n * Result of a Signal health check\n */\nexport interface SignalCheckResult {\n ok: boolean;\n status?: number | null;\n error?: string | null;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/**\n * Normalizes a base URL for Signal CLI HTTP server\n */\nexport function normalizeBaseUrl(url: string): string {\n const trimmed = url.trim();\n if (!trimmed) {\n throw new Error(\"Signal base URL is required\");\n }\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed.replace(/\\/+$/, \"\");\n }\n return `http://${trimmed}`.replace(/\\/+$/, \"\");\n}\n\n/**\n * Generates a UUID for RPC request IDs\n */\nfunction generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Fetches with a timeout\n */\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Makes a JSON-RPC request to the Signal CLI HTTP server\n */\nexport async function signalRpcRequest<T = unknown>(\n method: string,\n params: Record<string, unknown> | undefined,\n opts: SignalRpcOptions,\n): Promise<T> {\n const baseUrl = normalizeBaseUrl(opts.baseUrl);\n const id = generateId();\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method,\n params,\n id,\n });\n\n const res = await fetchWithTimeout(\n `${baseUrl}/api/v1/rpc`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n },\n opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n\n // 201 indicates success with no response body\n if (res.status === 201) {\n return undefined as T;\n }\n\n const text = await res.text();\n if (!text) {\n throw new Error(`Signal RPC empty response (status ${res.status})`);\n }\n\n const parsed = JSON.parse(text) as SignalRpcResponse<T>;\n if (parsed.error) {\n const code = parsed.error.code ?? \"unknown\";\n const msg = parsed.error.message ?? \"Signal RPC error\";\n throw new Error(`Signal RPC ${code}: ${msg}`);\n }\n\n return parsed.result as T;\n}\n\n/**\n * Checks if the Signal CLI HTTP server is available\n */\nexport async function signalCheck(\n baseUrl: string,\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n): Promise<SignalCheckResult> {\n const normalized = normalizeBaseUrl(baseUrl);\n try {\n const res = await fetchWithTimeout(\n `${normalized}/api/v1/check`,\n { method: \"GET\" },\n timeoutMs,\n );\n if (!res.ok) {\n return { ok: false, status: res.status, error: `HTTP ${res.status}` };\n }\n return { ok: true, status: res.status, error: null };\n } catch (err) {\n return {\n ok: false,\n status: null,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Gets the current Signal version from the CLI\n */\nexport async function signalGetVersion(\n opts: SignalRpcOptions,\n): Promise<string> {\n return signalRpcRequest<string>(\"version\", undefined, opts);\n}\n\n/**\n * Lists all registered Signal accounts\n */\nexport async function signalListAccounts(\n opts: SignalRpcOptions,\n): Promise<Array<{ number: string; uuid: string }>> {\n return signalRpcRequest<Array<{ number: string; uuid: string }>>(\n \"listAccounts\",\n undefined,\n opts,\n );\n}\n\n/**\n * Gets contacts for a Signal account\n */\nexport async function signalListContacts(\n account: string,\n opts: SignalRpcOptions,\n): Promise<\n Array<{\n number: string;\n uuid: string;\n name?: string;\n profileName?: string;\n blocked?: boolean;\n }>\n> {\n return signalRpcRequest(\"listContacts\", { account }, opts);\n}\n\n/**\n * Gets groups for a Signal account\n */\nexport async function signalListGroups(\n account: string,\n opts: SignalRpcOptions,\n): Promise<\n Array<{\n id: string;\n name: string;\n description?: string;\n isMember: boolean;\n isBlocked: boolean;\n members: Array<{ uuid: string; number?: string }>;\n }>\n> {\n return signalRpcRequest(\"listGroups\", { account }, opts);\n}\n\n/**\n * Sends a message to a recipient or group\n */\nexport async function signalSend(\n params: {\n account: string;\n recipients?: string[];\n groupId?: string;\n message?: string;\n attachments?: string[];\n quote?: { timestamp: number; author: string };\n },\n opts: SignalRpcOptions,\n): Promise<{ timestamp: number }> {\n return signalRpcRequest(\"send\", params, opts);\n}\n\n/**\n * Sends a reaction to a message\n */\nexport async function signalSendReaction(\n params: {\n account: string;\n recipient?: string;\n groupId?: string;\n emoji: string;\n targetAuthor: string;\n targetTimestamp: number;\n remove?: boolean;\n },\n opts: SignalRpcOptions,\n): Promise<void> {\n return signalRpcRequest(\"sendReaction\", params, opts);\n}\n\n/**\n * Sends a typing indicator\n */\nexport async function signalSendTyping(\n params: {\n account: string;\n recipient?: string;\n groupId?: string;\n stop?: boolean;\n },\n opts: SignalRpcOptions,\n): Promise<void> {\n return signalRpcRequest(\"sendTyping\", params, opts);\n}\n\n/**\n * Sends a read receipt\n */\nexport async function signalSendReadReceipt(\n params: {\n account: string;\n recipient: string;\n targetTimestamp: number;\n },\n opts: SignalRpcOptions,\n): Promise<void> {\n return signalRpcRequest(\"sendReadReceipt\", params, opts);\n}\n\n/**\n * Streams SSE events from the Signal CLI HTTP server\n */\nexport async function streamSignalEvents(params: {\n baseUrl: string;\n account?: string;\n abortSignal?: AbortSignal;\n onEvent: (event: SignalSseEvent) => void;\n}): Promise<void> {\n const baseUrl = normalizeBaseUrl(params.baseUrl);\n const url = new URL(`${baseUrl}/api/v1/events`);\n if (params.account) {\n url.searchParams.set(\"account\", params.account);\n }\n\n const res = await fetch(url, {\n method: \"GET\",\n headers: { Accept: \"text/event-stream\" },\n signal: params.abortSignal,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(\n `Signal SSE failed (${res.status} ${res.statusText || \"error\"})`,\n );\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent: SignalSseEvent = {};\n\n const flushEvent = () => {\n if (!currentEvent.data && !currentEvent.event && !currentEvent.id) {\n return;\n }\n params.onEvent({\n event: currentEvent.event,\n data: currentEvent.data,\n id: currentEvent.id,\n });\n currentEvent = {};\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n let lineEnd = buffer.indexOf(\"\\n\");\n\n while (lineEnd !== -1) {\n let line = buffer.slice(0, lineEnd);\n buffer = buffer.slice(lineEnd + 1);\n if (line.endsWith(\"\\r\")) {\n line = line.slice(0, -1);\n }\n\n // Empty line means end of event\n if (line === \"\") {\n flushEvent();\n lineEnd = buffer.indexOf(\"\\n\");\n continue;\n }\n\n // Comment line\n if (line.startsWith(\":\")) {\n lineEnd = buffer.indexOf(\"\\n\");\n continue;\n }\n\n // Parse field: value\n const colonIndex = line.indexOf(\":\");\n if (colonIndex === -1) {\n lineEnd = buffer.indexOf(\"\\n\");\n continue;\n }\n\n const field = line.slice(0, colonIndex).trim();\n let value = line.slice(colonIndex + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n\n if (field === \"event\") {\n currentEvent.event = value;\n } else if (field === \"data\") {\n currentEvent.data = currentEvent.data\n ? `${currentEvent.data}\\n${value}`\n : value;\n } else if (field === \"id\") {\n currentEvent.id = value;\n }\n\n lineEnd = buffer.indexOf(\"\\n\");\n }\n }\n\n // Flush any remaining event\n flushEvent();\n}\n\n/**\n * Parses an SSE data field as JSON\n */\nexport function parseSignalEventData<T>(data: string | undefined): T | null {\n if (!data) {\n return null;\n }\n try {\n return JSON.parse(data) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Creates an SSE event handler with reconnection logic\n */\nexport function createSignalEventStream(params: {\n baseUrl: string;\n account?: string;\n onEvent: (event: SignalSseEvent) => void;\n onError?: (error: Error) => void;\n onConnect?: () => void;\n onDisconnect?: () => void;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n}): {\n start: () => void;\n stop: () => void;\n isRunning: () => boolean;\n} {\n let abortController: AbortController | null = null;\n let running = false;\n let reconnectDelay = params.reconnectDelayMs ?? 1000;\n const maxDelay = params.maxReconnectDelayMs ?? 30000;\n\n const connect = async () => {\n if (!running) {\n return;\n }\n\n abortController = new AbortController();\n\n try {\n params.onConnect?.();\n reconnectDelay = params.reconnectDelayMs ?? 1000;\n\n await streamSignalEvents({\n baseUrl: params.baseUrl,\n account: params.account,\n abortSignal: abortController.signal,\n onEvent: params.onEvent,\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return;\n }\n params.onError?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n } finally {\n params.onDisconnect?.();\n }\n\n // Reconnect with exponential backoff\n if (running) {\n setTimeout(connect, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, maxDelay);\n }\n };\n\n return {\n start: () => {\n if (running) {\n return;\n }\n running = true;\n connect();\n },\n stop: () => {\n running = false;\n abortController?.abort();\n abortController = null;\n },\n isRunning: () => running,\n };\n}\n"
|
|
15
|
+
],
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "35D8D7AB25F728BD64756E2164756E21",
|
|
18
|
+
"names": []
|
|
19
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Provider } from "@elizaos/core";
|
|
2
|
+
/**
|
|
3
|
+
* Provider for retrieving Signal conversation state information.
|
|
4
|
+
*/
|
|
5
|
+
export declare const conversationStateProvider: Provider;
|
|
6
|
+
export default conversationStateProvider;
|
|
7
|
+
//# sourceMappingURL=conversationState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversationState.d.ts","sourceRoot":"","sources":["../../src/providers/conversationState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyB,QAAQ,EAAS,MAAM,eAAe,CAAC;AAK5E;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,QA4FvC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for Signal RPC requests
|
|
3
|
+
*/
|
|
4
|
+
export interface SignalRpcOptions {
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Signal RPC error structure
|
|
10
|
+
*/
|
|
11
|
+
export interface SignalRpcError {
|
|
12
|
+
code?: number;
|
|
13
|
+
message?: string;
|
|
14
|
+
data?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Signal RPC response structure
|
|
18
|
+
*/
|
|
19
|
+
export interface SignalRpcResponse<T> {
|
|
20
|
+
jsonrpc?: string;
|
|
21
|
+
result?: T;
|
|
22
|
+
error?: SignalRpcError;
|
|
23
|
+
id?: string | number | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Signal SSE event structure
|
|
27
|
+
*/
|
|
28
|
+
export interface SignalSseEvent {
|
|
29
|
+
event?: string;
|
|
30
|
+
data?: string;
|
|
31
|
+
id?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result of a Signal health check
|
|
35
|
+
*/
|
|
36
|
+
export interface SignalCheckResult {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
status?: number | null;
|
|
39
|
+
error?: string | null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Normalizes a base URL for Signal CLI HTTP server
|
|
43
|
+
*/
|
|
44
|
+
export declare function normalizeBaseUrl(url: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Makes a JSON-RPC request to the Signal CLI HTTP server
|
|
47
|
+
*/
|
|
48
|
+
export declare function signalRpcRequest<T = unknown>(method: string, params: Record<string, unknown> | undefined, opts: SignalRpcOptions): Promise<T>;
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the Signal CLI HTTP server is available
|
|
51
|
+
*/
|
|
52
|
+
export declare function signalCheck(baseUrl: string, timeoutMs?: number): Promise<SignalCheckResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Gets the current Signal version from the CLI
|
|
55
|
+
*/
|
|
56
|
+
export declare function signalGetVersion(opts: SignalRpcOptions): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* Lists all registered Signal accounts
|
|
59
|
+
*/
|
|
60
|
+
export declare function signalListAccounts(opts: SignalRpcOptions): Promise<Array<{
|
|
61
|
+
number: string;
|
|
62
|
+
uuid: string;
|
|
63
|
+
}>>;
|
|
64
|
+
/**
|
|
65
|
+
* Gets contacts for a Signal account
|
|
66
|
+
*/
|
|
67
|
+
export declare function signalListContacts(account: string, opts: SignalRpcOptions): Promise<Array<{
|
|
68
|
+
number: string;
|
|
69
|
+
uuid: string;
|
|
70
|
+
name?: string;
|
|
71
|
+
profileName?: string;
|
|
72
|
+
blocked?: boolean;
|
|
73
|
+
}>>;
|
|
74
|
+
/**
|
|
75
|
+
* Gets groups for a Signal account
|
|
76
|
+
*/
|
|
77
|
+
export declare function signalListGroups(account: string, opts: SignalRpcOptions): Promise<Array<{
|
|
78
|
+
id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
description?: string;
|
|
81
|
+
isMember: boolean;
|
|
82
|
+
isBlocked: boolean;
|
|
83
|
+
members: Array<{
|
|
84
|
+
uuid: string;
|
|
85
|
+
number?: string;
|
|
86
|
+
}>;
|
|
87
|
+
}>>;
|
|
88
|
+
/**
|
|
89
|
+
* Sends a message to a recipient or group
|
|
90
|
+
*/
|
|
91
|
+
export declare function signalSend(params: {
|
|
92
|
+
account: string;
|
|
93
|
+
recipients?: string[];
|
|
94
|
+
groupId?: string;
|
|
95
|
+
message?: string;
|
|
96
|
+
attachments?: string[];
|
|
97
|
+
quote?: {
|
|
98
|
+
timestamp: number;
|
|
99
|
+
author: string;
|
|
100
|
+
};
|
|
101
|
+
}, opts: SignalRpcOptions): Promise<{
|
|
102
|
+
timestamp: number;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Sends a reaction to a message
|
|
106
|
+
*/
|
|
107
|
+
export declare function signalSendReaction(params: {
|
|
108
|
+
account: string;
|
|
109
|
+
recipient?: string;
|
|
110
|
+
groupId?: string;
|
|
111
|
+
emoji: string;
|
|
112
|
+
targetAuthor: string;
|
|
113
|
+
targetTimestamp: number;
|
|
114
|
+
remove?: boolean;
|
|
115
|
+
}, opts: SignalRpcOptions): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Sends a typing indicator
|
|
118
|
+
*/
|
|
119
|
+
export declare function signalSendTyping(params: {
|
|
120
|
+
account: string;
|
|
121
|
+
recipient?: string;
|
|
122
|
+
groupId?: string;
|
|
123
|
+
stop?: boolean;
|
|
124
|
+
}, opts: SignalRpcOptions): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Sends a read receipt
|
|
127
|
+
*/
|
|
128
|
+
export declare function signalSendReadReceipt(params: {
|
|
129
|
+
account: string;
|
|
130
|
+
recipient: string;
|
|
131
|
+
targetTimestamp: number;
|
|
132
|
+
}, opts: SignalRpcOptions): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Streams SSE events from the Signal CLI HTTP server
|
|
135
|
+
*/
|
|
136
|
+
export declare function streamSignalEvents(params: {
|
|
137
|
+
baseUrl: string;
|
|
138
|
+
account?: string;
|
|
139
|
+
abortSignal?: AbortSignal;
|
|
140
|
+
onEvent: (event: SignalSseEvent) => void;
|
|
141
|
+
}): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Parses an SSE data field as JSON
|
|
144
|
+
*/
|
|
145
|
+
export declare function parseSignalEventData<T>(data: string | undefined): T | null;
|
|
146
|
+
/**
|
|
147
|
+
* Creates an SSE event handler with reconnection logic
|
|
148
|
+
*/
|
|
149
|
+
export declare function createSignalEventStream(params: {
|
|
150
|
+
baseUrl: string;
|
|
151
|
+
account?: string;
|
|
152
|
+
onEvent: (event: SignalSseEvent) => void;
|
|
153
|
+
onError?: (error: Error) => void;
|
|
154
|
+
onConnect?: () => void;
|
|
155
|
+
onDisconnect?: () => void;
|
|
156
|
+
reconnectDelayMs?: number;
|
|
157
|
+
maxReconnectDelayMs?: number;
|
|
158
|
+
}): {
|
|
159
|
+
start: () => void;
|
|
160
|
+
stop: () => void;
|
|
161
|
+
isRunning: () => boolean;
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type Character, type IAgentRuntime, Service } from "@elizaos/core";
|
|
2
|
+
import { type ISignalService, type SignalContact, type SignalGroup, type SignalMessageSendOptions } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* SignalService class for interacting with Signal via HTTP API or CLI
|
|
5
|
+
*/
|
|
6
|
+
export declare class SignalService extends Service implements ISignalService {
|
|
7
|
+
static serviceType: string;
|
|
8
|
+
capabilityDescription: string;
|
|
9
|
+
character: Character;
|
|
10
|
+
accountNumber: string | null;
|
|
11
|
+
isConnected: boolean;
|
|
12
|
+
private client;
|
|
13
|
+
private settings;
|
|
14
|
+
private contactCache;
|
|
15
|
+
private groupCache;
|
|
16
|
+
private pollInterval;
|
|
17
|
+
private isPolling;
|
|
18
|
+
constructor(runtime: IAgentRuntime);
|
|
19
|
+
private loadSettings;
|
|
20
|
+
static start(runtime: IAgentRuntime): Promise<SignalService>;
|
|
21
|
+
static stop(runtime: IAgentRuntime): Promise<void>;
|
|
22
|
+
private initialize;
|
|
23
|
+
private shutdown;
|
|
24
|
+
private startPolling;
|
|
25
|
+
private stopPolling;
|
|
26
|
+
private pollMessages;
|
|
27
|
+
private handleIncomingMessage;
|
|
28
|
+
private handleReaction;
|
|
29
|
+
private processMessage;
|
|
30
|
+
private buildMemoryFromMessage;
|
|
31
|
+
private getRoomId;
|
|
32
|
+
private getEntityId;
|
|
33
|
+
private ensureRoomExists;
|
|
34
|
+
sendMessage(recipient: string, text: string, options?: SignalMessageSendOptions): Promise<{
|
|
35
|
+
timestamp: number;
|
|
36
|
+
}>;
|
|
37
|
+
sendGroupMessage(groupId: string, text: string, options?: SignalMessageSendOptions): Promise<{
|
|
38
|
+
timestamp: number;
|
|
39
|
+
}>;
|
|
40
|
+
sendReaction(recipient: string, emoji: string, targetTimestamp: number, targetAuthor: string): Promise<void>;
|
|
41
|
+
removeReaction(recipient: string, emoji: string, targetTimestamp: number, targetAuthor: string): Promise<void>;
|
|
42
|
+
getContacts(): Promise<SignalContact[]>;
|
|
43
|
+
getGroups(): Promise<SignalGroup[]>;
|
|
44
|
+
getGroup(groupId: string): Promise<SignalGroup | null>;
|
|
45
|
+
sendTypingIndicator(recipient: string): Promise<void>;
|
|
46
|
+
stopTypingIndicator(recipient: string): Promise<void>;
|
|
47
|
+
private splitMessage;
|
|
48
|
+
getContact(number: string): SignalContact | null;
|
|
49
|
+
getCachedGroup(groupId: string): SignalGroup | null;
|
|
50
|
+
getAccountNumber(): string | null;
|
|
51
|
+
isServiceConnected(): boolean;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAMd,KAAK,aAAa,EAMlB,OAAO,EAIR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,cAAc,EAInB,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,wBAAwB,EAM9B,MAAM,SAAS,CAAC;AA0JjB;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAQ,YAAW,cAAc;IAClE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAuB;IACjD,qBAAqB,SAA8D;IAEnF,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,WAAW,UAAS;IAEpB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa;IAMlC,OAAO,CAAC,YAAY;WAUP,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;WAsCrD,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAO1C,UAAU;YAgCV,QAAQ;IAWtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;YAOL,YAAY;YAcZ,qBAAqB;YA6CrB,cAAc;YAcd,cAAc;YA0Cd,sBAAsB;YAmCtB,SAAS;IAKvB,OAAO,CAAC,WAAW;YAIL,gBAAgB;IAmCxB,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAuB3B,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB3B,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAQV,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAQV,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAevC,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAenC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAatD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,OAAO,CAAC,YAAY;IAiCpB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAIhD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAInD,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,kBAAkB,IAAI,OAAO;CAG9B"}
|