@sena-ai/connector-slack 0.0.1

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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verify.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/verify.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { verifySignature } from '../verify.js';
3
+ import { createHmac } from 'node:crypto';
4
+ describe('verifySignature', () => {
5
+ const secret = 'test-signing-secret';
6
+ const body = '{"type":"url_verification"}';
7
+ const timestamp = String(Math.floor(Date.now() / 1000));
8
+ function makeSignature(ts, rawBody) {
9
+ return 'v0=' + createHmac('sha256', secret)
10
+ .update(`v0:${ts}:${rawBody}`)
11
+ .digest('hex');
12
+ }
13
+ it('returns true for valid signature', () => {
14
+ const sig = makeSignature(timestamp, body);
15
+ expect(verifySignature(secret, timestamp, body, sig)).toBe(true);
16
+ });
17
+ it('returns false for invalid signature', () => {
18
+ expect(verifySignature(secret, timestamp, body, 'v0=invalid')).toBe(false);
19
+ });
20
+ it('returns false for expired timestamp', () => {
21
+ const oldTimestamp = String(Math.floor(Date.now() / 1000) - 600);
22
+ const sig = makeSignature(oldTimestamp, body);
23
+ expect(verifySignature(secret, oldTimestamp, body, sig)).toBe(false);
24
+ });
25
+ it('returns false for missing params', () => {
26
+ expect(verifySignature(secret, '', body, 'v0=abc')).toBe(false);
27
+ expect(verifySignature(secret, timestamp, body, '')).toBe(false);
28
+ });
29
+ });
30
+ //# sourceMappingURL=verify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.test.js","sourceRoot":"","sources":["../../src/__tests__/verify.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAA;IACpC,MAAM,IAAI,GAAG,6BAA6B,CAAA;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAEvD,SAAS,aAAa,CAAC,EAAU,EAAE,OAAe;QAChD,OAAO,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aACxC,MAAM,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;aAC7B,MAAM,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IAED,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;QAChE,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/D,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { Connector } from '@sena-ai/core';
2
+ export type SlackConnectorOptions = {
3
+ appId: string;
4
+ botToken: string;
5
+ signingSecret: string;
6
+ };
7
+ export declare function slackConnector(options: SlackConnectorOptions): Connector;
8
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiF,MAAM,eAAe,CAAA;AAI7H,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAiBxE"}
@@ -0,0 +1,135 @@
1
+ import { WebClient } from '@slack/web-api';
2
+ import { verifySignature } from './verify.js';
3
+ export function slackConnector(options) {
4
+ const { appId, botToken, signingSecret } = options;
5
+ const slack = new WebClient(botToken);
6
+ return {
7
+ name: 'slack',
8
+ registerRoutes(server, engine) {
9
+ server.post('/slack/events', (req, res) => {
10
+ handleSlackEvent(req, res, engine, signingSecret, appId);
11
+ });
12
+ },
13
+ createOutput(context) {
14
+ return createSlackOutput(slack, context);
15
+ },
16
+ };
17
+ }
18
+ async function handleSlackEvent(req, res, engine, signingSecret, appId) {
19
+ const body = req.body;
20
+ // URL verification challenge
21
+ if (body?.type === 'url_verification') {
22
+ res.status(200).json({ challenge: body.challenge });
23
+ return;
24
+ }
25
+ // Verify signature
26
+ const timestamp = req.headers['x-slack-request-timestamp'];
27
+ const signature = req.headers['x-slack-signature'];
28
+ const rawBody = req.rawBody ?? JSON.stringify(body);
29
+ if (!verifySignature(signingSecret, timestamp, rawBody, signature)) {
30
+ res.status(401).send('Invalid signature');
31
+ return;
32
+ }
33
+ // Acknowledge immediately (Slack 3s timeout)
34
+ res.status(200).send();
35
+ // Process event
36
+ const event = body?.event;
37
+ if (!event)
38
+ return;
39
+ // Only handle app_mention and message events directed at the bot
40
+ if (event.type !== 'app_mention' && event.type !== 'message')
41
+ return;
42
+ if (event.bot_id)
43
+ return; // Ignore bot messages
44
+ if (event.subtype)
45
+ return; // Ignore message subtypes (edits, deletes, etc.)
46
+ const inbound = {
47
+ connector: 'slack',
48
+ conversationId: event.thread_ts ?? event.ts, // Use thread ts as conversation ID
49
+ userId: event.user ?? '',
50
+ userName: event.user ?? '',
51
+ text: event.text ?? '',
52
+ files: event.files?.map((f) => ({
53
+ id: f.id,
54
+ name: f.name,
55
+ mimeType: f.mimetype,
56
+ url: f.url_private,
57
+ })),
58
+ raw: body,
59
+ };
60
+ await engine.submitTurn(inbound);
61
+ }
62
+ function createSlackOutput(slack, context) {
63
+ let progressTs;
64
+ let lastProgressTime = 0;
65
+ const THROTTLE_MS = 1500;
66
+ return {
67
+ async showProgress(text) {
68
+ const now = Date.now();
69
+ if (now - lastProgressTime < THROTTLE_MS && progressTs)
70
+ return;
71
+ try {
72
+ if (progressTs) {
73
+ await slack.chat.update({
74
+ channel: context.conversationId.split(':')[0] || context.conversationId,
75
+ ts: progressTs,
76
+ text: `_${text}_`,
77
+ });
78
+ }
79
+ else {
80
+ const result = await slack.chat.postMessage({
81
+ channel: context.conversationId.split(':')[0] || context.conversationId,
82
+ thread_ts: context.conversationId,
83
+ text: `_${text}_`,
84
+ });
85
+ progressTs = result.ts;
86
+ }
87
+ lastProgressTime = now;
88
+ }
89
+ catch {
90
+ // Swallow progress errors
91
+ }
92
+ },
93
+ async sendResult(text) {
94
+ // Delete progress message if exists
95
+ if (progressTs) {
96
+ try {
97
+ await slack.chat.delete({
98
+ channel: context.conversationId.split(':')[0] || context.conversationId,
99
+ ts: progressTs,
100
+ });
101
+ }
102
+ catch {
103
+ // Ignore
104
+ }
105
+ }
106
+ await slack.chat.postMessage({
107
+ channel: context.conversationId.split(':')[0] || context.conversationId,
108
+ thread_ts: context.conversationId,
109
+ text,
110
+ });
111
+ },
112
+ async sendError(message) {
113
+ await slack.chat.postMessage({
114
+ channel: context.conversationId.split(':')[0] || context.conversationId,
115
+ thread_ts: context.conversationId,
116
+ text: `:warning: ${message}`,
117
+ });
118
+ },
119
+ async dispose() {
120
+ // Clean up progress message
121
+ if (progressTs) {
122
+ try {
123
+ await slack.chat.delete({
124
+ channel: context.conversationId.split(':')[0] || context.conversationId,
125
+ ts: progressTs,
126
+ });
127
+ }
128
+ catch {
129
+ // Ignore
130
+ }
131
+ }
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { slackConnector } from './connector.js';
2
+ export type { SlackConnectorOptions } from './connector.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { slackConnector } from './connector.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function verifySignature(signingSecret: string, timestamp: string, rawBody: string, signature: string): boolean;
2
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAiBT"}
package/dist/verify.js ADDED
@@ -0,0 +1,20 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ export function verifySignature(signingSecret, timestamp, rawBody, signature) {
3
+ if (!timestamp || !signature)
4
+ return false;
5
+ // Check timestamp to prevent replay attacks (5 minutes)
6
+ const now = Math.floor(Date.now() / 1000);
7
+ if (Math.abs(now - parseInt(timestamp, 10)) > 300)
8
+ return false;
9
+ const sigBasestring = `v0:${timestamp}:${rawBody}`;
10
+ const mySignature = 'v0=' + createHmac('sha256', signingSecret)
11
+ .update(sigBasestring)
12
+ .digest('hex');
13
+ try {
14
+ return timingSafeEqual(Buffer.from(mySignature), Buffer.from(signature));
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,UAAU,eAAe,CAC7B,aAAqB,EACrB,SAAiB,EACjB,OAAe,EACf,SAAiB;IAEjB,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAE1C,wDAAwD;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAA;IAE/D,MAAM,aAAa,GAAG,MAAM,SAAS,IAAI,OAAO,EAAE,CAAA;IAClD,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC5D,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhB,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@sena-ai/connector-slack",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ }
10
+ },
11
+ "files": ["dist"],
12
+ "scripts": {
13
+ "build": "tsc -b",
14
+ "dev": "tsc -b --watch"
15
+ },
16
+ "dependencies": {
17
+ "@sena-ai/core": "workspace:*",
18
+ "@slack/web-api": "^7.0.0"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "^5.8.0"
22
+ }
23
+ }