@aigne/afs-lark 1.11.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/client.ts","../src/index.ts"],"sourcesContent":["/**\n * LarkClient — pure Lark (Feishu) API wrapper.\n *\n * Two modes:\n * - Webhook: outbound-only, POST to Incoming Webhook URL\n * - Bot: bidirectional, send via App Bot API with tenant_access_token\n *\n * Zero external dependencies (uses native fetch).\n * No AFS or application-specific concepts.\n */\n\nconst DEFAULT_API_BASE = \"https://open.feishu.cn/open-apis\";\nconst DEFAULT_TIMEOUT = 30_000;\n\n/** 5-minute buffer before token expiry to trigger refresh */\nconst TOKEN_REFRESH_BUFFER_MS = 300_000;\n\nexport interface LarkBotOptions {\n appId: string;\n appSecret: string;\n apiBase?: string;\n timeout?: number;\n}\n\nexport interface SendMessageOptions {\n /** Reply to a specific message */\n replyTo?: string;\n}\n\n/** Parsed Lark event callback. */\nexport type LarkParsedEvent =\n | { type: \"url_verification\"; challenge: string }\n | {\n type: \"message\";\n messageId: string;\n chatId: string;\n messageType: string;\n content: string;\n senderId: string;\n senderType: string;\n }\n | null;\n\nexport class LarkClient {\n readonly mode: \"webhook\" | \"bot\";\n private readonly _webhookUrl: string | null;\n private readonly _appId: string | null;\n private readonly _appSecret: string | null;\n private readonly _apiBase: string;\n private readonly _timeout: number;\n\n private _tenantAccessToken: string | null = null;\n private _tokenExpiresAt = 0;\n\n private constructor(opts: {\n mode: \"webhook\" | \"bot\";\n webhookUrl?: string;\n appId?: string;\n appSecret?: string;\n apiBase?: string;\n timeout?: number;\n }) {\n this.mode = opts.mode;\n this._webhookUrl = opts.webhookUrl ?? null;\n this._appId = opts.appId ?? null;\n this._appSecret = opts.appSecret ?? null;\n this._apiBase = opts.apiBase ?? DEFAULT_API_BASE;\n this._timeout = opts.timeout ?? DEFAULT_TIMEOUT;\n }\n\n // ─── Factory Methods ──────────────────────────────────────\n\n static webhook(url: string, options?: { timeout?: number }): LarkClient {\n if (!url) throw new Error(\"LarkClient.webhook requires a webhook URL\");\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(\"LarkClient.webhook: invalid webhook URL\");\n }\n\n const isLocal = parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n if (parsed.protocol !== \"https:\" && !isLocal) {\n throw new Error(\"LarkClient.webhook: webhook URL must use HTTPS (or localhost for testing)\");\n }\n\n return new LarkClient({\n mode: \"webhook\",\n webhookUrl: url,\n timeout: options?.timeout,\n });\n }\n\n static bot(options: LarkBotOptions): LarkClient {\n if (!options.appId) throw new Error(\"LarkClient.bot requires an appId\");\n if (!options.appSecret) throw new Error(\"LarkClient.bot requires an appSecret\");\n return new LarkClient({\n mode: \"bot\",\n appId: options.appId,\n appSecret: options.appSecret,\n apiBase: options.apiBase,\n timeout: options.timeout,\n });\n }\n\n // ─── Webhook Mode ─────────────────────────────────────────\n\n async sendWebhook(text: string): Promise<void> {\n if (!this._webhookUrl) throw new Error(\"sendWebhook requires webhook mode\");\n\n const payload = {\n msg_type: \"text\",\n content: { text },\n };\n\n const response = await fetch(this._webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(this._timeout),\n });\n\n if (!response.ok) {\n const desc = await response.text().catch(() => \"\");\n throw new Error(`Lark webhook error ${response.status}: ${desc}`);\n }\n }\n\n // ─── Bot Mode ─────────────────────────────────────────────\n\n async sendMessage(\n chatId: string,\n text: string,\n options?: SendMessageOptions,\n ): Promise<{ messageId: string }> {\n await this._ensureToken();\n\n const body: Record<string, unknown> = {\n receive_id: chatId,\n content: JSON.stringify({ text }),\n msg_type: \"text\",\n };\n\n if (options?.replyTo) {\n // Lark uses reply_in_thread or root_id for threading; we use the simpler approach\n body.reply_in_thread = true;\n }\n\n const response = await fetch(`${this._apiBase}/im/v1/messages?receive_id_type=chat_id`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this._tenantAccessToken}`,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this._timeout),\n });\n\n if (!response.ok) {\n const desc = await response.text().catch(() => \"\");\n const safeDesc = this._appSecret ? desc.replace(this._appSecret, \"***\") : desc;\n throw new Error(`Lark API error ${response.status}: ${safeDesc}`);\n }\n\n const data = (await response.json()) as {\n code: number;\n msg: string;\n data?: { message_id: string };\n };\n\n if (data.code !== 0) {\n throw new Error(`Lark API error: ${data.msg} (code ${data.code})`);\n }\n\n return { messageId: data.data?.message_id ?? \"\" };\n }\n\n // ─── Events API Parsing ───────────────────────────────────\n\n static parseEvent(payload: any): LarkParsedEvent {\n if (!payload) return null;\n\n // URL verification challenge\n if (payload.type === \"url_verification\" && payload.challenge) {\n return { type: \"url_verification\", challenge: payload.challenge };\n }\n\n // Event callback v2 format\n const header = payload.header ?? payload.schema;\n const event = payload.event;\n if (!event) return null;\n\n const eventType = header?.event_type ?? payload.event_type;\n if (eventType !== \"im.message.receive_v1\") return null;\n\n const message = event.message;\n if (!message) return null;\n\n const messageId = message.message_id ?? \"\";\n const chatId = message.chat_id ?? \"\";\n const messageType = message.message_type ?? \"text\";\n\n // Content is a JSON string in Lark\n let content = \"\";\n try {\n const parsed = JSON.parse(message.content ?? \"{}\");\n content = parsed.text ?? \"\";\n } catch {\n content = String(message.content ?? \"\");\n }\n\n const sender = event.sender ?? {};\n const senderId = sender.sender_id?.open_id ?? sender.sender_id?.user_id ?? \"\";\n const senderType = sender.sender_type ?? \"user\";\n\n if (!content.trim() || !senderId) return null;\n\n return {\n type: \"message\",\n messageId,\n chatId,\n messageType,\n content: content.trim(),\n senderId,\n senderType,\n };\n }\n\n // ─── Token Management ─────────────────────────────────────\n\n /** Ensure we have a valid tenant access token, refreshing if needed. */\n private async _ensureToken(): Promise<void> {\n if (this._tenantAccessToken && Date.now() < this._tokenExpiresAt - TOKEN_REFRESH_BUFFER_MS) {\n return;\n }\n\n if (!this._appId || !this._appSecret) {\n throw new Error(\"Token refresh requires bot mode (appId + appSecret)\");\n }\n\n const response = await fetch(`${this._apiBase}/auth/v3/tenant_access_token/internal`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this._appId,\n app_secret: this._appSecret,\n }),\n signal: AbortSignal.timeout(this._timeout),\n });\n\n if (!response.ok) {\n const desc = await response.text().catch(() => \"\");\n throw new Error(`Lark token refresh error ${response.status}: ${desc}`);\n }\n\n const data = (await response.json()) as {\n code: number;\n msg: string;\n tenant_access_token?: string;\n expire?: number;\n };\n\n if (data.code !== 0 || !data.tenant_access_token) {\n throw new Error(`Lark token refresh failed: ${data.msg} (code ${data.code})`);\n }\n\n this._tenantAccessToken = data.tenant_access_token;\n // expire is in seconds\n this._tokenExpiresAt = Date.now() + (data.expire ?? 7200) * 1000;\n }\n\n // ─── Helpers ──────────────────────────────────────────────\n\n static escapeMarkdown(text: string): string {\n return text.replace(/([*_~`|\\\\])/g, \"\\\\$1\");\n }\n}\n","/**\n * AFSLark — AFS provider for Lark (Feishu) Bot API.\n *\n * Extends BaseMessageProvider (Plan 9 model).\n * Path structure (from base):\n * / -> List bots\n * /:botName/ctl -> Bot status\n * /:botName/conversations/:convId/messages -> List messages\n * /:botName/conversations/:convId/messages/:msgId -> Read message\n *\n * Supports two modes:\n * - Webhook mode (outbound only): Send messages via Incoming Webhook\n * - Bot mode (bidirectional): Send via App Bot API + receive event callbacks\n *\n * Additional Lark actions:\n * /.actions/process-event -> Process incoming Lark event callback payload\n *\n * Standard events (from base):\n * messaging:message -> Inbound text message\n * messaging:command -> Inbound /command\n */\n\nimport type { AFSExecResult, AFSListResult, ProviderTreeSchema } from \"@aigne/afs\";\nimport { Actions, type RouteContext } from \"@aigne/afs/provider\";\nimport type {\n BotConfig,\n BufferedMessage,\n MessageCapabilities,\n MessageSender,\n SendOptions,\n} from \"@aigne/afs-messaging\";\nimport { BaseMessageProvider } from \"@aigne/afs-messaging\";\nimport { LarkClient } from \"./client.js\";\n\nexport type { LarkClient, LarkParsedEvent } from \"./client.js\";\n\nexport interface AFSLarkOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n appId?: string;\n appSecret?: string;\n webhook?: string;\n chatIds?: string[];\n apiBase?: string;\n }>;\n /** Single-bot shorthand: webhook URL (outbound only) */\n webhook?: string;\n /** Single-bot shorthand: app ID */\n appId?: string;\n /** Single-bot shorthand: app secret */\n appSecret?: string;\n /** Single-bot shorthand: chat IDs to monitor */\n chatIds?: string[];\n apiBase?: string;\n bufferSize?: number;\n}\n\nexport class AFSLark extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"lark\",\n description:\n \"Lark/Feishu (飞书) messaging — webhook or bot API with auto token refresh.\\n- Webhook mode for simple outbound notifications\\n- Bot mode with app credentials for bidirectional messaging\\n- Path: /:bot/conversations/:chatId/messages/:msgId\",\n uriTemplate: \"lark://{appId}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n appId: { type: \"string\", description: \"Lark App ID\" },\n appSecret: { type: \"string\", description: \"Lark App Secret\", sensitive: true },\n webhook: {\n type: \"string\",\n description: \"Webhook URL for outbound-only mode\",\n sensitive: true,\n },\n chatIds: { type: \"array\", items: { type: \"string\" }, description: \"Chat IDs to monitor\" },\n },\n },\n tags: [\"lark\", \"feishu\", \"messaging\", \"chat\", \"enterprise\"],\n capabilityTags: [\n \"read-write\",\n \"crud\",\n \"search\",\n \"auth:token\",\n \"remote\",\n \"http\",\n \"real-time\",\n \"rate-limited\",\n ],\n security: {\n riskLevel: \"external\",\n resourceAccess: [\"internet\"],\n notes: [\"Connects to Lark/Feishu API — requires app credentials or webhook URL\"],\n },\n capabilities: {\n network: { egress: true, allowedDomains: [\"open.feishu.cn\", \"open.larksuite.com\"] },\n },\n };\n }\n\n static treeSchema(): ProviderTreeSchema {\n return {\n operations: [\"list\", \"read\", \"exec\", \"stat\", \"explain\"],\n tree: {\n \"/\": {\n kind: \"messaging:root\",\n operations: [\"list\", \"exec\"],\n actions: [\"add-bot\", \"remove-bot\", \"process-event\"],\n },\n \"/{bot}\": { kind: \"messaging:bot\", operations: [\"list\", \"read\"] },\n \"/{bot}/ctl\": { kind: \"messaging:status\", operations: [\"read\"] },\n \"/{bot}/conversations\": { kind: \"messaging:conversations\", operations: [\"list\"] },\n \"/{bot}/conversations/{convId}\": { kind: \"messaging:conversation\", operations: [\"list\"] },\n \"/{bot}/conversations/{convId}/messages\": {\n kind: \"messaging:messages\",\n operations: [\"list\", \"exec\"],\n actions: [\"send\"],\n },\n \"/{bot}/conversations/{convId}/messages/{msgId}\": {\n kind: \"messaging:message\",\n operations: [\"read\"],\n },\n },\n auth: { type: \"custom\", env: [\"LARK_APP_ID\", \"LARK_APP_SECRET\"] },\n bestFor: [\"enterprise messaging\", \"workflow alerts\", \"team collaboration\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"lark\";\n readonly eventPrefix = \"lark\";\n\n constructor(options: AFSLarkOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots.map((b) => ({\n ...b,\n conversations: b.chatIds,\n }));\n } else {\n if (!options.appId && !options.webhook) {\n throw new Error(\"AFSLark requires either appId+appSecret or webhook\");\n }\n bots = [\n {\n name: \"default\",\n appId: options.appId,\n appSecret: options.appSecret,\n webhook: options.webhook,\n conversations: options.chatIds ?? [],\n apiBase: options.apiBase,\n },\n ];\n }\n\n super({ bots, bufferSize: options.bufferSize });\n }\n\n // ─── Abstract Implementation ─────────────────────────\n\n getMessageCapabilities(): MessageCapabilities {\n return {\n formats: {\n send: [\"text\", \"markdown\"],\n receive: [\"text\"],\n },\n maxMessageLength: 4096,\n features: {\n edit: false,\n delete: false,\n reply: true,\n thread: true,\n reaction: true,\n inlineKeyboard: true,\n },\n limits: {\n messagesPerSecond: 5,\n },\n };\n }\n\n createBotClient(config: BotConfig): LarkClient {\n const appId = config.appId as string | undefined;\n const appSecret = config.appSecret as string | undefined;\n const webhook = config.webhook as string | undefined;\n const apiBase = config.apiBase as string | undefined;\n\n if (appId && appSecret) {\n return LarkClient.bot({ appId, appSecret, apiBase });\n }\n if (webhook) {\n return LarkClient.webhook(webhook);\n }\n throw new Error(`Lark bot \"${config.name}\" requires appId+appSecret or webhook`);\n }\n\n async sendMessage(\n client: unknown,\n convId: string,\n text: string,\n _opts?: SendOptions,\n ): Promise<{ messageId: string }> {\n const lc = client as LarkClient;\n\n if (lc.mode === \"bot\") {\n return lc.sendMessage(convId, text);\n }\n\n // Webhook mode — can't target specific chat\n await lc.sendWebhook(text);\n return { messageId: String(Date.now()) };\n }\n\n async sendTypingIndicator(_client: unknown, _convId: string): Promise<void> {}\n\n normalizeMessage(raw: Record<string, unknown>): BufferedMessage {\n const msg = raw as any;\n\n // Lark message content is a JSON string\n let text = \"\";\n if (typeof msg.content === \"string\") {\n try {\n const parsed = JSON.parse(msg.content);\n text = parsed.text ?? \"\";\n } catch {\n text = msg.content;\n }\n } else {\n text = String(msg.content ?? msg.text ?? \"\");\n }\n\n return {\n id: String(msg.message_id ?? msg.messageId ?? \"0\"),\n text,\n from: this.normalizeSender(msg.sender ?? {}),\n timestamp: Math.floor(Date.now() / 1000),\n conversationId: String(msg.chat_id ?? msg.chatId ?? \"\"),\n platform: { message_type: msg.message_type ?? msg.messageType },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n const senderId = raw.sender_id as Record<string, unknown> | undefined;\n return {\n id: String(senderId?.open_id ?? raw.open_id ?? raw.id ?? \"0\"),\n name: String(raw.name ?? raw.sender_type ?? \"\"),\n isBot: raw.sender_type === \"app\" ? true : undefined,\n };\n }\n\n // ─── Lark-specific Actions ─────────────────────────\n\n @Actions(\"/\")\n async listRootActions(_ctx: RouteContext): Promise<AFSListResult> {\n return {\n data: [\n this.buildEntry(\"/.actions/add-bot\", {\n meta: { description: \"Add a bot instance at runtime\" },\n }),\n this.buildEntry(\"/.actions/remove-bot\", {\n meta: { description: \"Remove a bot instance\" },\n }),\n this.buildEntry(\"/.actions/process-event\", {\n meta: { description: \"Process an incoming Lark event callback payload\" },\n }),\n ],\n };\n }\n\n @Actions.Exec(\"/\", \"process-event\")\n async execProcessEvent(\n _ctx: RouteContext,\n args: Record<string, unknown>,\n ): Promise<AFSExecResult> {\n const result = this._processEvent(args);\n return { success: true, data: result ?? { ok: true } };\n }\n\n // ─── Event Processing (public for testing) ────────────\n\n /** Process a Lark event callback payload. Returns challenge response for url_verification. */\n _processEvent(payload: any): { ok: true } | { challenge: string } {\n const parsed = LarkClient.parseEvent(payload);\n\n if (!parsed) return { ok: true };\n\n if (parsed.type === \"url_verification\") {\n return { challenge: parsed.challenge };\n }\n\n // Ignore bot messages\n if (parsed.senderType === \"app\") return { ok: true };\n\n const botName = this._botOrder[0] ?? \"default\";\n\n this.emitMessageReceived(botName, {\n id: parsed.messageId,\n text: parsed.content,\n from: { id: parsed.senderId, name: parsed.senderType },\n timestamp: Math.floor(Date.now() / 1000),\n conversationId: parsed.chatId,\n platform: { message_type: parsed.messageType },\n });\n\n return { ok: true };\n }\n\n // ─── Convenience Methods (backward compat) ─────────────\n\n /** Add a chat to a bot. Defaults to first bot. */\n addChat(chatId: string, botName?: string): void {\n const name = botName ?? this._botOrder[0];\n if (!name) return;\n const convs = this._botConversations.get(name);\n if (!convs || convs.has(chatId)) return;\n convs.add(chatId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(chatId)) {\n buffers.set(chatId, []);\n }\n }\n\n /** Remove a chat from a bot. */\n removeChat(chatId: string, botName?: string): void {\n const name = botName ?? this._botOrder[0];\n if (!name) return;\n const convs = this._botConversations.get(name);\n if (convs) convs.delete(chatId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(chatId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n chatId: string,\n msg: {\n messageId: string;\n content: string;\n chatId?: string;\n senderId: string;\n senderName?: string;\n },\n ): void {\n const botName = this._botOrder[0] ?? \"default\";\n\n // Auto-add conversation\n const convs = this._botConversations.get(botName);\n if (convs && !convs.has(chatId)) {\n convs.add(chatId);\n }\n\n // Add to buffer directly (no event emission -- for test setup)\n let botBuffers = this._botBuffers.get(botName);\n if (!botBuffers) {\n botBuffers = new Map();\n this._botBuffers.set(botName, botBuffers);\n }\n let buffer = botBuffers.get(chatId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(chatId, buffer);\n }\n buffer.push({\n id: msg.messageId,\n text: msg.content,\n from: { id: msg.senderId, name: msg.senderName ?? msg.senderId },\n timestamp: Math.floor(Date.now() / 1000),\n conversationId: chatId,\n platform: {},\n });\n while (buffer.length > this._bufferSize) {\n buffer.shift();\n }\n }\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@aigne/afs-lark",
3
+ "version": "1.11.0-beta.12",
4
+ "description": "AIGNE AFS provider for Lark (Feishu)",
5
+ "license": "UNLICENSED",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "author": "Arcblock <blocklet@arcblock.io> https://github.com/arcblock",
10
+ "homepage": "https://github.com/arcblock/afs",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/arcblock/afs"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/arcblock/afs/issues"
17
+ },
18
+ "type": "module",
19
+ "main": "./dist/index.cjs",
20
+ "module": "./dist/index.mjs",
21
+ "types": "./dist/index.d.cts",
22
+ "exports": {
23
+ ".": {
24
+ "require": "./dist/index.cjs",
25
+ "import": "./dist/index.mjs"
26
+ },
27
+ "./*": "./*"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "LICENSE",
32
+ "README.md",
33
+ "CHANGELOG.md"
34
+ ],
35
+ "dependencies": {
36
+ "@aigne/afs": "^1.11.0-beta.12",
37
+ "@aigne/afs-messaging": "^1.11.0-beta.12"
38
+ },
39
+ "devDependencies": {
40
+ "@types/bun": "^1.3.6",
41
+ "npm-run-all": "^4.1.5",
42
+ "rimraf": "^6.1.2",
43
+ "tsdown": "0.20.0-beta.3",
44
+ "typescript": "5.9.2",
45
+ "@aigne/scripts": "0.0.0",
46
+ "@aigne/typescript-config": "0.0.0",
47
+ "@aigne/afs-testing": "1.11.0-beta.12"
48
+ },
49
+ "scripts": {
50
+ "build": "tsdown",
51
+ "check-types": "tsc --noEmit",
52
+ "clean": "rimraf dist coverage",
53
+ "test": "bun test",
54
+ "test:coverage": "bun test --coverage --coverage-reporter=lcov --coverage-reporter=text"
55
+ }
56
+ }