@elizaos/plugin-feishu 2.0.0-alpha → 2.0.0-alpha.4
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/config.d.ts +87 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feishu plugin configuration types.
|
|
3
|
+
*
|
|
4
|
+
* These types define the configuration schema for the Feishu plugin.
|
|
5
|
+
* Shared base types are imported from @elizaos/core.
|
|
6
|
+
*/
|
|
7
|
+
import type { BlockStreamingCoalesceConfig, ChannelHeartbeatVisibilityConfig, DmConfig, DmPolicy, GroupPolicy, GroupToolPolicyBySenderConfig, GroupToolPolicyConfig, MarkdownConfig, ProviderCommandsConfig } from "@elizaos/core";
|
|
8
|
+
export type FeishuReactionNotificationMode = "off" | "own" | "all" | "allowlist";
|
|
9
|
+
export type FeishuActionConfig = {
|
|
10
|
+
reactions?: boolean;
|
|
11
|
+
sendMessage?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type FeishuGroupConfig = {
|
|
14
|
+
requireMention?: boolean;
|
|
15
|
+
tools?: GroupToolPolicyConfig;
|
|
16
|
+
toolsBySender?: GroupToolPolicyBySenderConfig;
|
|
17
|
+
};
|
|
18
|
+
export type FeishuAccountConfig = {
|
|
19
|
+
/** Optional display name for this account (used in CLI/UI lists). */
|
|
20
|
+
name?: string;
|
|
21
|
+
/** Optional provider capability tags used for agent/runtime guidance. */
|
|
22
|
+
capabilities?: string[];
|
|
23
|
+
/** Markdown formatting overrides (tables). */
|
|
24
|
+
markdown?: MarkdownConfig;
|
|
25
|
+
/** Override native command registration for Feishu (bool or "auto"). */
|
|
26
|
+
commands?: ProviderCommandsConfig;
|
|
27
|
+
/** Allow channel-initiated config writes (default: true). */
|
|
28
|
+
configWrites?: boolean;
|
|
29
|
+
/** If false, do not start this Feishu account. Default: true. */
|
|
30
|
+
enabled?: boolean;
|
|
31
|
+
/** Feishu App ID (from developer console). */
|
|
32
|
+
appId?: string;
|
|
33
|
+
/** Feishu App Secret (from developer console). */
|
|
34
|
+
appSecret?: string;
|
|
35
|
+
/** Feishu Verification Token (for webhook validation). */
|
|
36
|
+
verificationToken?: string;
|
|
37
|
+
/** Feishu Encrypt Key (for decrypting message payloads). */
|
|
38
|
+
encryptKey?: string;
|
|
39
|
+
/** Webhook mode: event subscription callback. */
|
|
40
|
+
webhookPath?: string;
|
|
41
|
+
/** WebSocket mode: use Feishu WS push (default: false). */
|
|
42
|
+
useWebSocket?: boolean;
|
|
43
|
+
/** Direct message access policy (default: pairing). */
|
|
44
|
+
dmPolicy?: DmPolicy;
|
|
45
|
+
/** Optional allowlist for Feishu DM senders (open_id). */
|
|
46
|
+
allowFrom?: Array<string | number>;
|
|
47
|
+
/** Optional allowlist for Feishu group senders (open_id). */
|
|
48
|
+
groupAllowFrom?: Array<string | number>;
|
|
49
|
+
/**
|
|
50
|
+
* Controls how group messages are handled:
|
|
51
|
+
* - "open": groups bypass allowFrom, only @mention-gating applies
|
|
52
|
+
* - "disabled": block all group messages
|
|
53
|
+
* - "allowlist": only allow group messages from senders in groupAllowFrom/allowFrom
|
|
54
|
+
*/
|
|
55
|
+
groupPolicy?: GroupPolicy;
|
|
56
|
+
/** Max group messages to keep as history context (0 disables). */
|
|
57
|
+
historyLimit?: number;
|
|
58
|
+
/** Max DM turns to keep as history context. */
|
|
59
|
+
dmHistoryLimit?: number;
|
|
60
|
+
/** Per-DM config overrides keyed by user ID. */
|
|
61
|
+
dms?: Record<string, DmConfig>;
|
|
62
|
+
/** Outbound text chunk size (chars). Default: 4000. */
|
|
63
|
+
textChunkLimit?: number;
|
|
64
|
+
/** Chunking mode: "length" (default) splits by size; "newline" splits on every newline. */
|
|
65
|
+
chunkMode?: "length" | "newline";
|
|
66
|
+
/** Disable block streaming for this account. */
|
|
67
|
+
blockStreaming?: boolean;
|
|
68
|
+
/** Merge streamed block replies before sending. */
|
|
69
|
+
blockStreamingCoalesce?: BlockStreamingCoalesceConfig;
|
|
70
|
+
/** Maximum media file size in MB. Default: 100. */
|
|
71
|
+
mediaMaxMb?: number;
|
|
72
|
+
/** Per-action tool gating. */
|
|
73
|
+
actions?: FeishuActionConfig;
|
|
74
|
+
/** Reaction notification mode (off|own|all|allowlist). Default: off. */
|
|
75
|
+
reactionNotifications?: FeishuReactionNotificationMode;
|
|
76
|
+
/** Allowlist for reaction notifications when mode is allowlist. */
|
|
77
|
+
reactionAllowlist?: Array<string | number>;
|
|
78
|
+
/** Per-group config overrides keyed by chat_id. */
|
|
79
|
+
groups?: Record<string, FeishuGroupConfig>;
|
|
80
|
+
/** Heartbeat visibility settings for this channel. */
|
|
81
|
+
heartbeat?: ChannelHeartbeatVisibilityConfig;
|
|
82
|
+
};
|
|
83
|
+
export type FeishuConfig = {
|
|
84
|
+
/** Optional per-account Feishu configuration (multi-account). */
|
|
85
|
+
accounts?: Record<string, FeishuAccountConfig>;
|
|
86
|
+
} & FeishuAccountConfig;
|
|
87
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,4 +12,5 @@ export * from "./environment";
|
|
|
12
12
|
export { type ChunkFeishuTextOpts, chunkFeishuText, containsMarkdown, FEISHU_TEXT_CHUNK_LIMIT, type FeishuFormattedChunk, type FeishuPostContent, type FeishuPostElement, type FeishuPostLine, formatFeishuAtAll, formatFeishuUserMention, isGroupChat, markdownToFeishuChunks, markdownToFeishuPost, resolveFeishuSystemLocation, stripMarkdown, truncateText, } from "./formatting";
|
|
13
13
|
export * from "./types";
|
|
14
14
|
export default feishuPlugin;
|
|
15
|
+
export type { FeishuActionConfig, FeishuConfig, FeishuReactionNotificationMode, } from "./config";
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,QAAA,MAAM,YAAY,EAAE,MAOnB,CAAC;AAEF,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,CAAC;AAGF,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,6BAA6B,EAC7B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAE9B,OAAO,EACL,KAAK,mBAAmB,EACxB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,cAAc,SAAS,CAAC;AAExB,eAAe,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,QAAA,MAAM,YAAY,EAAE,MAOnB,CAAC;AAEF,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,CAAC;AAGF,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,6BAA6B,EAC7B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAE9B,OAAO,EACL,KAAK,mBAAmB,EACxB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,cAAc,SAAS,CAAC;AAExB,eAAe,YAAY,CAAC;AAG5B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,8BAA8B,GAC/B,MAAM,UAAU,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
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
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
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"
|
|
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\n// Channel configuration types\nexport type {\n FeishuActionConfig,\n FeishuConfig,\n FeishuReactionNotificationMode,\n} from \"./config\";\n"
|
|
15
15
|
],
|
|
16
16
|
"mappings": "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",
|
|
17
17
|
"debugId": "B56498A90F39E45564756E2164756E21",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-feishu",
|
|
3
|
-
"version": "2.0.0-alpha",
|
|
3
|
+
"version": "2.0.0-alpha.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@elizaos/core": "
|
|
21
|
+
"@elizaos/core": "2.0.0-alpha.3",
|
|
22
22
|
"@types/node": "^25.0.3",
|
|
23
23
|
"@larksuiteoapi/node-sdk": "^1.40.0",
|
|
24
24
|
"typescript": "^5.9.3"
|