@aigne/afs-dingtalk 1.11.0-beta.12 → 1.11.0-beta.13
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/index.cjs +2 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
package/dist/index.d.cts
CHANGED
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,UAwEmB;IAtEnB,OAAA,WAgIwB;IA9HxB,MAAA,WAoJkC;IAlJlC,SAAA;IACA,aAAA;IACA,aAAA;IACA,UAAA;EAAA;EAuMmB;EApMrB,OAAA;EA+M4B;EA7M5B,MAAA;EA6M2C;EA3M3C,SAAA;EA8NQ;EA5NR,aAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,cAGW,WAAA,SAAoB,mBAAA;EAAA,OACxB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA+CA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,kBAAA;EA0BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,cAAA;EAgB9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,KAAA,GAAQ,WAAA,GACP,OAAA;IAAU,SAAA;EAAA;EAaP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAoBhD,eAAA,CAAgB,GAAA,EAAK,MAAA,oBAA0B,aAAA;EAWzC,eAAA,CAAgB,IAAA,EAAM,YAAA,GAAe,OAAA,CAAQ,aAAA;EAiB7C,gBAAA,CACJ,IAAA,EAAM,YAAA,EACN,IAAA,EAAM,MAAA,oBACL,OAAA,CAAQ,aAAA;EAnDX;EA2DA,aAAA,CAAc,OAAA;EA3DG;EAiFjB,eAAA,CAAgB,cAAA,UAAwB,OAAA;EA7DxC;EA0EA,kBAAA,CAAmB,cAAA,UAAwB,OAAA;EA1E3B;EAoFhB,YAAA,CACE,cAAA,UACA,GAAA;IACE,KAAA;IACA,OAAA;IACA,aAAA;IACA,UAAA;IACA,QAAA;EAAA;AAAA"}
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,kBAAA;EA2BJ;EAzBX,IAAA,GAAO,KAAA;IACL,IAAA,UAwEmB;IAtEnB,OAAA,WAgIwB;IA9HxB,MAAA,WAoJkC;IAlJlC,SAAA;IACA,aAAA;IACA,aAAA;IACA,UAAA;EAAA;EAuMmB;EApMrB,OAAA;EA+M4B;EA7M5B,MAAA;EA6M2C;EA3M3C,SAAA;EA8NQ;EA5NR,aAAA;EACA,aAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,cAGW,WAAA,SAAoB,mBAAA;EAAA,OACxB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA+CA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,kBAAA;EA0BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,cAAA;EAgB9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,KAAA,GAAQ,WAAA,GACP,OAAA;IAAU,SAAA;EAAA;EAaP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAoBhD,eAAA,CAAgB,GAAA,EAAK,MAAA,oBAA0B,aAAA;EAWzC,eAAA,CAAgB,IAAA,EAAM,YAAA,GAAe,OAAA,CAAQ,aAAA;EAiB7C,gBAAA,CACJ,IAAA,EAAM,YAAA,EACN,IAAA,EAAM,MAAA,oBACL,OAAA,CAAQ,aAAA;EAnDX;EA2DA,aAAA,CAAc,OAAA;EA3DG;EAiFjB,eAAA,CAAgB,cAAA,UAAwB,OAAA;EA7DxC;EA0EA,kBAAA,CAAmB,cAAA,UAAwB,OAAA;EA1E3B;EAoFhB,YAAA,CACE,cAAA,UACA,GAAA;IACE,KAAA;IACA,OAAA;IACA,aAAA;IACA,UAAA;IACA,QAAA;EAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * AFSDingTalk — AFS provider for DingTalk (钉钉).\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 Custom Robot webhook\n * - Bot mode (bidirectional): Send via Enterprise Internal Bot + receive outgoing webhook\n *\n * Additional DingTalk actions:\n * /.actions/process-event → Process incoming DingTalk outgoing webhook callback\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 { DingTalkClient } from \"./client.js\";\n\nexport type { DingTalkClient, DingTalkEvent } from \"./client.js\";\n\nexport interface AFSDingTalkOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n /** Webhook access token (Custom Robot mode) */\n webhook?: string;\n /** App key (Enterprise Internal Bot mode) */\n appKey?: string;\n /** App secret (Enterprise Internal Bot mode) */\n appSecret?: string;\n conversations?: string[];\n legacyApiBase?: string;\n newApiBase?: string;\n }>;\n /** Single-bot shorthand: webhook access token */\n webhook?: string;\n /** Single-bot shorthand: app key (bot mode) */\n appKey?: string;\n /** Single-bot shorthand: app secret (bot mode) */\n appSecret?: string;\n /** Single-bot shorthand: conversation IDs */\n conversations?: string[];\n legacyApiBase?: string;\n newApiBase?: string;\n bufferSize?: number;\n}\n\nexport class AFSDingTalk extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"dingtalk\",\n description:\n \"DingTalk (钉钉) 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/:convId/messages/:msgId\",\n uriTemplate: \"dingtalk://{appKey}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n appKey: { type: \"string\", description: \"DingTalk App Key\" },\n appSecret: { type: \"string\", description: \"DingTalk App Secret\", sensitive: true },\n webhook: {\n type: \"string\",\n description: \"Webhook access token for outbound-only mode\",\n sensitive: true,\n },\n conversations: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Conversation IDs\",\n },\n },\n },\n tags: [\"dingtalk\", \"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 DingTalk API — requires app credentials or webhook token\"],\n },\n capabilities: {\n network: { egress: true, allowedDomains: [\"oapi.dingtalk.com\", \"api.dingtalk.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: [\"DINGTALK_APP_KEY\", \"DINGTALK_APP_SECRET\"] },\n bestFor: [\"enterprise messaging\", \"workflow alerts\", \"team notifications\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"dingtalk\";\n readonly eventPrefix = \"dingtalk\";\n\n constructor(options: AFSDingTalkOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots;\n } else {\n if (!options.webhook && !options.appKey) {\n throw new Error(\"AFSDingTalk requires either webhook or appKey + appSecret\");\n }\n bots = [\n {\n name: \"default\",\n webhook: options.webhook,\n appKey: options.appKey,\n appSecret: options.appSecret,\n conversations: options.conversations ?? [],\n legacyApiBase: options.legacyApiBase,\n newApiBase: options.newApiBase,\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: 20000,\n features: {\n edit: false,\n delete: false,\n reply: false,\n thread: false,\n reaction: false,\n inlineKeyboard: true,\n },\n limits: {\n messagesPerSecond: 20,\n messagesPerMinute: 600,\n },\n };\n }\n\n createBotClient(config: BotConfig): DingTalkClient {\n const webhook = config.webhook as string | undefined;\n const appKey = config.appKey as string | undefined;\n const appSecret = config.appSecret as string | undefined;\n const legacyApiBase = config.legacyApiBase as string | undefined;\n const newApiBase = config.newApiBase as string | undefined;\n\n if (appKey && appSecret) {\n return DingTalkClient.bot({ appKey, appSecret, legacyApiBase, newApiBase });\n }\n if (webhook) {\n return DingTalkClient.webhook(webhook);\n }\n throw new Error(`DingTalk bot \"${config.name}\" requires webhook or appKey + appSecret`);\n }\n\n async sendMessage(\n client: unknown,\n convId: string,\n text: string,\n _opts?: SendOptions,\n ): Promise<{ messageId: string }> {\n const dc = client as DingTalkClient;\n\n if (dc.mode === \"bot\") {\n await dc.sendGroupMessage(convId, text);\n return { messageId: String(Date.now()) };\n }\n\n // Webhook mode — can't target specific conversation\n await dc.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 return {\n id: String(msg.msgId ?? msg.id ?? \"0\"),\n text: String(msg.content ?? msg.text?.content ?? \"\"),\n from: this.normalizeSender({\n id: msg.senderStaffId,\n name: msg.senderNick,\n }),\n timestamp: msg.createAt\n ? Math.floor(Number(msg.createAt) / 1000)\n : Math.floor(Date.now() / 1000),\n conversationId: String(msg.conversationId ?? \"\"),\n platform: {\n conversationType: msg.conversationType,\n msgtype: msg.msgtype,\n },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n return {\n id: String(raw.id ?? raw.senderStaffId ?? \"0\"),\n name: String(raw.name ?? raw.senderNick ?? \"\"),\n isBot: raw.isBot as boolean | undefined,\n };\n }\n\n // ─── DingTalk-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 DingTalk outgoing webhook callback\" },\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 this._processEvent(args);\n return { success: true, data: { ok: true } };\n }\n\n // ─── Event Processing (public for testing) ────────────\n\n /** Process a DingTalk outgoing webhook payload — delegates to emitMessageReceived(). */\n _processEvent(payload: any): void {\n const parsed = DingTalkClient.parseEvent(payload);\n if (!parsed) return;\n\n const { msgId, content, conversationId, senderStaffId, senderNick, createAt } = parsed;\n const botName = this._botOrder[0] ?? \"default\";\n\n this.emitMessageReceived(botName, {\n id: msgId,\n text: content,\n from: { id: senderStaffId, name: senderNick },\n timestamp: Math.floor(createAt / 1000),\n conversationId,\n platform: {\n conversationType: parsed.conversationType,\n },\n });\n }\n\n // ─── Convenience Methods (backward compat) ─────────────\n\n /** Add a conversation to a bot. Defaults to first bot. */\n addConversation(conversationId: 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(conversationId)) return;\n convs.add(conversationId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(conversationId)) {\n buffers.set(conversationId, []);\n }\n }\n\n /** Remove a conversation from a bot. */\n removeConversation(conversationId: 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(conversationId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(conversationId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n conversationId: string,\n msg: {\n msgId: string;\n content: string;\n senderStaffId: string;\n senderNick: string;\n createAt?: number;\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(conversationId)) {\n convs.add(conversationId);\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(conversationId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(conversationId, buffer);\n }\n buffer.push({\n id: msg.msgId,\n text: msg.content,\n from: { id: msg.senderStaffId, name: msg.senderNick },\n timestamp: msg.createAt ? Math.floor(msg.createAt / 1000) : Math.floor(Date.now() / 1000),\n conversationId,\n platform: {},\n });\n while (buffer.length > this._bufferSize) {\n buffer.shift();\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * AFSDingTalk — AFS provider for DingTalk (钉钉).\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 Custom Robot webhook\n * - Bot mode (bidirectional): Send via Enterprise Internal Bot + receive outgoing webhook\n *\n * Additional DingTalk actions:\n * /.actions/process-event → Process incoming DingTalk outgoing webhook callback\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 { DingTalkClient } from \"./client.js\";\n\nexport type { DingTalkClient, DingTalkEvent } from \"./client.js\";\n\nexport interface AFSDingTalkOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n /** Webhook access token (Custom Robot mode) */\n webhook?: string;\n /** App key (Enterprise Internal Bot mode) */\n appKey?: string;\n /** App secret (Enterprise Internal Bot mode) */\n appSecret?: string;\n conversations?: string[];\n legacyApiBase?: string;\n newApiBase?: string;\n }>;\n /** Single-bot shorthand: webhook access token */\n webhook?: string;\n /** Single-bot shorthand: app key (bot mode) */\n appKey?: string;\n /** Single-bot shorthand: app secret (bot mode) */\n appSecret?: string;\n /** Single-bot shorthand: conversation IDs */\n conversations?: string[];\n legacyApiBase?: string;\n newApiBase?: string;\n bufferSize?: number;\n}\n\nexport class AFSDingTalk extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"dingtalk\",\n description:\n \"DingTalk (钉钉) 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/:convId/messages/:msgId\",\n uriTemplate: \"dingtalk://{appKey}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n appKey: { type: \"string\", description: \"DingTalk App Key\" },\n appSecret: { type: \"string\", description: \"DingTalk App Secret\", sensitive: true },\n webhook: {\n type: \"string\",\n description: \"Webhook access token for outbound-only mode\",\n sensitive: true,\n },\n conversations: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Conversation IDs\",\n },\n },\n required: [\"appKey\"],\n },\n tags: [\"dingtalk\", \"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 DingTalk API — requires app credentials or webhook token\"],\n },\n capabilities: {\n network: { egress: true, allowedDomains: [\"oapi.dingtalk.com\", \"api.dingtalk.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: [\"DINGTALK_APP_KEY\", \"DINGTALK_APP_SECRET\"] },\n bestFor: [\"enterprise messaging\", \"workflow alerts\", \"team notifications\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"dingtalk\";\n readonly eventPrefix = \"dingtalk\";\n\n constructor(options: AFSDingTalkOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots;\n } else {\n if (!options.webhook && !options.appKey) {\n throw new Error(\"AFSDingTalk requires either webhook or appKey + appSecret\");\n }\n bots = [\n {\n name: \"default\",\n webhook: options.webhook,\n appKey: options.appKey,\n appSecret: options.appSecret,\n conversations: options.conversations ?? [],\n legacyApiBase: options.legacyApiBase,\n newApiBase: options.newApiBase,\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: 20000,\n features: {\n edit: false,\n delete: false,\n reply: false,\n thread: false,\n reaction: false,\n inlineKeyboard: true,\n },\n limits: {\n messagesPerSecond: 20,\n messagesPerMinute: 600,\n },\n };\n }\n\n createBotClient(config: BotConfig): DingTalkClient {\n const webhook = config.webhook as string | undefined;\n const appKey = config.appKey as string | undefined;\n const appSecret = config.appSecret as string | undefined;\n const legacyApiBase = config.legacyApiBase as string | undefined;\n const newApiBase = config.newApiBase as string | undefined;\n\n if (appKey && appSecret) {\n return DingTalkClient.bot({ appKey, appSecret, legacyApiBase, newApiBase });\n }\n if (webhook) {\n return DingTalkClient.webhook(webhook);\n }\n throw new Error(`DingTalk bot \"${config.name}\" requires webhook or appKey + appSecret`);\n }\n\n async sendMessage(\n client: unknown,\n convId: string,\n text: string,\n _opts?: SendOptions,\n ): Promise<{ messageId: string }> {\n const dc = client as DingTalkClient;\n\n if (dc.mode === \"bot\") {\n await dc.sendGroupMessage(convId, text);\n return { messageId: String(Date.now()) };\n }\n\n // Webhook mode — can't target specific conversation\n await dc.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 return {\n id: String(msg.msgId ?? msg.id ?? \"0\"),\n text: String(msg.content ?? msg.text?.content ?? \"\"),\n from: this.normalizeSender({\n id: msg.senderStaffId,\n name: msg.senderNick,\n }),\n timestamp: msg.createAt\n ? Math.floor(Number(msg.createAt) / 1000)\n : Math.floor(Date.now() / 1000),\n conversationId: String(msg.conversationId ?? \"\"),\n platform: {\n conversationType: msg.conversationType,\n msgtype: msg.msgtype,\n },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n return {\n id: String(raw.id ?? raw.senderStaffId ?? \"0\"),\n name: String(raw.name ?? raw.senderNick ?? \"\"),\n isBot: raw.isBot as boolean | undefined,\n };\n }\n\n // ─── DingTalk-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 DingTalk outgoing webhook callback\" },\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 this._processEvent(args);\n return { success: true, data: { ok: true } };\n }\n\n // ─── Event Processing (public for testing) ────────────\n\n /** Process a DingTalk outgoing webhook payload — delegates to emitMessageReceived(). */\n _processEvent(payload: any): void {\n const parsed = DingTalkClient.parseEvent(payload);\n if (!parsed) return;\n\n const { msgId, content, conversationId, senderStaffId, senderNick, createAt } = parsed;\n const botName = this._botOrder[0] ?? \"default\";\n\n this.emitMessageReceived(botName, {\n id: msgId,\n text: content,\n from: { id: senderStaffId, name: senderNick },\n timestamp: Math.floor(createAt / 1000),\n conversationId,\n platform: {\n conversationType: parsed.conversationType,\n },\n });\n }\n\n // ─── Convenience Methods (backward compat) ─────────────\n\n /** Add a conversation to a bot. Defaults to first bot. */\n addConversation(conversationId: 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(conversationId)) return;\n convs.add(conversationId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(conversationId)) {\n buffers.set(conversationId, []);\n }\n }\n\n /** Remove a conversation from a bot. */\n removeConversation(conversationId: 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(conversationId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(conversationId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n conversationId: string,\n msg: {\n msgId: string;\n content: string;\n senderStaffId: string;\n senderNick: string;\n createAt?: number;\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(conversationId)) {\n convs.add(conversationId);\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(conversationId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(conversationId, buffer);\n }\n buffer.push({\n id: msg.msgId,\n text: msg.content,\n from: { id: msg.senderStaffId, name: msg.senderNick },\n timestamp: msg.createAt ? Math.floor(msg.createAt / 1000) : Math.floor(Date.now() / 1000),\n conversationId,\n platform: {},\n });\n while (buffer.length > this._bufferSize) {\n buffer.shift();\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aigne/afs-dingtalk",
|
|
3
|
-
"version": "1.11.0-beta.
|
|
3
|
+
"version": "1.11.0-beta.13",
|
|
4
4
|
"description": "AIGNE AFS provider for DingTalk (钉钉)",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"publishConfig": {
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"CHANGELOG.md"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@aigne/afs": "^1.11.0-beta.
|
|
37
|
-
"@aigne/afs-messaging": "^1.11.0-beta.
|
|
36
|
+
"@aigne/afs": "^1.11.0-beta.13",
|
|
37
|
+
"@aigne/afs-messaging": "^1.11.0-beta.13"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/bun": "^1.3.6",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"typescript": "5.9.2",
|
|
45
45
|
"@aigne/scripts": "0.0.0",
|
|
46
46
|
"@aigne/typescript-config": "0.0.0",
|
|
47
|
-
"@aigne/afs-testing": "1.11.0-beta.
|
|
47
|
+
"@aigne/afs-testing": "1.11.0-beta.13"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsdown",
|