@aigne/afs-slack 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 +8 -3
- package/dist/index.d.cts +7 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +7 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +8 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -9,11 +9,15 @@ var AFSSlack = class extends _aigne_afs_messaging.BaseMessageProvider {
|
|
|
9
9
|
return {
|
|
10
10
|
name: "slack",
|
|
11
11
|
description: "Slack messaging — webhook (outbound) or Bot API (bidirectional).\n- Incoming Webhook for simple notifications\n- Bot token + Events API for full interaction\n- Path: /:bot/conversations/:channelId/messages/:ts",
|
|
12
|
-
uriTemplate: "slack://{
|
|
12
|
+
uriTemplate: "slack://{bot}",
|
|
13
13
|
category: "messaging",
|
|
14
14
|
schema: {
|
|
15
15
|
type: "object",
|
|
16
16
|
properties: {
|
|
17
|
+
bot: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Bot identifier name"
|
|
20
|
+
},
|
|
17
21
|
botToken: {
|
|
18
22
|
type: "string",
|
|
19
23
|
description: "Slack Bot OAuth token",
|
|
@@ -29,7 +33,8 @@ var AFSSlack = class extends _aigne_afs_messaging.BaseMessageProvider {
|
|
|
29
33
|
items: { type: "string" },
|
|
30
34
|
description: "Channel IDs"
|
|
31
35
|
}
|
|
32
|
-
}
|
|
36
|
+
},
|
|
37
|
+
required: ["bot"]
|
|
33
38
|
},
|
|
34
39
|
tags: [
|
|
35
40
|
"slack",
|
|
@@ -126,7 +131,7 @@ var AFSSlack = class extends _aigne_afs_messaging.BaseMessageProvider {
|
|
|
126
131
|
else {
|
|
127
132
|
if (!options.botToken && !options.webhook) throw new Error("AFSSlack requires either botToken or webhook");
|
|
128
133
|
bots = [{
|
|
129
|
-
name: "default",
|
|
134
|
+
name: options.bot ?? "default",
|
|
130
135
|
botToken: options.botToken,
|
|
131
136
|
webhook: options.webhook,
|
|
132
137
|
conversations: options.channels ?? [],
|
package/dist/index.d.cts
CHANGED
|
@@ -13,6 +13,8 @@ interface AFSSlackOptions {
|
|
|
13
13
|
channels?: string[];
|
|
14
14
|
apiBase?: string;
|
|
15
15
|
}>;
|
|
16
|
+
/** Single-bot backward compat: bot identifier name */
|
|
17
|
+
bot?: string;
|
|
16
18
|
/** Single-bot backward compat: webhook URL */
|
|
17
19
|
webhook?: string;
|
|
18
20
|
/** Single-bot backward compat: bot token */
|
|
@@ -31,6 +33,10 @@ declare class AFSSlack extends BaseMessageProvider {
|
|
|
31
33
|
schema: {
|
|
32
34
|
type: string;
|
|
33
35
|
properties: {
|
|
36
|
+
bot: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
34
40
|
botToken: {
|
|
35
41
|
type: string;
|
|
36
42
|
description: string;
|
|
@@ -49,6 +55,7 @@ declare class AFSSlack extends BaseMessageProvider {
|
|
|
49
55
|
description: string;
|
|
50
56
|
};
|
|
51
57
|
};
|
|
58
|
+
required: string[];
|
|
52
59
|
};
|
|
53
60
|
tags: string[];
|
|
54
61
|
capabilityTags: string[];
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,eAAA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,eAAA;EA6DM;EA3DrB,IAAA,GAAO,KAAA;IACL,IAAA;IACA,QAAA;IACA,OAAA;IACA,QAAA;IACA,OAAA;EAAA;EA4KoB;EAzKtB,GAAA;EAqLqB;EAnLrB,OAAA;EA8L4B;EA5L5B,QAAA;EA4L2C;EA1L3C,QAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,cAGW,QAAA,SAAiB,mBAAA;EAAA,OACrB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAuCA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,eAAA;EA2BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,WAAA;EAc9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,IAAA,GAAO,WAAA,GACN,OAAA;IAAU,SAAA;EAAA;EAgBP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAYhD,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;EA7Ce;EAqD1B,aAAA,CAAc,OAAA;EArDgD;EA0E9D,UAAA,CAAW,SAAA,UAAmB,OAAA;EAxER;EAqFtB,aAAA,CAAc,SAAA,UAAmB,OAAA;EArFe;EA+FhD,YAAA,CACE,SAAA,UACA,GAAA;IAAO,EAAA;IAAY,IAAA;IAAc,MAAA;IAAgB,IAAA;EAAA;AAAA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -13,6 +13,8 @@ interface AFSSlackOptions {
|
|
|
13
13
|
channels?: string[];
|
|
14
14
|
apiBase?: string;
|
|
15
15
|
}>;
|
|
16
|
+
/** Single-bot backward compat: bot identifier name */
|
|
17
|
+
bot?: string;
|
|
16
18
|
/** Single-bot backward compat: webhook URL */
|
|
17
19
|
webhook?: string;
|
|
18
20
|
/** Single-bot backward compat: bot token */
|
|
@@ -31,6 +33,10 @@ declare class AFSSlack extends BaseMessageProvider {
|
|
|
31
33
|
schema: {
|
|
32
34
|
type: string;
|
|
33
35
|
properties: {
|
|
36
|
+
bot: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
34
40
|
botToken: {
|
|
35
41
|
type: string;
|
|
36
42
|
description: string;
|
|
@@ -49,6 +55,7 @@ declare class AFSSlack extends BaseMessageProvider {
|
|
|
49
55
|
description: string;
|
|
50
56
|
};
|
|
51
57
|
};
|
|
58
|
+
required: string[];
|
|
52
59
|
};
|
|
53
60
|
tags: string[];
|
|
54
61
|
capabilityTags: string[];
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,eAAA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;UAoCiB,eAAA;EA6DM;EA3DrB,IAAA,GAAO,KAAA;IACL,IAAA;IACA,QAAA;IACA,OAAA;IACA,QAAA;IACA,OAAA;EAAA;EA4KoB;EAzKtB,GAAA;EAqLqB;EAnLrB,OAAA;EA8L4B;EA5L5B,QAAA;EA4L2C;EA1L3C,QAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,cAGW,QAAA,SAAiB,mBAAA;EAAA,OACrB,QAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAuCA,UAAA,CAAA,GAAc,kBAAA;EAAA,SA6BZ,YAAA;EAAA,SACA,WAAA;cAEG,OAAA,EAAS,eAAA;EA2BrB,sBAAA,CAAA,GAA0B,mBAAA;EAsB1B,eAAA,CAAgB,MAAA,EAAQ,SAAA,GAAY,WAAA;EAc9B,WAAA,CACJ,MAAA,WACA,MAAA,UACA,IAAA,UACA,IAAA,GAAO,WAAA,GACN,OAAA;IAAU,SAAA;EAAA;EAgBP,mBAAA,CAAoB,OAAA,WAAkB,OAAA,WAAkB,OAAA;EAE9D,gBAAA,CAAiB,GAAA,EAAK,MAAA,oBAA0B,eAAA;EAYhD,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;EA7Ce;EAqD1B,aAAA,CAAc,OAAA;EArDgD;EA0E9D,UAAA,CAAW,SAAA,UAAmB,OAAA;EAxER;EAqFtB,aAAA,CAAc,SAAA,UAAmB,OAAA;EArFe;EA+FhD,YAAA,CACE,SAAA,UACA,GAAA;IAAO,EAAA;IAAY,IAAA;IAAc,MAAA;IAAgB,IAAA;EAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -9,11 +9,15 @@ var AFSSlack = class extends BaseMessageProvider {
|
|
|
9
9
|
return {
|
|
10
10
|
name: "slack",
|
|
11
11
|
description: "Slack messaging — webhook (outbound) or Bot API (bidirectional).\n- Incoming Webhook for simple notifications\n- Bot token + Events API for full interaction\n- Path: /:bot/conversations/:channelId/messages/:ts",
|
|
12
|
-
uriTemplate: "slack://{
|
|
12
|
+
uriTemplate: "slack://{bot}",
|
|
13
13
|
category: "messaging",
|
|
14
14
|
schema: {
|
|
15
15
|
type: "object",
|
|
16
16
|
properties: {
|
|
17
|
+
bot: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Bot identifier name"
|
|
20
|
+
},
|
|
17
21
|
botToken: {
|
|
18
22
|
type: "string",
|
|
19
23
|
description: "Slack Bot OAuth token",
|
|
@@ -29,7 +33,8 @@ var AFSSlack = class extends BaseMessageProvider {
|
|
|
29
33
|
items: { type: "string" },
|
|
30
34
|
description: "Channel IDs"
|
|
31
35
|
}
|
|
32
|
-
}
|
|
36
|
+
},
|
|
37
|
+
required: ["bot"]
|
|
33
38
|
},
|
|
34
39
|
tags: [
|
|
35
40
|
"slack",
|
|
@@ -126,7 +131,7 @@ var AFSSlack = class extends BaseMessageProvider {
|
|
|
126
131
|
else {
|
|
127
132
|
if (!options.botToken && !options.webhook) throw new Error("AFSSlack requires either botToken or webhook");
|
|
128
133
|
bots = [{
|
|
129
|
-
name: "default",
|
|
134
|
+
name: options.bot ?? "default",
|
|
130
135
|
botToken: options.botToken,
|
|
131
136
|
webhook: options.webhook,
|
|
132
137
|
conversations: options.channels ?? [],
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * AFSSlack — AFS provider for Slack.\n *\n * Extends BaseMessageProvider (Plan 9 model).\n * Path structure (from base):\n * / → List bots\n * /:botName/ctl → Bot status\n * /:botName/conversations/:channelId/messages → List messages\n * /:botName/conversations/:channelId/messages/:ts → Read message\n *\n * Supports two modes:\n * - Webhook mode (outbound only): Send messages via Incoming Webhook\n * - Bot mode (bidirectional): Send via Bot API + receive Events API\n *\n * Additional Slack actions:\n * /.actions/process-event → Process incoming Slack Events API 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 { SlackClient } from \"./client.js\";\n\nexport type { SlackClient } from \"./client.js\";\n\nexport interface AFSSlackOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n botToken?: string;\n webhook?: string;\n channels?: string[];\n apiBase?: string;\n }>;\n /** Single-bot backward compat: webhook URL */\n webhook?: string;\n /** Single-bot backward compat: bot token */\n botToken?: string;\n /** Single-bot backward compat: channel IDs */\n channels?: string[];\n apiBase?: string;\n bufferSize?: number;\n}\n\nexport class AFSSlack extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"slack\",\n description:\n \"Slack messaging — webhook (outbound) or Bot API (bidirectional).\\n- Incoming Webhook for simple notifications\\n- Bot token + Events API for full interaction\\n- Path: /:bot/conversations/:channelId/messages/:ts\",\n uriTemplate: \"slack://{botToken}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n botToken: { type: \"string\", description: \"Slack Bot OAuth token\", sensitive: true },\n webhook: { type: \"string\", description: \"Incoming Webhook URL\", sensitive: true },\n channels: { type: \"array\", items: { type: \"string\" }, description: \"Channel IDs\" },\n },\n },\n tags: [\"slack\", \"messaging\", \"chat\", \"workspace\"],\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 Slack API — requires bot token or webhook URL\"],\n },\n capabilities: {\n network: { egress: true, allowedDomains: [\"slack.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: \"token\", env: [\"SLACK_BOT_TOKEN\"] },\n bestFor: [\"team notifications\", \"workflow alerts\", \"chatops\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"slack\";\n readonly eventPrefix = \"slack\";\n\n constructor(options: AFSSlackOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots.map((b) => ({\n ...b,\n conversations: b.channels,\n }));\n } else {\n if (!options.botToken && !options.webhook) {\n throw new Error(\"AFSSlack requires either botToken or webhook\");\n }\n bots = [\n {\n name: \"default\",\n botToken: options.botToken,\n webhook: options.webhook,\n conversations: options.channels ?? [],\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: 40000,\n features: {\n edit: false,\n delete: false,\n reply: true,\n thread: true,\n reaction: true,\n inlineKeyboard: false,\n },\n limits: {\n messagesPerSecond: 1,\n messagesPerMinute: 60,\n },\n };\n }\n\n createBotClient(config: BotConfig): SlackClient {\n const botToken = config.botToken as string | undefined;\n const webhook = config.webhook as string | undefined;\n const apiBase = config.apiBase as string | undefined;\n\n if (botToken) {\n return SlackClient.bot({ botToken, apiBase });\n }\n if (webhook) {\n return SlackClient.webhook(webhook);\n }\n throw new Error(`Slack bot \"${config.name}\" requires botToken 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 sc = client as SlackClient;\n const blocks = opts?.blocks as unknown[] | undefined;\n // Escape Slack special characters to prevent injection (<!channel>, phishing links, etc.)\n const safeText = SlackClient.escapeSlack(text);\n\n if (sc.mode === \"bot\") {\n const result = await sc.postMessage(convId, safeText, { blocks });\n return { messageId: result.ts };\n }\n\n // Webhook mode — can't target specific channel\n await sc.sendWebhook(safeText, { blocks });\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.ts ?? \"0\"),\n text: String(msg.text ?? \"\"),\n from: this.normalizeSender({ id: msg.userId ?? msg.user }),\n timestamp: Math.floor(Number.parseFloat(String(msg.ts ?? \"0\"))),\n conversationId: String(msg.channelId ?? msg.channel ?? \"\"),\n platform: { ts: msg.ts },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n return {\n id: String(raw.id ?? \"0\"),\n name: String(raw.name ?? raw.id ?? \"\"),\n isBot: raw.isBot as boolean | undefined,\n };\n }\n\n // ─── Slack-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 Slack Events API 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 this._processEvent(args);\n return { success: true, data: { ok: true } };\n }\n\n // ─── Event Processing (public for testing) ────────────\n\n /** Process a Slack Events API payload — delegates to emitMessageReceived(). */\n _processEvent(payload: any): void {\n const parsed = SlackClient.parseEvent(payload);\n if (!parsed) return;\n if (parsed.type === \"url_verification\") return;\n\n const { text, userId, channelId, ts } = parsed;\n const botName = this._botOrder[0] ?? \"default\";\n\n this.emitMessageReceived(botName, {\n id: ts,\n text,\n from: { id: userId, name: userId },\n timestamp: Math.floor(Number.parseFloat(ts)),\n conversationId: channelId,\n platform: { ts, userId },\n });\n }\n\n // ─── Convenience Methods (backward compat) ─────────────\n\n /** Add a channel to a bot. Defaults to first bot. */\n addChannel(channelId: 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(channelId)) return;\n convs.add(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(channelId)) {\n buffers.set(channelId, []);\n }\n }\n\n /** Remove a channel from a bot. */\n removeChannel(channelId: 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(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(channelId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n channelId: string,\n msg: { ts: string; text: string; userId: string; date: number },\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(channelId)) {\n convs.add(channelId);\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(channelId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(channelId, buffer);\n }\n buffer.push({\n id: msg.ts,\n text: msg.text,\n from: { id: msg.userId, name: msg.userId },\n timestamp: msg.date,\n conversationId: channelId,\n platform: { ts: msg.ts },\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 * AFSSlack — AFS provider for Slack.\n *\n * Extends BaseMessageProvider (Plan 9 model).\n * Path structure (from base):\n * / → List bots\n * /:botName/ctl → Bot status\n * /:botName/conversations/:channelId/messages → List messages\n * /:botName/conversations/:channelId/messages/:ts → Read message\n *\n * Supports two modes:\n * - Webhook mode (outbound only): Send messages via Incoming Webhook\n * - Bot mode (bidirectional): Send via Bot API + receive Events API\n *\n * Additional Slack actions:\n * /.actions/process-event → Process incoming Slack Events API 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 { SlackClient } from \"./client.js\";\n\nexport type { SlackClient } from \"./client.js\";\n\nexport interface AFSSlackOptions {\n /** Multi-bot config */\n bots?: Array<{\n name: string;\n botToken?: string;\n webhook?: string;\n channels?: string[];\n apiBase?: string;\n }>;\n /** Single-bot backward compat: bot identifier name */\n bot?: string;\n /** Single-bot backward compat: webhook URL */\n webhook?: string;\n /** Single-bot backward compat: bot token */\n botToken?: string;\n /** Single-bot backward compat: channel IDs */\n channels?: string[];\n apiBase?: string;\n bufferSize?: number;\n}\n\nexport class AFSSlack extends BaseMessageProvider {\n static manifest() {\n return {\n name: \"slack\",\n description:\n \"Slack messaging — webhook (outbound) or Bot API (bidirectional).\\n- Incoming Webhook for simple notifications\\n- Bot token + Events API for full interaction\\n- Path: /:bot/conversations/:channelId/messages/:ts\",\n uriTemplate: \"slack://{bot}\",\n category: \"messaging\",\n schema: {\n type: \"object\",\n properties: {\n bot: { type: \"string\", description: \"Bot identifier name\" },\n botToken: { type: \"string\", description: \"Slack Bot OAuth token\", sensitive: true },\n webhook: { type: \"string\", description: \"Incoming Webhook URL\", sensitive: true },\n channels: { type: \"array\", items: { type: \"string\" }, description: \"Channel IDs\" },\n },\n required: [\"bot\"],\n },\n tags: [\"slack\", \"messaging\", \"chat\", \"workspace\"],\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 Slack API — requires bot token or webhook URL\"],\n },\n capabilities: {\n network: { egress: true, allowedDomains: [\"slack.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: \"token\", env: [\"SLACK_BOT_TOKEN\"] },\n bestFor: [\"team notifications\", \"workflow alerts\", \"chatops\"],\n notFor: [\"file storage\", \"database queries\"],\n };\n }\n\n readonly providerName = \"slack\";\n readonly eventPrefix = \"slack\";\n\n constructor(options: AFSSlackOptions) {\n let bots: BotConfig[];\n if (options.bots) {\n bots = options.bots.map((b) => ({\n ...b,\n conversations: b.channels,\n }));\n } else {\n if (!options.botToken && !options.webhook) {\n throw new Error(\"AFSSlack requires either botToken or webhook\");\n }\n bots = [\n {\n name: options.bot ?? \"default\",\n botToken: options.botToken,\n webhook: options.webhook,\n conversations: options.channels ?? [],\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: 40000,\n features: {\n edit: false,\n delete: false,\n reply: true,\n thread: true,\n reaction: true,\n inlineKeyboard: false,\n },\n limits: {\n messagesPerSecond: 1,\n messagesPerMinute: 60,\n },\n };\n }\n\n createBotClient(config: BotConfig): SlackClient {\n const botToken = config.botToken as string | undefined;\n const webhook = config.webhook as string | undefined;\n const apiBase = config.apiBase as string | undefined;\n\n if (botToken) {\n return SlackClient.bot({ botToken, apiBase });\n }\n if (webhook) {\n return SlackClient.webhook(webhook);\n }\n throw new Error(`Slack bot \"${config.name}\" requires botToken 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 sc = client as SlackClient;\n const blocks = opts?.blocks as unknown[] | undefined;\n // Escape Slack special characters to prevent injection (<!channel>, phishing links, etc.)\n const safeText = SlackClient.escapeSlack(text);\n\n if (sc.mode === \"bot\") {\n const result = await sc.postMessage(convId, safeText, { blocks });\n return { messageId: result.ts };\n }\n\n // Webhook mode — can't target specific channel\n await sc.sendWebhook(safeText, { blocks });\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.ts ?? \"0\"),\n text: String(msg.text ?? \"\"),\n from: this.normalizeSender({ id: msg.userId ?? msg.user }),\n timestamp: Math.floor(Number.parseFloat(String(msg.ts ?? \"0\"))),\n conversationId: String(msg.channelId ?? msg.channel ?? \"\"),\n platform: { ts: msg.ts },\n };\n }\n\n normalizeSender(raw: Record<string, unknown>): MessageSender {\n return {\n id: String(raw.id ?? \"0\"),\n name: String(raw.name ?? raw.id ?? \"\"),\n isBot: raw.isBot as boolean | undefined,\n };\n }\n\n // ─── Slack-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 Slack Events API 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 this._processEvent(args);\n return { success: true, data: { ok: true } };\n }\n\n // ─── Event Processing (public for testing) ────────────\n\n /** Process a Slack Events API payload — delegates to emitMessageReceived(). */\n _processEvent(payload: any): void {\n const parsed = SlackClient.parseEvent(payload);\n if (!parsed) return;\n if (parsed.type === \"url_verification\") return;\n\n const { text, userId, channelId, ts } = parsed;\n const botName = this._botOrder[0] ?? \"default\";\n\n this.emitMessageReceived(botName, {\n id: ts,\n text,\n from: { id: userId, name: userId },\n timestamp: Math.floor(Number.parseFloat(ts)),\n conversationId: channelId,\n platform: { ts, userId },\n });\n }\n\n // ─── Convenience Methods (backward compat) ─────────────\n\n /** Add a channel to a bot. Defaults to first bot. */\n addChannel(channelId: 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(channelId)) return;\n convs.add(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers && !buffers.has(channelId)) {\n buffers.set(channelId, []);\n }\n }\n\n /** Remove a channel from a bot. */\n removeChannel(channelId: 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(channelId);\n const buffers = this._botBuffers.get(name);\n if (buffers) buffers.delete(channelId);\n }\n\n /** Add a message to the ring buffer directly. Public for testing/conformance. */\n _addToBuffer(\n channelId: string,\n msg: { ts: string; text: string; userId: string; date: number },\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(channelId)) {\n convs.add(channelId);\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(channelId);\n if (!buffer) {\n buffer = [];\n botBuffers.set(channelId, buffer);\n }\n buffer.push({\n id: msg.ts,\n text: msg.text,\n from: { id: msg.userId, name: msg.userId },\n timestamp: msg.date,\n conversationId: channelId,\n platform: { ts: msg.ts },\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-slack",
|
|
3
|
-
"version": "1.11.0-beta.
|
|
3
|
+
"version": "1.11.0-beta.13",
|
|
4
4
|
"description": "AIGNE AFS provider for Slack (webhook + bot modes)",
|
|
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",
|