@elizaos/plugin-feishu 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 +148 -0
- package/dist/accounts.d.ts.map +1 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/sendMessage.d.ts +4 -0
- package/dist/actions/sendMessage.d.ts.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/environment.d.ts +38 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/formatting.d.ts +104 -0
- package/dist/formatting.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1391 -0
- package/dist/index.js.map +19 -0
- package/dist/messageManager.d.ts +52 -0
- package/dist/messageManager.d.ts.map +1 -0
- package/dist/providers/chatState.d.ts +7 -0
- package/dist/providers/chatState.d.ts.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/service.d.ts +56 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/types.d.ts +288 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/constants.ts", "../src/actions/sendMessage.ts", "../src/messageManager.ts", "../src/environment.ts", "../src/types.ts", "../src/providers/chatState.ts", "../src/service.ts", "../src/accounts.ts", "../src/formatting.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Service name used to register and retrieve the Feishu service.\n */\nexport const FEISHU_SERVICE_NAME = \"feishu\";\n\n/**\n * Default API domains for Feishu and Lark.\n */\nexport const FEISHU_DOMAINS = {\n feishu: \"https://open.feishu.cn\",\n lark: \"https://open.larksuite.com\",\n} as const;\n\n/**\n * Maximum message length for Feishu text messages.\n */\nexport const MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Default timeout for API requests in milliseconds.\n */\nexport const DEFAULT_TIMEOUT_MS = 30000;\n",
|
|
6
|
+
"import type {\n Action,\n ActionExample,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { FEISHU_SERVICE_NAME } from \"../constants\";\nimport type { FeishuService } from \"../service\";\n\nexport const SEND_MESSAGE_ACTION = \"SEND_FEISHU_MESSAGE\";\n\nexport const sendMessageAction: Action = {\n name: SEND_MESSAGE_ACTION,\n similes: [\n \"FEISHU_SEND_MESSAGE\",\n \"FEISHU_REPLY\",\n \"FEISHU_MESSAGE\",\n \"SEND_FEISHU\",\n \"REPLY_FEISHU\",\n \"LARK_SEND_MESSAGE\",\n \"LARK_REPLY\",\n \"SEND_LARK\",\n ],\n description: \"Send a message to a Feishu/Lark chat\",\n\n validate: async (\n _runtime: IAgentRuntime,\n message: Memory,\n ): Promise<boolean> => {\n const source = message.content?.source;\n return source === \"feishu\";\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n ): Promise<ActionResult> => {\n const feishuService = runtime.getService(FEISHU_SERVICE_NAME) as unknown as\n | FeishuService\n | undefined;\n\n if (!feishuService) {\n if (callback) {\n await callback({\n text: \"Feishu service not available\",\n });\n }\n return { success: false, error: \"Feishu service not initialized\" };\n }\n\n const currentState = state ?? (await runtime.composeState(message));\n const responseText = currentState.values?.response?.toString() || \"\";\n const chatId = message.content?.chatId as string | undefined;\n\n if (!chatId) {\n if (callback) {\n await callback({\n text: \"No chat ID available\",\n });\n }\n return { success: false, error: \"Missing chat ID\" };\n }\n\n if (callback) {\n await callback({\n text: responseText,\n action: SEND_MESSAGE_ACTION,\n });\n }\n\n return {\n success: true,\n data: {\n action: SEND_MESSAGE_ACTION,\n chatId,\n text: responseText,\n replyToMessageId: message.content?.messageId,\n },\n };\n },\n\n examples: [\n [\n {\n name: \"{{name1}}\",\n content: {\n text: \"Send a message to this Feishu chat\",\n },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll send a message to this chat now.\",\n actions: [SEND_MESSAGE_ACTION],\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
|
|
7
|
+
"import {\n ChannelType,\n createUniqueUuid,\n EventType,\n type IAgentRuntime,\n logger,\n type Memory,\n type UUID,\n} from \"@elizaos/core\";\nimport type * as lark from \"@larksuiteoapi/node-sdk\";\nimport { MAX_MESSAGE_LENGTH } from \"./constants\";\nimport type { FeishuConfig } from \"./environment\";\nimport { isChatAllowed } from \"./environment\";\nimport type {\n FeishuChat,\n FeishuChatType,\n FeishuEventData,\n FeishuMessage,\n FeishuMessageContent,\n FeishuMessageReceivedPayload,\n FeishuUser,\n} from \"./types\";\nimport { FeishuEventTypes } from \"./types\";\n\n/**\n * Manages message handling for the Feishu service.\n */\nexport class MessageManager {\n private client: lark.Client;\n private runtime: IAgentRuntime;\n private config: FeishuConfig;\n private processedMessages: Set<string> = new Set();\n private botOpenId: string | null = null;\n\n constructor(\n client: lark.Client,\n runtime: IAgentRuntime,\n config: FeishuConfig,\n ) {\n this.client = client;\n this.runtime = runtime;\n this.config = config;\n }\n\n /**\n * Sets the bot's open ID for mention detection.\n */\n setBotOpenId(openId: string): void {\n this.botOpenId = openId;\n }\n\n /**\n * Handles incoming message events.\n */\n async handleMessage(event: FeishuEventData): Promise<void> {\n try {\n const message = event.event?.message as FeishuMessage | undefined;\n if (!message) {\n return;\n }\n\n // Deduplicate messages\n if (this.processedMessages.has(message.messageId)) {\n return;\n }\n this.processedMessages.add(message.messageId);\n\n // Limit cache size\n if (this.processedMessages.size > 1000) {\n const firstKey = this.processedMessages.values().next().value as string;\n this.processedMessages.delete(firstKey);\n }\n\n const chatId = message.chatId;\n const chatType = (event.event?.chat_type || \"p2p\") as FeishuChatType;\n\n // Check if chat is allowed\n if (!isChatAllowed(this.config, chatId)) {\n logger.debug(`[Feishu] Chat ${chatId} not authorized, skipping`);\n return;\n }\n\n // Parse sender information\n const sender = this.parseSender(event);\n\n // Ignore bot messages if configured\n if (this.config.shouldIgnoreBotMessages && sender.isBot) {\n logger.debug(\"[Feishu] Ignoring bot message\");\n return;\n }\n\n // Check for mentions if configured\n if (this.config.shouldRespondOnlyToMentions && chatType !== \"p2p\") {\n if (!this.isBotMentioned(message)) {\n logger.debug(\"[Feishu] Bot not mentioned, skipping\");\n return;\n }\n }\n\n // Parse message content\n const text = this.parseMessageContent(message);\n\n // Build chat info\n const chat: FeishuChat = {\n chatId,\n chatType: chatType as FeishuChatType,\n name: (event.event?.chat_name as string | undefined) || undefined,\n };\n\n // Create room and entity IDs\n const roomId = createUniqueUuid(this.runtime, chatId) as UUID;\n const entityId = createUniqueUuid(this.runtime, sender.openId) as UUID;\n const worldId = createUniqueUuid(this.runtime, chatId) as UUID;\n\n // Ensure connection exists\n await this.runtime.ensureConnection({\n entityId,\n roomId,\n userName: sender.name,\n userId: sender.openId as UUID,\n name: sender.name || \"Unknown User\",\n source: \"feishu\",\n channelId: chatId,\n messageServerId: worldId,\n type: chatType === \"p2p\" ? ChannelType.DM : ChannelType.GROUP,\n worldId,\n });\n\n // Create memory for the message\n const memory: Memory = {\n id: createUniqueUuid(this.runtime, message.messageId) as UUID,\n entityId,\n roomId,\n agentId: this.runtime.agentId,\n content: {\n text,\n source: \"feishu\",\n chatId,\n messageId: message.messageId,\n },\n createdAt: Number.parseInt(message.createTime, 10),\n };\n\n // Emit message received event\n const payload: FeishuMessageReceivedPayload = {\n runtime: this.runtime,\n message: memory,\n source: \"feishu\",\n originalMessage: message,\n chat,\n sender,\n };\n\n this.runtime.emitEvent(FeishuEventTypes.MESSAGE_RECEIVED, payload);\n this.runtime.emitEvent(EventType.MESSAGE_RECEIVED, payload);\n } catch (error) {\n logger.error(\n `[Feishu] Error handling message: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Sends a message to a chat.\n */\n async sendMessage(\n chatId: string,\n content: FeishuMessageContent,\n ): Promise<string[]> {\n const messageIds: string[] = [];\n\n try {\n const text = content.text || \"\";\n\n // Handle card messages\n if (content.card) {\n const response = await this.client.im.message.create({\n params: { receive_id_type: \"chat_id\" },\n data: {\n receive_id: chatId,\n msg_type: \"interactive\",\n content: JSON.stringify(content.card),\n },\n });\n if (response.data?.message_id) {\n messageIds.push(response.data.message_id);\n }\n return messageIds;\n }\n\n // Handle image messages\n if (content.imageKey) {\n const response = await this.client.im.message.create({\n params: { receive_id_type: \"chat_id\" },\n data: {\n receive_id: chatId,\n msg_type: \"image\",\n content: JSON.stringify({ image_key: content.imageKey }),\n },\n });\n if (response.data?.message_id) {\n messageIds.push(response.data.message_id);\n }\n return messageIds;\n }\n\n // Split long messages\n const parts = this.splitMessage(text);\n\n for (const part of parts) {\n const response = await this.client.im.message.create({\n params: { receive_id_type: \"chat_id\" },\n data: {\n receive_id: chatId,\n msg_type: \"text\",\n content: JSON.stringify({ text: part }),\n },\n });\n if (response.data?.message_id) {\n messageIds.push(response.data.message_id);\n }\n }\n\n return messageIds;\n } catch (error) {\n logger.error(\n `[Feishu] Error sending message: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n /**\n * Replies to a specific message.\n */\n async replyToMessage(\n messageId: string,\n content: FeishuMessageContent,\n ): Promise<string[]> {\n const messageIds: string[] = [];\n\n try {\n const text = content.text || \"\";\n const parts = this.splitMessage(text);\n\n for (const part of parts) {\n const response = await this.client.im.message.reply({\n path: { message_id: messageId },\n data: {\n msg_type: \"text\",\n content: JSON.stringify({ text: part }),\n },\n });\n if (response.data?.message_id) {\n messageIds.push(response.data.message_id);\n }\n }\n\n return messageIds;\n } catch (error) {\n logger.error(\n `[Feishu] Error replying to message: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n /**\n * Parses sender information from an event.\n */\n private parseSender(event: FeishuEventData): FeishuUser {\n const sender = event.event?.sender as\n | {\n sender_id?: {\n open_id?: string;\n union_id?: string;\n user_id?: string;\n };\n sender_type?: string;\n }\n | undefined;\n\n const isBot = sender?.sender_type === \"app\";\n const openId = sender?.sender_id?.open_id || \"\";\n\n return {\n openId,\n unionId: sender?.sender_id?.union_id,\n userId: sender?.sender_id?.user_id,\n isBot,\n };\n }\n\n /**\n * Parses message content to extract text.\n */\n private parseMessageContent(message: FeishuMessage): string {\n try {\n const content = JSON.parse(message.content);\n\n switch (message.msgType) {\n case \"text\":\n return content.text || \"\";\n\n case \"post\":\n // Rich text - extract plain text\n return this.extractTextFromPost(content);\n\n case \"image\":\n case \"file\":\n case \"audio\":\n case \"video\":\n case \"sticker\":\n return `[${message.msgType}]`;\n\n case \"interactive\":\n return \"[interactive card]\";\n\n default:\n return content.text || \"\";\n }\n } catch {\n return \"\";\n }\n }\n\n /**\n * Extracts plain text from a rich text (post) message.\n */\n private extractTextFromPost(content: {\n title?: string;\n content?: { tag: string; text?: string }[][];\n }): string {\n const parts: string[] = [];\n\n if (content.title) {\n parts.push(content.title);\n }\n\n if (content.content && Array.isArray(content.content)) {\n for (const line of content.content) {\n if (Array.isArray(line)) {\n const lineText = line\n .filter((elem) => elem.tag === \"text\" && elem.text)\n .map((elem) => elem.text)\n .join(\"\");\n if (lineText) {\n parts.push(lineText);\n }\n }\n }\n }\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Checks if the bot is mentioned in the message.\n */\n private isBotMentioned(message: FeishuMessage): boolean {\n if (!this.botOpenId || !message.mentions) {\n return false;\n }\n\n return message.mentions.some((mention) => mention.id === this.botOpenId);\n }\n\n /**\n * Splits a long message into chunks.\n */\n private splitMessage(content: string): string[] {\n if (content.length <= MAX_MESSAGE_LENGTH) {\n return [content];\n }\n\n const parts: string[] = [];\n let current = \"\";\n\n for (const line of content.split(\"\\n\")) {\n const lineWithNewline = current ? `\\n${line}` : line;\n\n if (current.length + lineWithNewline.length > MAX_MESSAGE_LENGTH) {\n if (current) {\n parts.push(current);\n current = \"\";\n }\n\n if (line.length > MAX_MESSAGE_LENGTH) {\n // Split very long lines by words\n const words = line.split(/\\s+/);\n for (const word of words) {\n const wordWithSpace = current ? ` ${word}` : word;\n if (current.length + wordWithSpace.length > MAX_MESSAGE_LENGTH) {\n if (current) {\n parts.push(current);\n current = \"\";\n }\n if (word.length > MAX_MESSAGE_LENGTH) {\n // Split very long words\n for (let i = 0; i < word.length; i += MAX_MESSAGE_LENGTH) {\n parts.push(word.slice(i, i + MAX_MESSAGE_LENGTH));\n }\n } else {\n current = word;\n }\n } else {\n current += wordWithSpace;\n }\n }\n } else {\n current = line;\n }\n } else {\n current += lineWithNewline;\n }\n }\n\n if (current) {\n parts.push(current);\n }\n\n return parts;\n }\n}\n",
|
|
8
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { FEISHU_DOMAINS } from \"./constants\";\n\n/**\n * Configuration for the Feishu service.\n */\nexport interface FeishuConfig {\n /** Application ID (cli_xxx format) */\n appId: string;\n /** Application secret */\n appSecret: string;\n /** Domain: 'feishu' for China or 'lark' for global */\n domain: \"feishu\" | \"lark\";\n /** API base URL */\n apiRoot: string;\n /** Allowed chat IDs (empty means all allowed) */\n allowedChatIds: string[];\n /** Test chat ID for testing */\n testChatId?: string;\n /** Whether to ignore bot messages */\n shouldIgnoreBotMessages: boolean;\n /** Whether to respond only to mentions */\n shouldRespondOnlyToMentions: boolean;\n}\n\n/**\n * Validates and returns the Feishu configuration from runtime settings.\n */\nexport function getFeishuConfig(runtime: IAgentRuntime): FeishuConfig | null {\n const appId = runtime.getSetting(\"FEISHU_APP_ID\") as string | undefined;\n const appSecret = runtime.getSetting(\"FEISHU_APP_SECRET\") as\n | string\n | undefined;\n\n if (!appId || !appSecret) {\n return null;\n }\n\n const domainSetting = (\n runtime.getSetting(\"FEISHU_DOMAIN\") as string | undefined\n )?.toLowerCase();\n const domain: \"feishu\" | \"lark\" =\n domainSetting === \"lark\" ? \"lark\" : \"feishu\";\n\n const apiRoot = FEISHU_DOMAINS[domain];\n\n let allowedChatIds: string[] = [];\n const allowedChatsRaw = runtime.getSetting(\"FEISHU_ALLOWED_CHATS\") as\n | string\n | undefined;\n if (allowedChatsRaw) {\n try {\n const parsed = JSON.parse(allowedChatsRaw);\n if (Array.isArray(parsed)) {\n allowedChatIds = parsed.map(String);\n }\n } catch {\n // Invalid JSON, ignore\n }\n }\n\n const testChatId = runtime.getSetting(\"FEISHU_TEST_CHAT_ID\") as\n | string\n | undefined;\n\n const shouldIgnoreBotMessages =\n (\n runtime.getSetting(\"FEISHU_IGNORE_BOT_MESSAGES\") as string\n )?.toLowerCase() !== \"false\";\n\n const shouldRespondOnlyToMentions =\n (\n runtime.getSetting(\"FEISHU_RESPOND_ONLY_TO_MENTIONS\") as string\n )?.toLowerCase() === \"true\";\n\n return {\n appId,\n appSecret,\n domain,\n apiRoot,\n allowedChatIds,\n testChatId,\n shouldIgnoreBotMessages,\n shouldRespondOnlyToMentions,\n };\n}\n\n/**\n * Validates the Feishu configuration.\n */\nexport function validateConfig(config: FeishuConfig): {\n valid: boolean;\n error?: string;\n} {\n if (!config.appId) {\n return { valid: false, error: \"FEISHU_APP_ID is required\" };\n }\n\n if (!config.appId.startsWith(\"cli_\")) {\n return { valid: false, error: \"FEISHU_APP_ID should start with 'cli_'\" };\n }\n\n if (!config.appSecret) {\n return { valid: false, error: \"FEISHU_APP_SECRET is required\" };\n }\n\n return { valid: true };\n}\n\n/**\n * Checks if a chat is allowed based on configuration.\n */\nexport function isChatAllowed(config: FeishuConfig, chatId: string): boolean {\n if (config.allowedChatIds.length === 0) {\n return true;\n }\n return config.allowedChatIds.includes(chatId);\n}\n",
|
|
9
|
+
"import type {\n Content,\n EntityPayload,\n MessagePayload,\n WorldPayload,\n} from \"@elizaos/core\";\n\n/**\n * Feishu event data structure (local type since lark SDK doesn't export it)\n */\nexport interface FeishuEventData {\n event?: Record<string, unknown>;\n header?: {\n event_id?: string;\n token?: string;\n create_time?: string;\n event_type?: string;\n tenant_key?: string;\n app_id?: string;\n };\n}\n\n/**\n * Base content type for Feishu messages (extends Content for compatibility).\n * Note: Do not add FeishuCard directly to this interface as it conflicts with Content's index signature.\n */\nexport interface FeishuContent extends Content {\n /** Image key for image messages */\n feishuImageKey?: string;\n /** File key for file messages */\n feishuFileKey?: string;\n}\n\n/**\n * Internal type for Feishu-specific content with card support (not exported to Content).\n * This type is used internally for message sending/receiving.\n */\nexport interface FeishuMessageContent {\n text?: string;\n /** Interactive card content */\n card?: FeishuCard;\n /** Image key for image messages */\n imageKey?: string;\n /** File key for file messages */\n fileKey?: string;\n}\n\n/**\n * Helper type for accessing Feishu-specific card content (internal use)\n */\nexport type FeishuCardContent = {\n card?: FeishuCard;\n imageKey?: string;\n fileKey?: string;\n};\n\n/**\n * Feishu interactive card structure.\n */\nexport interface FeishuCard {\n /** Card configuration */\n config?: {\n wideScreenMode?: boolean;\n enableForward?: boolean;\n };\n /** Card header */\n header?: {\n title?: {\n tag: string;\n content: string;\n };\n template?: string;\n };\n /** Card elements */\n elements?: FeishuCardElement[];\n}\n\n/**\n * Card element types.\n */\nexport type FeishuCardElement =\n | { tag: \"div\"; text: { tag: string; content: string } }\n | { tag: \"action\"; actions: FeishuCardAction[] }\n | { tag: \"hr\" }\n | { tag: \"note\"; elements: { tag: string; content: string }[] };\n\n/**\n * Card action types.\n */\nexport interface FeishuCardAction {\n tag: \"button\";\n text: { tag: string; content: string };\n type?: \"default\" | \"primary\" | \"danger\";\n url?: string;\n value?: Record<string, string>;\n}\n\n/**\n * Event types emitted by the Feishu plugin.\n */\nexport enum FeishuEventTypes {\n WORLD_JOINED = \"FEISHU_WORLD_JOINED\",\n WORLD_CONNECTED = \"FEISHU_WORLD_CONNECTED\",\n WORLD_LEFT = \"FEISHU_WORLD_LEFT\",\n ENTITY_JOINED = \"FEISHU_ENTITY_JOINED\",\n ENTITY_LEFT = \"FEISHU_ENTITY_LEFT\",\n ENTITY_UPDATED = \"FEISHU_ENTITY_UPDATED\",\n MESSAGE_RECEIVED = \"FEISHU_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"FEISHU_MESSAGE_SENT\",\n REACTION_RECEIVED = \"FEISHU_REACTION_RECEIVED\",\n INTERACTION_RECEIVED = \"FEISHU_INTERACTION_RECEIVED\",\n SLASH_START = \"FEISHU_SLASH_START\",\n}\n\n/**\n * Map of event types to their payload types.\n */\nexport interface FeishuEventPayloadMap {\n [FeishuEventTypes.MESSAGE_RECEIVED]: FeishuMessageReceivedPayload;\n [FeishuEventTypes.MESSAGE_SENT]: FeishuMessageSentPayload;\n [FeishuEventTypes.REACTION_RECEIVED]: FeishuReactionReceivedPayload;\n [FeishuEventTypes.WORLD_JOINED]: FeishuWorldPayload;\n [FeishuEventTypes.WORLD_CONNECTED]: FeishuWorldPayload;\n [FeishuEventTypes.WORLD_LEFT]: FeishuWorldPayload;\n [FeishuEventTypes.SLASH_START]: { chatId: string };\n [FeishuEventTypes.ENTITY_JOINED]: FeishuEntityPayload;\n [FeishuEventTypes.ENTITY_LEFT]: FeishuEntityPayload;\n [FeishuEventTypes.ENTITY_UPDATED]: FeishuEntityPayload;\n [FeishuEventTypes.INTERACTION_RECEIVED]: FeishuInteractionPayload;\n}\n\n/**\n * Feishu chat types.\n */\nexport enum FeishuChatType {\n /** Private one-on-one chat */\n P2P = \"p2p\",\n /** Group chat */\n GROUP = \"group\",\n}\n\n/**\n * Feishu user information.\n */\nexport interface FeishuUser {\n /** Open ID (user identifier) */\n openId: string;\n /** Union ID (cross-app identifier) */\n unionId?: string;\n /** User ID (tenant-level identifier) */\n userId?: string;\n /** User's display name */\n name?: string;\n /** User's avatar URL */\n avatarUrl?: string;\n /** Whether the user is a bot */\n isBot?: boolean;\n}\n\n/**\n * Feishu chat information.\n */\nexport interface FeishuChat {\n /** Chat ID */\n chatId: string;\n /** Chat type */\n chatType: FeishuChatType;\n /** Chat name/title */\n name?: string;\n /** Chat owner's open ID */\n ownerOpenId?: string;\n /** Chat description */\n description?: string;\n /** Tenant key */\n tenantKey?: string;\n}\n\n/**\n * Feishu message information.\n */\nexport interface FeishuMessage {\n /** Message ID */\n messageId: string;\n /** Root message ID (for threads) */\n rootId?: string;\n /** Parent message ID (for replies) */\n parentId?: string;\n /** Message type */\n msgType: string;\n /** Message content (JSON string) */\n content: string;\n /** Create time (Unix timestamp in milliseconds) */\n createTime: string;\n /** Update time (Unix timestamp in milliseconds) */\n updateTime?: string;\n /** Whether the message is deleted */\n deleted?: boolean;\n /** Chat ID */\n chatId: string;\n /** Sender information */\n sender: {\n id: string;\n idType: string;\n senderType: string;\n tenantKey?: string;\n };\n /** Mentions in the message */\n mentions?: FeishuMention[];\n}\n\n/**\n * Mention information in a message.\n */\nexport interface FeishuMention {\n /** Mention key in the message */\n key: string;\n /** Mentioned user's ID */\n id: string;\n /** ID type */\n idType: string;\n /** Mentioned user's name */\n name: string;\n /** Tenant key */\n tenantKey?: string;\n}\n\n/**\n * Payload for received messages.\n */\nexport interface FeishuMessageReceivedPayload extends MessagePayload {\n /** Original Feishu message */\n originalMessage: FeishuMessage;\n /** Chat information */\n chat: FeishuChat;\n /** Sender information */\n sender: FeishuUser;\n}\n\n/**\n * Payload for sent messages.\n */\nexport interface FeishuMessageSentPayload extends MessagePayload {\n /** Message IDs of sent messages */\n messageIds: string[];\n /** Chat ID */\n chatId: string;\n}\n\n/**\n * Payload for reaction events.\n */\nexport interface FeishuReactionReceivedPayload\n extends FeishuMessageReceivedPayload {\n /** Reaction type/emoji */\n reactionType: string;\n}\n\n/**\n * Payload for world/chat events.\n */\nexport interface FeishuWorldPayload extends WorldPayload {\n /** Chat information */\n chat: FeishuChat;\n /** Bot's open ID */\n botOpenId?: string;\n}\n\n/**\n * Payload for entity (user) events.\n */\nexport interface FeishuEntityPayload extends EntityPayload {\n /** Feishu user information */\n feishuUser: FeishuUser;\n /** Chat where the event occurred */\n chat: FeishuChat;\n}\n\n/**\n * Payload for interaction events (card actions, etc.).\n */\nexport interface FeishuInteractionPayload {\n /** Interaction type */\n type: string;\n /** Action data */\n action: {\n tag: string;\n value?: Record<string, string>;\n };\n /** User who triggered the interaction */\n user: FeishuUser;\n /** Chat where the interaction occurred */\n chat?: FeishuChat;\n /** Token for responding to the interaction */\n token?: string;\n}\n",
|
|
10
|
+
"import type {\n IAgentRuntime,\n Memory,\n Provider,\n ProviderResult,\n State,\n} from \"@elizaos/core\";\n\nexport const CHAT_STATE_PROVIDER = \"FEISHU_CHAT_STATE\";\n\n/**\n * Provider that supplies Feishu chat state information to the agent.\n */\nexport const chatStateProvider: Provider = {\n name: CHAT_STATE_PROVIDER,\n description: \"Provides Feishu chat context and state information\",\n\n get: async (\n _runtime: IAgentRuntime,\n message: Memory,\n state: State,\n ): Promise<ProviderResult> => {\n // Only provide state for Feishu messages\n if (message.content?.source !== \"feishu\") {\n return { text: \"\" };\n }\n\n const chatId = message.content?.chatId as string | undefined;\n const messageId = message.content?.messageId as string | undefined;\n\n if (!chatId) {\n return { text: \"\" };\n }\n\n const stateInfo: string[] = [`Platform: Feishu/Lark`, `Chat ID: ${chatId}`];\n\n if (messageId) {\n stateInfo.push(`Message ID: ${messageId}`);\n }\n\n // Add any additional state information from the state object\n if (state?.values?.feishuChatType) {\n stateInfo.push(`Chat Type: ${state.values.feishuChatType}`);\n }\n\n if (state?.values?.feishuChatName) {\n stateInfo.push(`Chat Name: ${state.values.feishuChatName}`);\n }\n\n return { text: stateInfo.join(\"\\n\") };\n },\n};\n",
|
|
11
|
+
"import {\n ChannelType,\n type Content,\n createUniqueUuid,\n type EventPayload,\n EventType,\n type IAgentRuntime,\n logger,\n type Room,\n Service,\n type TargetInfo,\n type UUID,\n type World,\n} from \"@elizaos/core\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport { FEISHU_SERVICE_NAME } from \"./constants\";\nimport {\n type FeishuConfig,\n getFeishuConfig,\n validateConfig,\n} from \"./environment\";\nimport { MessageManager } from \"./messageManager\";\nimport type {\n FeishuChat,\n FeishuEventData,\n FeishuMessageContent,\n FeishuWorldPayload,\n} from \"./types\";\nimport { FeishuChatType, FeishuEventTypes } from \"./types\";\n\n/**\n * Feishu service for ElizaOS.\n */\nexport class FeishuService extends Service {\n static serviceType = FEISHU_SERVICE_NAME;\n capabilityDescription =\n \"The agent is able to send and receive messages on Feishu/Lark\";\n\n private client: lark.Client | null = null;\n private wsClient: lark.WSClient | null = null;\n public messageManager: MessageManager | null = null;\n private feishuConfig: FeishuConfig | null = null;\n private botOpenId: string | null = null;\n private knownChats: Map<string, FeishuChat> = new Map();\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n\n if (!runtime) {\n return;\n }\n\n const config = getFeishuConfig(runtime);\n if (!config) {\n logger.warn(\n \"[Feishu] App ID or App Secret not provided - Feishu functionality will be unavailable\",\n );\n return;\n }\n\n const validation = validateConfig(config);\n if (!validation.valid) {\n logger.warn(`[Feishu] Invalid configuration: ${validation.error}`);\n return;\n }\n\n this.feishuConfig = config;\n\n // Initialize Lark SDK client\n this.client = new lark.Client({\n appId: config.appId,\n appSecret: config.appSecret,\n domain: config.domain === \"lark\" ? lark.Domain.Lark : lark.Domain.Feishu,\n loggerLevel: lark.LoggerLevel.warn,\n });\n\n this.messageManager = new MessageManager(this.client, runtime, config);\n }\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new FeishuService(runtime);\n\n if (!service.client || !service.feishuConfig) {\n logger.warn(\n \"[Feishu] Service started without client - no credentials provided\",\n );\n return service;\n }\n\n const maxRetries = 5;\n let retryCount = 0;\n let lastError: Error | null = null;\n\n while (retryCount < maxRetries) {\n try {\n logger.info(\n `[Feishu] Starting service for character ${runtime.character.name}`,\n );\n\n await service.initializeBot();\n await service.setupWebSocket();\n\n logger.success(`[Feishu] Service started successfully`);\n return service;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.error(\n `[Feishu] Initialization attempt ${retryCount + 1} failed: ${lastError.message}`,\n );\n retryCount++;\n\n if (retryCount < maxRetries) {\n const delay = 2 ** retryCount * 1000;\n logger.info(`[Feishu] Retrying in ${delay / 1000} seconds...`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n logger.error(\n `[Feishu] Initialization failed after ${maxRetries} attempts. Last error: ${lastError?.message}`,\n );\n\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(FEISHU_SERVICE_NAME) as unknown as\n | FeishuService\n | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n async stop(): Promise<void> {\n logger.info(\"[Feishu] Stopping service...\");\n\n if (this.wsClient) {\n try {\n // WSClient may not have a stop method in newer SDK versions\n const wsClientWithStop = this.wsClient as unknown as {\n stop?: () => Promise<void>;\n };\n if (typeof wsClientWithStop.stop === \"function\") {\n await wsClientWithStop.stop();\n }\n } catch (error) {\n logger.error(\n `[Feishu] Error stopping WebSocket client: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n this.wsClient = null;\n }\n\n this.client = null;\n logger.info(\"[Feishu] Service stopped\");\n }\n\n /**\n * Initializes the bot and fetches bot information.\n */\n private async initializeBot(): Promise<void> {\n if (!this.client) {\n throw new Error(\"Client not initialized\");\n }\n\n // Get bot info - the API path may vary by SDK version\n try {\n // Try to get bot info via the contact API\n const client = this.client as unknown as {\n bot?: {\n botInfo?: {\n get: (params: Record<string, unknown>) => Promise<{\n data?: { bot?: { open_id?: string; app_name?: string } };\n }>;\n };\n };\n contact?: {\n user?: {\n me?: (params: Record<string, unknown>) => Promise<{\n data?: { user?: { open_id?: string; name?: string } };\n }>;\n };\n };\n };\n\n if (client.bot?.botInfo?.get) {\n const botInfo = await client.bot.botInfo.get({});\n this.botOpenId = botInfo.data?.bot?.open_id || null;\n\n if (this.botOpenId && this.messageManager) {\n this.messageManager.setBotOpenId(this.botOpenId);\n }\n\n logger.info(\n `[Feishu] Bot initialized: ${botInfo.data?.bot?.app_name || \"Unknown\"}`,\n );\n } else {\n logger.warn(\n \"[Feishu] Bot info API not available, some features may not work\",\n );\n }\n } catch (error) {\n logger.error(\n `[Feishu] Failed to get bot info: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n /**\n * Sets up WebSocket connection for receiving events.\n */\n private async setupWebSocket(): Promise<void> {\n if (!this.client || !this.feishuConfig || !this.runtime) {\n throw new Error(\"Client not initialized\");\n }\n\n const eventDispatcher = new lark.EventDispatcher({}).register({\n \"im.message.receive_v1\": async (data: unknown) => {\n await this.handleMessageEvent(data as FeishuEventData);\n return {};\n },\n \"im.chat.member.bot.added_v1\": async (data: unknown) => {\n await this.handleBotAddedEvent(data as FeishuEventData);\n return {};\n },\n \"im.chat.member.bot.deleted_v1\": async (data: unknown) => {\n await this.handleBotRemovedEvent(data as FeishuEventData);\n return {};\n },\n \"im.chat.member.user.added_v1\": async (data: unknown) => {\n await this.handleUserAddedEvent(data as FeishuEventData);\n return {};\n },\n \"im.chat.member.user.deleted_v1\": async (data: unknown) => {\n await this.handleUserRemovedEvent(data as FeishuEventData);\n return {};\n },\n });\n\n this.wsClient = new lark.WSClient({\n appId: this.feishuConfig.appId,\n appSecret: this.feishuConfig.appSecret,\n domain:\n this.feishuConfig.domain === \"lark\"\n ? lark.Domain.Lark\n : lark.Domain.Feishu,\n loggerLevel: lark.LoggerLevel.warn,\n });\n\n await this.wsClient.start({ eventDispatcher });\n\n // Emit connected event\n this.runtime.emitEvent(FeishuEventTypes.WORLD_CONNECTED, {\n runtime: this.runtime,\n source: \"feishu\",\n botOpenId: this.botOpenId,\n } as EventPayload);\n }\n\n /**\n * Handles incoming message events.\n */\n private async handleMessageEvent(event: FeishuEventData): Promise<void> {\n if (!this.messageManager) return;\n await this.messageManager.handleMessage(event);\n }\n\n /**\n * Handles bot added to chat events.\n */\n private async handleBotAddedEvent(event: FeishuEventData): Promise<void> {\n if (!this.runtime) return;\n\n try {\n const chatId = event.event?.chat_id as string | undefined;\n if (!chatId) return;\n\n const chat: FeishuChat = {\n chatId,\n chatType: FeishuChatType.GROUP,\n name: event.event?.chat_name as string | undefined,\n };\n\n this.knownChats.set(chatId, chat);\n\n // Create world and room\n const worldId = createUniqueUuid(this.runtime, chatId) as UUID;\n const roomId = createUniqueUuid(this.runtime, chatId) as UUID;\n\n const world: World = {\n id: worldId,\n name: chat.name || `Feishu Chat ${chatId}`,\n agentId: this.runtime.agentId,\n messageServerId: worldId,\n metadata: {\n extra: {\n chatType: chat.chatType,\n },\n },\n };\n\n await this.runtime.ensureWorldExists(world);\n\n const room: Room = {\n id: roomId,\n name: chat.name || `Feishu Chat ${chatId}`,\n source: \"feishu\",\n type: ChannelType.GROUP,\n channelId: chatId,\n messageServerId: worldId,\n worldId,\n };\n\n await this.runtime.ensureRoomExists(room);\n\n const payload: FeishuWorldPayload = {\n runtime: this.runtime,\n world,\n rooms: [room],\n entities: [],\n source: \"feishu\",\n chat,\n botOpenId: this.botOpenId || undefined,\n };\n\n this.runtime.emitEvent(\n FeishuEventTypes.WORLD_JOINED,\n payload as EventPayload,\n );\n this.runtime.emitEvent(EventType.WORLD_JOINED, {\n runtime: this.runtime,\n world,\n rooms: [room],\n entities: [],\n source: \"feishu\",\n } as EventPayload);\n\n logger.info(`[Feishu] Bot added to chat: ${chat.name || chatId}`);\n } catch (error) {\n logger.error(\n `[Feishu] Error handling bot added event: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handles bot removed from chat events.\n */\n private async handleBotRemovedEvent(event: FeishuEventData): Promise<void> {\n if (!this.runtime) return;\n\n try {\n const chatId = event.event?.chat_id as string | undefined;\n if (!chatId) return;\n\n const chat = this.knownChats.get(chatId) || {\n chatId,\n chatType: FeishuChatType.GROUP,\n };\n\n this.knownChats.delete(chatId);\n\n this.runtime.emitEvent(FeishuEventTypes.WORLD_LEFT, {\n runtime: this.runtime,\n source: \"feishu\",\n chat,\n botOpenId: this.botOpenId,\n } as EventPayload);\n\n logger.info(`[Feishu] Bot removed from chat: ${chatId}`);\n } catch (error) {\n logger.error(\n `[Feishu] Error handling bot removed event: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handles user added to chat events.\n */\n private async handleUserAddedEvent(event: FeishuEventData): Promise<void> {\n if (!this.runtime) return;\n\n try {\n const chatId = event.event?.chat_id as string | undefined;\n const users = event.event?.users as\n | Array<{ user_id?: { open_id?: string }; name?: string }>\n | undefined;\n\n if (!chatId || !users) return;\n\n for (const user of users) {\n const openId = user.user_id?.open_id;\n if (!openId) continue;\n\n this.runtime.emitEvent(FeishuEventTypes.ENTITY_JOINED, {\n runtime: this.runtime,\n source: \"feishu\",\n feishuUser: {\n openId,\n name: user.name,\n },\n chat: this.knownChats.get(chatId) || {\n chatId,\n chatType: FeishuChatType.GROUP,\n },\n } as EventPayload);\n }\n } catch (error) {\n logger.error(\n `[Feishu] Error handling user added event: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Handles user removed from chat events.\n */\n private async handleUserRemovedEvent(event: FeishuEventData): Promise<void> {\n if (!this.runtime) return;\n\n try {\n const chatId = event.event?.chat_id as string | undefined;\n const users = event.event?.users as\n | Array<{ user_id?: { open_id?: string }; name?: string }>\n | undefined;\n\n if (!chatId || !users) return;\n\n for (const user of users) {\n const openId = user.user_id?.open_id;\n if (!openId) continue;\n\n this.runtime.emitEvent(FeishuEventTypes.ENTITY_LEFT, {\n runtime: this.runtime,\n source: \"feishu\",\n feishuUser: {\n openId,\n name: user.name,\n },\n chat: this.knownChats.get(chatId) || {\n chatId,\n chatType: FeishuChatType.GROUP,\n },\n } as EventPayload);\n }\n } catch (error) {\n logger.error(\n `[Feishu] Error handling user removed event: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Registers send handlers for the service.\n */\n static registerSendHandlers(\n runtime: IAgentRuntime,\n serviceInstance: FeishuService,\n ): void {\n if (serviceInstance?.client && serviceInstance?.messageManager) {\n runtime.registerSendHandler(\n \"feishu\",\n serviceInstance.handleSendMessage.bind(serviceInstance),\n );\n logger.info(\"[Feishu] Registered send handler\");\n } else {\n logger.warn(\n \"[Feishu] Cannot register send handler - client not initialized\",\n );\n }\n }\n\n /**\n * Handles sending messages through the service.\n */\n async handleSendMessage(\n runtime: IAgentRuntime,\n target: TargetInfo,\n content: Content,\n ): Promise<void> {\n if (!this.messageManager) {\n logger.error(\"[Feishu] Message manager not initialized\");\n throw new Error(\"Feishu message manager is not initialized\");\n }\n\n let chatId: string | undefined;\n\n if (target.channelId) {\n chatId = target.channelId;\n } else if (target.roomId) {\n const room = await runtime.getRoom(target.roomId);\n chatId = room?.channelId;\n if (!chatId) {\n throw new Error(\n `Could not resolve Feishu chat ID from roomId ${target.roomId}`,\n );\n }\n } else {\n throw new Error(\"Feishu SendHandler requires channelId or roomId\");\n }\n\n if (!chatId) {\n throw new Error(\n `Could not determine target Feishu chat ID for target: ${JSON.stringify(target)}`,\n );\n }\n\n // Build Feishu content from the base content\n const feishuContent: FeishuMessageContent = {\n text: content.text || \"\",\n };\n\n // Copy over Feishu-specific fields if present\n // Card can be passed via data.card or metadata\n const contentData = content.data as Record<string, unknown> | undefined;\n if (contentData?.card) {\n feishuContent.card = contentData.card as FeishuMessageContent[\"card\"];\n }\n if (contentData?.imageKey) {\n feishuContent.imageKey = contentData.imageKey as string;\n }\n if (contentData?.fileKey) {\n feishuContent.fileKey = contentData.fileKey as string;\n }\n\n await this.messageManager.sendMessage(chatId, feishuContent);\n logger.info(`[Feishu] Message sent to chat ID: ${chatId}`);\n }\n}\n",
|
|
12
|
+
"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 * Token source indicator\n */\nexport type FeishuTokenSource = \"config\" | \"env\" | \"character\" | \"none\";\n\n/**\n * Group-specific configuration\n */\nexport interface FeishuGroupConfig {\n /** If false, ignore messages from this group */\n enabled?: boolean;\n /** Allowlist for users in this group */\n allowFrom?: Array<string | number>;\n /** Require bot mention to respond */\n requireMention?: boolean;\n /** Custom system prompt for this group */\n systemPrompt?: string;\n /** Skills enabled for this group */\n skills?: string[];\n}\n\n/**\n * Configuration for a single Feishu account\n */\nexport interface FeishuAccountConfig {\n /** Optional display name for this account */\n name?: string;\n /** Bot display name */\n botName?: string;\n /** If false, do not start this Feishu account */\n enabled?: boolean;\n /** Feishu App ID */\n appId?: string;\n /** Feishu App Secret */\n appSecret?: string;\n /** Path to file containing app secret */\n appSecretFile?: string;\n /** Encrypt key for event callback */\n encryptKey?: string;\n /** Verification token for event callback */\n verificationToken?: string;\n /** Base API URL (for self-hosted Feishu) */\n apiUrl?: string;\n /** Allowlist for DM senders */\n allowFrom?: Array<string | number>;\n /** Allowlist for groups */\n groupAllowFrom?: Array<string | number>;\n /** DM access policy */\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n /** Group message access policy */\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n /** Max media size in MB */\n mediaMaxMb?: number;\n /** Text chunk limit for messages */\n textChunkLimit?: number;\n /** Webhook path for event callbacks */\n webhookPath?: string;\n /** Group-specific configurations */\n groups?: Record<string, FeishuGroupConfig>;\n}\n\n/**\n * Multi-account Feishu configuration structure\n */\nexport interface FeishuMultiAccountConfig {\n /** Default/base configuration applied to all accounts */\n enabled?: boolean;\n appId?: string;\n appSecret?: string;\n appSecretFile?: string;\n encryptKey?: string;\n verificationToken?: string;\n apiUrl?: string;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n mediaMaxMb?: number;\n textChunkLimit?: number;\n webhookPath?: string;\n /** Per-account configuration overrides */\n accounts?: Record<string, FeishuAccountConfig>;\n /** Group configurations at base level */\n groups?: Record<string, FeishuGroupConfig>;\n}\n\n/**\n * Resolved Feishu account with all configuration merged\n */\nexport interface ResolvedFeishuAccount {\n accountId: string;\n enabled: boolean;\n name?: string;\n appId: string;\n appSecret: string;\n tokenSource: FeishuTokenSource;\n configured: boolean;\n config: FeishuAccountConfig;\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 if (!trimmed || trimmed === \"default\") {\n return DEFAULT_ACCOUNT_ID;\n }\n return trimmed;\n}\n\n/**\n * Gets the multi-account configuration from runtime settings\n */\nexport function getMultiAccountConfig(\n runtime: IAgentRuntime,\n): FeishuMultiAccountConfig {\n const characterFeishu = runtime.character?.settings?.feishu as\n | FeishuMultiAccountConfig\n | undefined;\n\n return {\n enabled: characterFeishu?.enabled,\n appId: characterFeishu?.appId,\n appSecret: characterFeishu?.appSecret,\n appSecretFile: characterFeishu?.appSecretFile,\n encryptKey: characterFeishu?.encryptKey,\n verificationToken: characterFeishu?.verificationToken,\n apiUrl: characterFeishu?.apiUrl,\n dmPolicy: characterFeishu?.dmPolicy,\n groupPolicy: characterFeishu?.groupPolicy,\n mediaMaxMb: characterFeishu?.mediaMaxMb,\n textChunkLimit: characterFeishu?.textChunkLimit,\n webhookPath: characterFeishu?.webhookPath,\n accounts: characterFeishu?.accounts,\n groups: characterFeishu?.groups,\n };\n}\n\n/**\n * Lists all configured account IDs\n */\nexport function listFeishuAccountIds(runtime: IAgentRuntime): string[] {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n const ids = new Set<string>();\n\n // Check if default account is configured\n const envAppId = runtime.getSetting(\"FEISHU_APP_ID\") as string | undefined;\n const envAppSecret = runtime.getSetting(\"FEISHU_APP_SECRET\") as\n | string\n | undefined;\n\n const baseConfigured = Boolean(\n config.appId?.trim() && (config.appSecret?.trim() || config.appSecretFile),\n );\n const envConfigured = Boolean(envAppId?.trim() && envAppSecret?.trim());\n\n if (baseConfigured || envConfigured) {\n ids.add(DEFAULT_ACCOUNT_ID);\n }\n\n // Add named accounts\n if (accounts && typeof accounts === \"object\") {\n for (const id of Object.keys(accounts)) {\n if (id) {\n ids.add(normalizeAccountId(id));\n }\n }\n }\n\n const result = Array.from(ids);\n if (result.length === 0) {\n return [DEFAULT_ACCOUNT_ID];\n }\n\n return result.toSorted((a, b) => a.localeCompare(b));\n}\n\n/**\n * Resolves the default account ID to use\n */\nexport function resolveDefaultFeishuAccountId(runtime: IAgentRuntime): string {\n const ids = listFeishuAccountIds(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): FeishuAccountConfig | undefined {\n const config = getMultiAccountConfig(runtime);\n const accounts = config.accounts;\n\n if (!accounts || typeof accounts !== \"object\") {\n return undefined;\n }\n\n // Try direct match first\n const direct = accounts[accountId];\n if (direct) {\n return direct;\n }\n\n // Try normalized match\n const normalized = normalizeAccountId(accountId);\n const matchKey = Object.keys(accounts).find(\n (key) => normalizeAccountId(key) === normalized,\n );\n return matchKey ? accounts[matchKey] : undefined;\n}\n\n/**\n * Merges base configuration with account-specific overrides\n */\nfunction mergeFeishuAccountConfig(\n runtime: IAgentRuntime,\n accountId: string,\n): FeishuAccountConfig {\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 envAppId = runtime.getSetting(\"FEISHU_APP_ID\") as string | undefined;\n const envAppSecret = runtime.getSetting(\"FEISHU_APP_SECRET\") as\n | string\n | undefined;\n const envEncryptKey = runtime.getSetting(\"FEISHU_ENCRYPT_KEY\") as\n | string\n | undefined;\n const envVerificationToken = runtime.getSetting(\n \"FEISHU_VERIFICATION_TOKEN\",\n ) as string | undefined;\n const envDmPolicy = runtime.getSetting(\"FEISHU_DM_POLICY\") as\n | string\n | undefined;\n const envGroupPolicy = runtime.getSetting(\"FEISHU_GROUP_POLICY\") as\n | string\n | undefined;\n\n const envConfig: FeishuAccountConfig = {\n appId: envAppId || undefined,\n appSecret: envAppSecret || undefined,\n encryptKey: envEncryptKey || undefined,\n verificationToken: envVerificationToken || undefined,\n dmPolicy: envDmPolicy as FeishuAccountConfig[\"dmPolicy\"] | undefined,\n groupPolicy: envGroupPolicy as\n | FeishuAccountConfig[\"groupPolicy\"]\n | undefined,\n };\n\n // Merge order: env defaults < base config < account config\n return {\n ...envConfig,\n ...baseConfig,\n ...accountConfig,\n };\n}\n\n/**\n * Resolves a complete Feishu account configuration\n */\nexport function resolveFeishuAccount(\n runtime: IAgentRuntime,\n accountId?: string | null,\n): ResolvedFeishuAccount {\n const normalizedAccountId = normalizeAccountId(accountId);\n const multiConfig = getMultiAccountConfig(runtime);\n\n const baseEnabled = multiConfig.enabled !== false;\n const merged = mergeFeishuAccountConfig(runtime, normalizedAccountId);\n const accountEnabled = merged.enabled !== false;\n const enabled = baseEnabled && accountEnabled;\n\n const appId = merged.appId?.trim() || \"\";\n const appSecret = merged.appSecret?.trim() || \"\";\n\n // Determine token source\n let tokenSource: FeishuTokenSource = \"none\";\n if (merged.appSecret?.trim()) {\n tokenSource = \"config\";\n } else {\n const envAppSecret = runtime.getSetting(\"FEISHU_APP_SECRET\") as\n | string\n | undefined;\n if (envAppSecret?.trim()) {\n tokenSource = \"env\";\n }\n }\n\n if (!appId || !appSecret) {\n tokenSource = \"none\";\n }\n\n // Determine if this account is actually configured\n const configured = Boolean(appId && appSecret);\n\n const name = merged.name?.trim() || merged.botName?.trim() || undefined;\n\n return {\n accountId: normalizedAccountId,\n enabled,\n name,\n appId,\n appSecret,\n tokenSource,\n configured,\n config: merged,\n };\n}\n\n/**\n * Lists all enabled Feishu accounts\n */\nexport function listEnabledFeishuAccounts(\n runtime: IAgentRuntime,\n): ResolvedFeishuAccount[] {\n return listFeishuAccountIds(runtime)\n .map((accountId) => resolveFeishuAccount(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 = listEnabledFeishuAccounts(runtime);\n return accounts.length > 1;\n}\n\n/**\n * Resolves group configuration for a specific group\n */\nexport function resolveFeishuGroupConfig(\n runtime: IAgentRuntime,\n accountId: string,\n groupId: string,\n): FeishuGroupConfig | undefined {\n const multiConfig = getMultiAccountConfig(runtime);\n const accountConfig = getAccountConfig(runtime, accountId);\n\n // Check account-level groups first\n const accountGroup = accountConfig?.groups?.[groupId];\n if (accountGroup) {\n return accountGroup;\n }\n\n // Fall back to base-level groups\n return multiConfig.groups?.[groupId];\n}\n\n/**\n * Checks if a user is allowed based on policy and allowlist\n */\nexport function isFeishuUserAllowed(params: {\n userId: string;\n accountConfig: FeishuAccountConfig;\n isGroup: boolean;\n groupId?: string;\n groupConfig?: FeishuGroupConfig;\n}): boolean {\n const { userId, accountConfig, isGroup, groupConfig } = params;\n\n if (isGroup) {\n const policy = accountConfig.groupPolicy ?? \"allowlist\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n // Check group-specific allowlist first\n if (groupConfig?.allowFrom?.length) {\n return groupConfig.allowFrom.some(\n (allowed) => String(allowed) === userId,\n );\n }\n\n // Check account-level group allowlist\n if (accountConfig.groupAllowFrom?.length) {\n return accountConfig.groupAllowFrom.some(\n (allowed) => String(allowed) === userId,\n );\n }\n\n return policy !== \"allowlist\";\n }\n\n // DM handling\n const policy = accountConfig.dmPolicy ?? \"pairing\";\n if (policy === \"disabled\") {\n return false;\n }\n\n if (policy === \"open\") {\n return true;\n }\n\n if (policy === \"pairing\") {\n return true;\n }\n\n // Allowlist policy\n if (accountConfig.allowFrom?.length) {\n return accountConfig.allowFrom.some(\n (allowed) => String(allowed) === userId,\n );\n }\n\n return false;\n}\n\n/**\n * Checks if mention is required in a group\n */\nexport function isFeishuMentionRequired(params: {\n accountConfig: FeishuAccountConfig;\n groupConfig?: FeishuGroupConfig;\n}): boolean {\n const { groupConfig } = params;\n return groupConfig?.requireMention ?? false;\n}\n",
|
|
13
|
+
"/**\n * Feishu text chunk limit\n */\nexport const FEISHU_TEXT_CHUNK_LIMIT = 4000;\n\n/**\n * Feishu Post (rich text) element types\n */\nexport type FeishuPostElement =\n | { tag: \"text\"; text: string; style?: string[] }\n | { tag: \"a\"; text: string; href: string; style?: string[] }\n | { tag: \"at\"; user_id: string }\n | { tag: \"img\"; image_key: string }\n | { tag: \"media\"; file_key: string }\n | { tag: \"emotion\"; emoji_type: string };\n\n/**\n * A line of Feishu Post content\n */\nexport type FeishuPostLine = FeishuPostElement[];\n\n/**\n * Feishu Post content structure\n */\nexport interface FeishuPostContent {\n zh_cn?: {\n title?: string;\n content: FeishuPostLine[];\n };\n en_us?: {\n title?: string;\n content: FeishuPostLine[];\n };\n}\n\n/**\n * Result of formatting markdown for Feishu\n */\nexport interface FeishuFormattedChunk {\n post: FeishuPostContent;\n text: string;\n}\n\n/**\n * Style state for text formatting\n */\ninterface StyleState {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n code: boolean;\n}\n\n/**\n * Link span information\n */\ninterface LinkSpan {\n start: number;\n end: number;\n href: string;\n text: string;\n}\n\n/**\n * Style span information\n */\ninterface StyleSpan {\n start: number;\n end: number;\n style: \"bold\" | \"italic\" | \"strikethrough\" | \"code\";\n}\n\n/**\n * Intermediate representation of parsed markdown\n */\ninterface MarkdownIR {\n text: string;\n styles: StyleSpan[];\n links: LinkSpan[];\n}\n\n/**\n * Options for text chunking\n */\nexport interface ChunkFeishuTextOpts {\n limit?: number;\n}\n\n/**\n * Parse markdown to intermediate representation\n */\nfunction parseMarkdownToIR(markdown: string): MarkdownIR {\n const styles: StyleSpan[] = [];\n const links: LinkSpan[] = [];\n let text = markdown;\n\n // Process links first [text](url)\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n const linkReplacements: {\n start: number;\n end: number;\n text: string;\n href: string;\n }[] = [];\n\n let linkMatch = linkRegex.exec(markdown);\n while (linkMatch !== null) {\n linkReplacements.push({\n start: linkMatch.index,\n end: linkMatch.index + linkMatch[0].length,\n text: linkMatch[1],\n href: linkMatch[2],\n });\n linkMatch = linkRegex.exec(markdown);\n }\n\n // Apply link replacements in reverse order\n let offset = 0;\n for (const repl of linkReplacements) {\n const before = text.slice(0, repl.start + offset);\n const after = text.slice(repl.end + offset);\n text = before + repl.text + after;\n\n links.push({\n start: repl.start + offset,\n end: repl.start + offset + repl.text.length,\n href: repl.href,\n text: repl.text,\n });\n\n offset += repl.text.length - (repl.end - repl.start);\n }\n\n // Process bold **text** or __text__\n text = processStyle(text, /\\*\\*([^*]+)\\*\\*/g, \"bold\", styles);\n text = processStyle(text, /__([^_]+)__/g, \"bold\", styles);\n\n // Process italic *text* or _text_\n text = processStyle(\n text,\n /(?<!\\*)\\*(?!\\*)([^*]+)(?<!\\*)\\*(?!\\*)/g,\n \"italic\",\n styles,\n );\n text = processStyle(\n text,\n /(?<!_)_(?!_)([^_]+)(?<!_)_(?!_)/g,\n \"italic\",\n styles,\n );\n\n // Process strikethrough ~~text~~\n text = processStyle(text, /~~([^~]+)~~/g, \"strikethrough\", styles);\n\n // Process inline code `text`\n text = processStyle(text, /`([^`]+)`/g, \"code\", styles);\n\n // Process code blocks ```text```\n text = text.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, (_, _lang, code) => {\n const start = text.indexOf(_);\n const trimmedCode = code.trim();\n styles.push({\n start,\n end: start + trimmedCode.length,\n style: \"code\",\n });\n return trimmedCode;\n });\n\n // Remove markdown headers\n text = text.replace(/^#{1,6}\\s+/gm, \"\");\n\n // Remove blockquote markers\n text = text.replace(/^>\\s?/gm, \"| \");\n\n // Clean up\n text = text.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n return { text, styles, links };\n}\n\n/**\n * Process a style pattern and update the text and styles\n */\nfunction processStyle(\n text: string,\n pattern: RegExp,\n style: StyleSpan[\"style\"],\n styles: StyleSpan[],\n): string {\n let result = text;\n const matches: { index: number; fullLength: number; content: string }[] = [];\n\n let match = pattern.exec(text);\n while (match !== null) {\n matches.push({\n index: match.index,\n fullLength: match[0].length,\n content: match[1],\n });\n match = pattern.exec(text);\n }\n\n // Process in reverse to maintain indices\n let offset = 0;\n for (const m of matches) {\n const before = result.slice(0, m.index + offset);\n const after = result.slice(m.index + offset + m.fullLength);\n result = before + m.content + after;\n\n styles.push({\n start: m.index + offset,\n end: m.index + offset + m.content.length,\n style,\n });\n\n offset += m.content.length - m.fullLength;\n }\n\n return result;\n}\n\n/**\n * Build style ranges for quick lookup\n */\nfunction buildStyleRanges(\n styles: StyleSpan[],\n textLength: number,\n): StyleState[] {\n const ranges: StyleState[] = Array(textLength)\n .fill(null)\n .map(() => ({\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n }));\n\n for (const span of styles) {\n for (let i = span.start; i < span.end && i < textLength; i++) {\n switch (span.style) {\n case \"bold\":\n ranges[i].bold = true;\n break;\n case \"italic\":\n ranges[i].italic = true;\n break;\n case \"strikethrough\":\n ranges[i].strikethrough = true;\n break;\n case \"code\":\n ranges[i].code = true;\n break;\n }\n }\n }\n\n return ranges;\n}\n\n/**\n * Build link map for quick lookup\n */\nfunction buildLinkMap(links: LinkSpan[]): Map<number, string> {\n const map = new Map<number, string>();\n for (const link of links) {\n for (let i = link.start; i < link.end; i++) {\n map.set(i, link.href);\n }\n }\n return map;\n}\n\n/**\n * Get styles at a specific position\n */\nfunction getStylesAt(ranges: StyleState[], pos: number): StyleState {\n return (\n ranges[pos] ?? {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n }\n );\n}\n\n/**\n * Get link at a specific position\n */\nfunction getLinkAt(\n linkMap: Map<number, string>,\n pos: number,\n): string | undefined {\n return linkMap.get(pos);\n}\n\n/**\n * Check if two style states are equal\n */\nfunction stylesEqual(a: StyleState, b: StyleState): boolean {\n return (\n a.bold === b.bold &&\n a.italic === b.italic &&\n a.strikethrough === b.strikethrough &&\n a.code === b.code\n );\n}\n\n/**\n * Create a Feishu Post element\n */\nfunction createPostElement(\n text: string,\n styles: StyleState,\n link?: string,\n): FeishuPostElement {\n const styleArray: string[] = [];\n\n if (styles.bold) {\n styleArray.push(\"bold\");\n }\n if (styles.italic) {\n styleArray.push(\"italic\");\n }\n if (styles.strikethrough) {\n styleArray.push(\"lineThrough\");\n }\n if (styles.code) {\n styleArray.push(\"code\");\n }\n\n if (link) {\n return {\n tag: \"a\",\n text,\n href: link,\n ...(styleArray.length > 0 ? { style: styleArray } : {}),\n };\n }\n\n return {\n tag: \"text\",\n text,\n ...(styleArray.length > 0 ? { style: styleArray } : {}),\n };\n}\n\n/**\n * Render markdown IR to Feishu Post format\n */\nfunction renderFeishuPost(ir: MarkdownIR): FeishuPostContent {\n const lines: FeishuPostLine[] = [];\n const text = ir.text;\n\n if (!text) {\n return { zh_cn: { content: [[{ tag: \"text\", text: \"\" }]] } };\n }\n\n const styleRanges = buildStyleRanges(ir.styles, text.length);\n const linkMap = buildLinkMap(ir.links);\n\n const textLines = text.split(\"\\n\");\n let charIndex = 0;\n\n for (const line of textLines) {\n const lineElements: FeishuPostElement[] = [];\n\n if (line.length === 0) {\n lineElements.push({ tag: \"text\", text: \"\" });\n } else {\n let segmentStart = charIndex;\n let currentStyles = getStylesAt(styleRanges, segmentStart);\n let currentLink = getLinkAt(linkMap, segmentStart);\n\n for (let i = 0; i < line.length; i++) {\n const pos = charIndex + i;\n const newStyles = getStylesAt(styleRanges, pos);\n const newLink = getLinkAt(linkMap, pos);\n\n const stylesChanged = !stylesEqual(currentStyles, newStyles);\n const linkChanged = currentLink !== newLink;\n\n if (stylesChanged || linkChanged) {\n const segmentText = text.slice(segmentStart, pos);\n if (segmentText) {\n lineElements.push(\n createPostElement(segmentText, currentStyles, currentLink),\n );\n }\n segmentStart = pos;\n currentStyles = newStyles;\n currentLink = newLink;\n }\n }\n\n const finalText = text.slice(segmentStart, charIndex + line.length);\n if (finalText) {\n lineElements.push(\n createPostElement(finalText, currentStyles, currentLink),\n );\n }\n }\n\n lines.push(\n lineElements.length > 0 ? lineElements : [{ tag: \"text\", text: \"\" }],\n );\n charIndex += line.length + 1;\n }\n\n return {\n zh_cn: {\n content: lines,\n },\n };\n}\n\n/**\n * Convert markdown to Feishu Post format\n */\nexport function markdownToFeishuPost(markdown: string): FeishuPostContent {\n const ir = parseMarkdownToIR(markdown ?? \"\");\n return renderFeishuPost(ir);\n}\n\n/**\n * Splits text at the last safe break point within the limit\n */\nfunction splitAtBreakPoint(\n text: string,\n limit: number,\n): { chunk: string; remainder: string } {\n if (text.length <= limit) {\n return { chunk: text, remainder: \"\" };\n }\n\n const searchArea = text.slice(0, limit);\n\n // Prefer double newlines (paragraph breaks)\n const doubleNewline = searchArea.lastIndexOf(\"\\n\\n\");\n if (doubleNewline > limit * 0.5) {\n return {\n chunk: text.slice(0, doubleNewline).trimEnd(),\n remainder: text.slice(doubleNewline + 2).trimStart(),\n };\n }\n\n // Try single newlines\n const singleNewline = searchArea.lastIndexOf(\"\\n\");\n if (singleNewline > limit * 0.5) {\n return {\n chunk: text.slice(0, singleNewline).trimEnd(),\n remainder: text.slice(singleNewline + 1).trimStart(),\n };\n }\n\n // Try sentence boundaries\n const sentenceEnd = Math.max(\n searchArea.lastIndexOf(\". \"),\n searchArea.lastIndexOf(\"! \"),\n searchArea.lastIndexOf(\"? \"),\n );\n if (sentenceEnd > limit * 0.5) {\n return {\n chunk: text.slice(0, sentenceEnd + 1).trimEnd(),\n remainder: text.slice(sentenceEnd + 2).trimStart(),\n };\n }\n\n // Try word boundaries\n const space = searchArea.lastIndexOf(\" \");\n if (space > limit * 0.5) {\n return {\n chunk: text.slice(0, space).trimEnd(),\n remainder: text.slice(space + 1).trimStart(),\n };\n }\n\n // Hard break at limit\n return {\n chunk: text.slice(0, limit),\n remainder: text.slice(limit),\n };\n}\n\n/**\n * Chunk text for Feishu messages\n */\nexport function chunkFeishuText(\n text: string,\n opts: ChunkFeishuTextOpts = {},\n): string[] {\n const limit = opts.limit ?? FEISHU_TEXT_CHUNK_LIMIT;\n\n if (!text?.trim()) {\n return [];\n }\n\n const normalizedText = text.trim();\n if (normalizedText.length <= limit) {\n return [normalizedText];\n }\n\n const chunks: string[] = [];\n let remaining = normalizedText;\n\n while (remaining.length > 0) {\n const { chunk, remainder } = splitAtBreakPoint(remaining, limit);\n if (chunk) {\n chunks.push(chunk);\n }\n remaining = remainder;\n }\n\n return chunks.filter((c) => c.length > 0);\n}\n\n/**\n * Convert markdown to Feishu Post chunks\n */\nexport function markdownToFeishuChunks(\n markdown: string,\n limit: number = FEISHU_TEXT_CHUNK_LIMIT,\n): FeishuFormattedChunk[] {\n const textChunks = chunkFeishuText(markdown, { limit });\n return textChunks.map((chunk) => ({\n post: markdownToFeishuPost(chunk),\n text: chunk,\n }));\n}\n\n/**\n * Check if text contains markdown formatting\n */\nexport function containsMarkdown(text: string): boolean {\n if (!text) {\n return false;\n }\n const markdownPatterns = [\n /\\*\\*[^*]+\\*\\*/,\n /\\*[^*]+\\*/,\n /~~[^~]+~~/,\n /`[^`]+`/,\n /```[\\s\\S]*```/,\n /\\[.+\\]\\(.+\\)/,\n /^#{1,6}\\s/m,\n /^[-*]\\s/m,\n /^\\d+\\.\\s/m,\n ];\n return markdownPatterns.some((pattern) => pattern.test(text));\n}\n\n/**\n * Strip markdown formatting from text\n */\nexport function stripMarkdown(text: string): string {\n let result = text;\n\n // Remove bold\n result = result.replace(/\\*\\*(.+?)\\*\\*/g, \"$1\");\n result = result.replace(/__(.+?)__/g, \"$1\");\n\n // Remove italic\n result = result.replace(/(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, \"$1\");\n result = result.replace(/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g, \"$1\");\n\n // Remove strikethrough\n result = result.replace(/~~(.+?)~~/g, \"$1\");\n\n // Remove headers\n result = result.replace(/^#{1,6}\\s+(.+)$/gm, \"$1\");\n\n // Remove blockquotes\n result = result.replace(/^>\\s?(.*)$/gm, \"$1\");\n\n // Remove code blocks\n result = result.replace(/```(\\w*)\\n?([\\s\\S]*?)```/g, \"$2\");\n\n // Remove inline code\n result = result.replace(/`([^`]+)`/g, \"$1\");\n\n // Remove links - keep text\n result = result.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\");\n\n // Clean up\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n result = result.trim();\n\n return result;\n}\n\n/**\n * Format Feishu user mention\n */\nexport function formatFeishuUserMention(userId: string): string {\n return `<at user_id=\"${userId}\"></at>`;\n}\n\n/**\n * Format Feishu user mention for all users\n */\nexport function formatFeishuAtAll(): string {\n return '<at user_id=\"all\"></at>';\n}\n\n/**\n * Truncate text to a maximum length\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n if (maxLength <= 3) {\n return \"...\".slice(0, maxLength);\n }\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\n/**\n * Resolve system location for logging\n */\nexport function resolveFeishuSystemLocation(params: {\n chatType: \"p2p\" | \"group\";\n chatId: string;\n chatName?: string;\n}): string {\n const { chatType, chatId, chatName } = params;\n const name = chatName || chatId.slice(0, 8);\n return `Feishu ${chatType}:${name}`;\n}\n\n/**\n * Check if chat is a group chat\n */\nexport function isGroupChat(chatType: string): boolean {\n return chatType === \"group\";\n}\n",
|
|
14
|
+
"import type { Plugin } from \"@elizaos/core\";\nimport { SEND_MESSAGE_ACTION, sendMessageAction } from \"./actions\";\nimport { FEISHU_SERVICE_NAME } from \"./constants\";\nimport { MessageManager } from \"./messageManager\";\nimport { CHAT_STATE_PROVIDER, chatStateProvider } from \"./providers\";\nimport { FeishuService } from \"./service\";\n\nconst feishuPlugin: Plugin = {\n name: FEISHU_SERVICE_NAME,\n description: \"Feishu/Lark client plugin for elizaOS\",\n services: [FeishuService],\n actions: [sendMessageAction],\n providers: [chatStateProvider],\n tests: [],\n};\n\nexport {\n FeishuService,\n MessageManager,\n sendMessageAction,\n SEND_MESSAGE_ACTION,\n chatStateProvider,\n CHAT_STATE_PROVIDER,\n FEISHU_SERVICE_NAME,\n};\n\n// Account management exports\nexport {\n DEFAULT_ACCOUNT_ID,\n type FeishuAccountConfig,\n type FeishuGroupConfig,\n type FeishuMultiAccountConfig,\n type FeishuTokenSource,\n isFeishuMentionRequired,\n isFeishuUserAllowed,\n isMultiAccountEnabled,\n listEnabledFeishuAccounts,\n listFeishuAccountIds,\n normalizeAccountId,\n type ResolvedFeishuAccount,\n resolveDefaultFeishuAccountId,\n resolveFeishuAccount,\n resolveFeishuGroupConfig,\n} from \"./accounts\";\nexport * from \"./constants\";\nexport * from \"./environment\";\n// Formatting exports\nexport {\n type ChunkFeishuTextOpts,\n chunkFeishuText,\n containsMarkdown,\n FEISHU_TEXT_CHUNK_LIMIT,\n type FeishuFormattedChunk,\n type FeishuPostContent,\n type FeishuPostElement,\n type FeishuPostLine,\n formatFeishuAtAll,\n formatFeishuUserMention,\n isGroupChat,\n markdownToFeishuChunks,\n markdownToFeishuPost,\n resolveFeishuSystemLocation,\n stripMarkdown,\n truncateText,\n} from \"./formatting\";\nexport * from \"./types\";\n\nexport default feishuPlugin;\n"
|
|
15
|
+
],
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "B56498A90F39E45564756E2164756E21",
|
|
18
|
+
"names": []
|
|
19
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type IAgentRuntime } from "@elizaos/core";
|
|
2
|
+
import type * as lark from "@larksuiteoapi/node-sdk";
|
|
3
|
+
import type { FeishuConfig } from "./environment";
|
|
4
|
+
import type { FeishuEventData, FeishuMessageContent } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Manages message handling for the Feishu service.
|
|
7
|
+
*/
|
|
8
|
+
export declare class MessageManager {
|
|
9
|
+
private client;
|
|
10
|
+
private runtime;
|
|
11
|
+
private config;
|
|
12
|
+
private processedMessages;
|
|
13
|
+
private botOpenId;
|
|
14
|
+
constructor(client: lark.Client, runtime: IAgentRuntime, config: FeishuConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Sets the bot's open ID for mention detection.
|
|
17
|
+
*/
|
|
18
|
+
setBotOpenId(openId: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Handles incoming message events.
|
|
21
|
+
*/
|
|
22
|
+
handleMessage(event: FeishuEventData): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Sends a message to a chat.
|
|
25
|
+
*/
|
|
26
|
+
sendMessage(chatId: string, content: FeishuMessageContent): Promise<string[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Replies to a specific message.
|
|
29
|
+
*/
|
|
30
|
+
replyToMessage(messageId: string, content: FeishuMessageContent): Promise<string[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Parses sender information from an event.
|
|
33
|
+
*/
|
|
34
|
+
private parseSender;
|
|
35
|
+
/**
|
|
36
|
+
* Parses message content to extract text.
|
|
37
|
+
*/
|
|
38
|
+
private parseMessageContent;
|
|
39
|
+
/**
|
|
40
|
+
* Extracts plain text from a rich text (post) message.
|
|
41
|
+
*/
|
|
42
|
+
private extractTextFromPost;
|
|
43
|
+
/**
|
|
44
|
+
* Checks if the bot is mentioned in the message.
|
|
45
|
+
*/
|
|
46
|
+
private isBotMentioned;
|
|
47
|
+
/**
|
|
48
|
+
* Splits a long message into chunks.
|
|
49
|
+
*/
|
|
50
|
+
private splitMessage;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=messageManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../src/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAGV,eAAe,EAEf,oBAAoB,EAGrB,MAAM,SAAS,CAAC;AAGjB;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,SAAS,CAAuB;gBAGtC,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY;IAOtB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA4G1D;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC;IAgEpB;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC;IA6BpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAqDrB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Provider } from "@elizaos/core";
|
|
2
|
+
export declare const CHAT_STATE_PROVIDER = "FEISHU_CHAT_STATE";
|
|
3
|
+
/**
|
|
4
|
+
* Provider that supplies Feishu chat state information to the agent.
|
|
5
|
+
*/
|
|
6
|
+
export declare const chatStateProvider: Provider;
|
|
7
|
+
//# sourceMappingURL=chatState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatState.d.ts","sourceRoot":"","sources":["../../src/providers/chatState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,QAAQ,EAGT,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAsC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Content, type IAgentRuntime, Service, type TargetInfo } from "@elizaos/core";
|
|
2
|
+
import { MessageManager } from "./messageManager";
|
|
3
|
+
/**
|
|
4
|
+
* Feishu service for ElizaOS.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FeishuService extends Service {
|
|
7
|
+
static serviceType: string;
|
|
8
|
+
capabilityDescription: string;
|
|
9
|
+
private client;
|
|
10
|
+
private wsClient;
|
|
11
|
+
messageManager: MessageManager | null;
|
|
12
|
+
private feishuConfig;
|
|
13
|
+
private botOpenId;
|
|
14
|
+
private knownChats;
|
|
15
|
+
constructor(runtime?: IAgentRuntime);
|
|
16
|
+
static start(runtime: IAgentRuntime): Promise<Service>;
|
|
17
|
+
static stop(runtime: IAgentRuntime): Promise<void>;
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Initializes the bot and fetches bot information.
|
|
21
|
+
*/
|
|
22
|
+
private initializeBot;
|
|
23
|
+
/**
|
|
24
|
+
* Sets up WebSocket connection for receiving events.
|
|
25
|
+
*/
|
|
26
|
+
private setupWebSocket;
|
|
27
|
+
/**
|
|
28
|
+
* Handles incoming message events.
|
|
29
|
+
*/
|
|
30
|
+
private handleMessageEvent;
|
|
31
|
+
/**
|
|
32
|
+
* Handles bot added to chat events.
|
|
33
|
+
*/
|
|
34
|
+
private handleBotAddedEvent;
|
|
35
|
+
/**
|
|
36
|
+
* Handles bot removed from chat events.
|
|
37
|
+
*/
|
|
38
|
+
private handleBotRemovedEvent;
|
|
39
|
+
/**
|
|
40
|
+
* Handles user added to chat events.
|
|
41
|
+
*/
|
|
42
|
+
private handleUserAddedEvent;
|
|
43
|
+
/**
|
|
44
|
+
* Handles user removed from chat events.
|
|
45
|
+
*/
|
|
46
|
+
private handleUserRemovedEvent;
|
|
47
|
+
/**
|
|
48
|
+
* Registers send handlers for the service.
|
|
49
|
+
*/
|
|
50
|
+
static registerSendHandlers(runtime: IAgentRuntime, serviceInstance: FeishuService): void;
|
|
51
|
+
/**
|
|
52
|
+
* Handles sending messages through the service.
|
|
53
|
+
*/
|
|
54
|
+
handleSendMessage(runtime: IAgentRuntime, target: TargetInfo, content: Content): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
//# 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,OAAO,EAIZ,KAAK,aAAa,EAGlB,OAAO,EACP,KAAK,UAAU,EAGhB,MAAM,eAAe,CAAC;AAQvB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD;;GAEG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,SAAuB;IACzC,qBAAqB,SAC6C;IAElE,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAA8B;IACvC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAQ;IACpD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAsC;gBAE5C,OAAO,CAAC,EAAE,aAAa;WAkCtB,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;WA+C/C,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;YACW,aAAa;IAiD3B;;OAEG;YACW,cAAc;IAgD5B;;OAEG;YACW,kBAAkB;IAKhC;;OAEG;YACW,mBAAmB;IA2EjC;;OAEG;YACW,qBAAqB;IA6BnC;;OAEG;YACW,oBAAoB;IAmClC;;OAEG;YACW,sBAAsB;IAmCpC;;OAEG;IACH,MAAM,CAAC,oBAAoB,CACzB,OAAO,EAAE,aAAa,EACtB,eAAe,EAAE,aAAa,GAC7B,IAAI;IAcP;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;CAiDjB"}
|