@auxiora/channels 1.0.0

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.
Files changed (89) hide show
  1. package/LICENSE +191 -0
  2. package/dist/adapters/bluebubbles.d.ts +63 -0
  3. package/dist/adapters/bluebubbles.d.ts.map +1 -0
  4. package/dist/adapters/bluebubbles.js +197 -0
  5. package/dist/adapters/bluebubbles.js.map +1 -0
  6. package/dist/adapters/discord.d.ts +27 -0
  7. package/dist/adapters/discord.d.ts.map +1 -0
  8. package/dist/adapters/discord.js +202 -0
  9. package/dist/adapters/discord.js.map +1 -0
  10. package/dist/adapters/email.d.ts +39 -0
  11. package/dist/adapters/email.d.ts.map +1 -0
  12. package/dist/adapters/email.js +359 -0
  13. package/dist/adapters/email.js.map +1 -0
  14. package/dist/adapters/googlechat.d.ts +77 -0
  15. package/dist/adapters/googlechat.d.ts.map +1 -0
  16. package/dist/adapters/googlechat.js +232 -0
  17. package/dist/adapters/googlechat.js.map +1 -0
  18. package/dist/adapters/matrix.d.ts +37 -0
  19. package/dist/adapters/matrix.d.ts.map +1 -0
  20. package/dist/adapters/matrix.js +262 -0
  21. package/dist/adapters/matrix.js.map +1 -0
  22. package/dist/adapters/signal.d.ts +32 -0
  23. package/dist/adapters/signal.d.ts.map +1 -0
  24. package/dist/adapters/signal.js +216 -0
  25. package/dist/adapters/signal.js.map +1 -0
  26. package/dist/adapters/slack.d.ts +29 -0
  27. package/dist/adapters/slack.d.ts.map +1 -0
  28. package/dist/adapters/slack.js +202 -0
  29. package/dist/adapters/slack.js.map +1 -0
  30. package/dist/adapters/teams.d.ts +66 -0
  31. package/dist/adapters/teams.d.ts.map +1 -0
  32. package/dist/adapters/teams.js +227 -0
  33. package/dist/adapters/teams.js.map +1 -0
  34. package/dist/adapters/telegram.d.ts +28 -0
  35. package/dist/adapters/telegram.d.ts.map +1 -0
  36. package/dist/adapters/telegram.js +170 -0
  37. package/dist/adapters/telegram.js.map +1 -0
  38. package/dist/adapters/twilio.d.ts +63 -0
  39. package/dist/adapters/twilio.d.ts.map +1 -0
  40. package/dist/adapters/twilio.js +193 -0
  41. package/dist/adapters/twilio.js.map +1 -0
  42. package/dist/adapters/whatsapp.d.ts +99 -0
  43. package/dist/adapters/whatsapp.d.ts.map +1 -0
  44. package/dist/adapters/whatsapp.js +218 -0
  45. package/dist/adapters/whatsapp.js.map +1 -0
  46. package/dist/adapters/zalo.d.ts +64 -0
  47. package/dist/adapters/zalo.d.ts.map +1 -0
  48. package/dist/adapters/zalo.js +216 -0
  49. package/dist/adapters/zalo.js.map +1 -0
  50. package/dist/index.d.ts +15 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +16 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/manager.d.ts +35 -0
  55. package/dist/manager.d.ts.map +1 -0
  56. package/dist/manager.js +127 -0
  57. package/dist/manager.js.map +1 -0
  58. package/dist/types.d.ts +71 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +32 -0
  63. package/src/adapters/bluebubbles.ts +294 -0
  64. package/src/adapters/discord.ts +253 -0
  65. package/src/adapters/email.ts +457 -0
  66. package/src/adapters/googlechat.ts +364 -0
  67. package/src/adapters/matrix.ts +376 -0
  68. package/src/adapters/signal.ts +313 -0
  69. package/src/adapters/slack.ts +252 -0
  70. package/src/adapters/teams.ts +320 -0
  71. package/src/adapters/telegram.ts +208 -0
  72. package/src/adapters/twilio.ts +256 -0
  73. package/src/adapters/whatsapp.ts +342 -0
  74. package/src/adapters/zalo.ts +319 -0
  75. package/src/index.ts +78 -0
  76. package/src/manager.ts +180 -0
  77. package/src/types.ts +84 -0
  78. package/tests/bluebubbles.test.ts +438 -0
  79. package/tests/email.test.ts +136 -0
  80. package/tests/googlechat.test.ts +439 -0
  81. package/tests/matrix.test.ts +564 -0
  82. package/tests/signal.test.ts +404 -0
  83. package/tests/slack.test.ts +343 -0
  84. package/tests/teams.test.ts +429 -0
  85. package/tests/twilio.test.ts +269 -0
  86. package/tests/whatsapp.test.ts +530 -0
  87. package/tests/zalo.test.ts +499 -0
  88. package/tsconfig.json +8 -0
  89. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,32 @@
1
+ import type { ChannelAdapter, InboundMessage, OutboundMessage, SendResult } from '../types.js';
2
+ export interface SignalAdapterConfig {
3
+ signalCliEndpoint: string;
4
+ phoneNumber: string;
5
+ allowedNumbers?: string[];
6
+ }
7
+ export declare class SignalAdapter implements ChannelAdapter {
8
+ readonly type: "signal";
9
+ readonly name = "Signal";
10
+ private config;
11
+ private messageHandler?;
12
+ private errorHandler?;
13
+ private connected;
14
+ private pollRunning;
15
+ private pollAbort?;
16
+ private rpcId;
17
+ constructor(config: SignalAdapterConfig);
18
+ private get endpoint();
19
+ private rpcCall;
20
+ connect(): Promise<void>;
21
+ disconnect(): Promise<void>;
22
+ isConnected(): boolean;
23
+ private startPolling;
24
+ private pollLoop;
25
+ private handleMessage;
26
+ private toInboundMessage;
27
+ send(channelId: string, message: OutboundMessage): Promise<SendResult>;
28
+ private chunkMessage;
29
+ onMessage(handler: (message: InboundMessage) => Promise<void>): void;
30
+ onError(handler: (error: Error) => void): void;
31
+ }
32
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/adapters/signal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAkDD,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,YAAY;IAEzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAK;gBAEN,MAAM,EAAE,mBAAmB;IAIvC,OAAO,KAAK,QAAQ,GAEnB;YAEa,OAAO;IA4Bf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,YAAY;YAKN,QAAQ;YAyBR,aAAa;IAkC3B,OAAO,CAAC,gBAAgB;IAgClB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IA8C5E,OAAO,CAAC,YAAY;IA6BpB,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;CAG/C"}
@@ -0,0 +1,216 @@
1
+ import { audit } from '@auxiora/audit';
2
+ const MAX_MESSAGE_LENGTH = 6000;
3
+ export class SignalAdapter {
4
+ type = 'signal';
5
+ name = 'Signal';
6
+ config;
7
+ messageHandler;
8
+ errorHandler;
9
+ connected = false;
10
+ pollRunning = false;
11
+ pollAbort;
12
+ rpcId = 0;
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ get endpoint() {
17
+ return this.config.signalCliEndpoint.replace(/\/+$/, '');
18
+ }
19
+ async rpcCall(method, params = {}) {
20
+ this.rpcId++;
21
+ const body = {
22
+ jsonrpc: '2.0',
23
+ id: this.rpcId,
24
+ method,
25
+ params: { ...params, account: this.config.phoneNumber },
26
+ };
27
+ const response = await fetch(`${this.endpoint}/api/v1/rpc`, {
28
+ method: 'POST',
29
+ headers: { 'Content-Type': 'application/json' },
30
+ body: JSON.stringify(body),
31
+ });
32
+ if (!response.ok) {
33
+ throw new Error(`Signal CLI API error ${response.status}: ${response.statusText}`);
34
+ }
35
+ const result = await response.json();
36
+ if (result.error) {
37
+ throw new Error(`Signal CLI RPC error: ${result.error.message}`);
38
+ }
39
+ return result.result;
40
+ }
41
+ async connect() {
42
+ // Verify connection by listing accounts
43
+ await this.rpcCall('listAccounts');
44
+ this.connected = true;
45
+ audit('channel.connected', {
46
+ channelType: 'signal',
47
+ phoneNumber: this.config.phoneNumber,
48
+ });
49
+ this.startPolling();
50
+ }
51
+ async disconnect() {
52
+ this.pollRunning = false;
53
+ this.pollAbort?.abort();
54
+ this.connected = false;
55
+ audit('channel.disconnected', { channelType: 'signal' });
56
+ }
57
+ isConnected() {
58
+ return this.connected;
59
+ }
60
+ startPolling() {
61
+ this.pollRunning = true;
62
+ void this.pollLoop();
63
+ }
64
+ async pollLoop() {
65
+ while (this.pollRunning && this.connected) {
66
+ try {
67
+ this.pollAbort = new AbortController();
68
+ const messages = await this.rpcCall('receive');
69
+ if (messages && Array.isArray(messages)) {
70
+ for (const msg of messages) {
71
+ await this.handleMessage(msg);
72
+ }
73
+ }
74
+ // Brief delay between polls
75
+ await new Promise((resolve) => setTimeout(resolve, 1000));
76
+ }
77
+ catch (error) {
78
+ if (error instanceof Error && error.name === 'AbortError') {
79
+ break;
80
+ }
81
+ this.errorHandler?.(error instanceof Error ? error : new Error(String(error)));
82
+ await new Promise((resolve) => setTimeout(resolve, 5000));
83
+ }
84
+ }
85
+ }
86
+ async handleMessage(msg) {
87
+ const dataMessage = msg.envelope.dataMessage;
88
+ if (!dataMessage || !dataMessage.message)
89
+ return;
90
+ // Ignore own messages
91
+ if (msg.envelope.source === this.config.phoneNumber ||
92
+ msg.envelope.sourceNumber === this.config.phoneNumber) {
93
+ return;
94
+ }
95
+ // Check allowed numbers
96
+ const senderNumber = msg.envelope.sourceNumber || msg.envelope.source;
97
+ if (this.config.allowedNumbers?.length && !this.config.allowedNumbers.includes(senderNumber)) {
98
+ audit('message.filtered', { channelType: 'signal', senderId: senderNumber, reason: 'number_not_allowed' });
99
+ return;
100
+ }
101
+ const inbound = this.toInboundMessage(msg);
102
+ audit('message.received', {
103
+ channelType: 'signal',
104
+ senderId: inbound.senderId,
105
+ channelId: inbound.channelId,
106
+ });
107
+ if (this.messageHandler) {
108
+ try {
109
+ await this.messageHandler(inbound);
110
+ }
111
+ catch (error) {
112
+ this.errorHandler?.(error instanceof Error ? error : new Error(String(error)));
113
+ }
114
+ }
115
+ }
116
+ toInboundMessage(msg) {
117
+ const dataMessage = msg.envelope.dataMessage;
118
+ const isGroup = !!dataMessage.groupInfo;
119
+ const channelId = isGroup
120
+ ? dataMessage.groupInfo.groupId
121
+ : msg.envelope.sourceNumber || msg.envelope.source;
122
+ return {
123
+ id: String(dataMessage.timestamp),
124
+ channelType: 'signal',
125
+ channelId,
126
+ senderId: msg.envelope.sourceNumber || msg.envelope.source,
127
+ senderName: msg.envelope.sourceName,
128
+ content: dataMessage.message,
129
+ timestamp: dataMessage.timestamp,
130
+ replyToId: dataMessage.quote ? String(dataMessage.quote.id) : undefined,
131
+ attachments: dataMessage.attachments?.map((a) => ({
132
+ type: a.contentType.startsWith('image/')
133
+ ? 'image'
134
+ : a.contentType.startsWith('audio/')
135
+ ? 'audio'
136
+ : a.contentType.startsWith('video/')
137
+ ? 'video'
138
+ : 'file',
139
+ mimeType: a.contentType,
140
+ filename: a.filename,
141
+ size: a.size,
142
+ })),
143
+ raw: msg,
144
+ };
145
+ }
146
+ async send(channelId, message) {
147
+ try {
148
+ const chunks = this.chunkMessage(message.content);
149
+ let lastTimestamp;
150
+ for (const chunk of chunks) {
151
+ // Determine if group or direct
152
+ const isGroup = !channelId.startsWith('+');
153
+ const params = {
154
+ message: chunk,
155
+ };
156
+ if (isGroup) {
157
+ params.groupId = channelId;
158
+ }
159
+ else {
160
+ params.recipient = [channelId];
161
+ }
162
+ if (message.replyToId) {
163
+ params.quoteTimestamp = parseInt(message.replyToId, 10);
164
+ params.quoteAuthor = channelId;
165
+ }
166
+ const result = await this.rpcCall('send', params);
167
+ lastTimestamp = result.timestamp;
168
+ }
169
+ audit('message.sent', {
170
+ channelType: 'signal',
171
+ channelId,
172
+ messageId: lastTimestamp,
173
+ });
174
+ return { success: true, messageId: String(lastTimestamp) };
175
+ }
176
+ catch (error) {
177
+ const errorMessage = error instanceof Error ? error.message : String(error);
178
+ audit('channel.error', {
179
+ channelType: 'signal',
180
+ action: 'send',
181
+ error: errorMessage,
182
+ });
183
+ return { success: false, error: errorMessage };
184
+ }
185
+ }
186
+ chunkMessage(content) {
187
+ if (content.length <= MAX_MESSAGE_LENGTH) {
188
+ return [content];
189
+ }
190
+ const chunks = [];
191
+ let remaining = content;
192
+ while (remaining.length > 0) {
193
+ if (remaining.length <= MAX_MESSAGE_LENGTH) {
194
+ chunks.push(remaining);
195
+ break;
196
+ }
197
+ let breakPoint = remaining.lastIndexOf('\n', MAX_MESSAGE_LENGTH);
198
+ if (breakPoint === -1 || breakPoint < MAX_MESSAGE_LENGTH / 2) {
199
+ breakPoint = remaining.lastIndexOf(' ', MAX_MESSAGE_LENGTH);
200
+ }
201
+ if (breakPoint === -1 || breakPoint < MAX_MESSAGE_LENGTH / 2) {
202
+ breakPoint = MAX_MESSAGE_LENGTH;
203
+ }
204
+ chunks.push(remaining.slice(0, breakPoint));
205
+ remaining = remaining.slice(breakPoint).trimStart();
206
+ }
207
+ return chunks;
208
+ }
209
+ onMessage(handler) {
210
+ this.messageHandler = handler;
211
+ }
212
+ onError(handler) {
213
+ this.errorHandler = handler;
214
+ }
215
+ }
216
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/adapters/signal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ChannelAdapter, InboundMessage, OutboundMessage, SendResult } from '../types.js';
2
+ export interface SlackAdapterConfig {
3
+ botToken: string;
4
+ appToken: string;
5
+ signingSecret?: string;
6
+ allowedChannels?: string[];
7
+ allowedUsers?: string[];
8
+ }
9
+ export declare class SlackAdapter implements ChannelAdapter {
10
+ readonly type: "slack";
11
+ readonly name = "Slack";
12
+ private app;
13
+ private config;
14
+ private messageHandler?;
15
+ private errorHandler?;
16
+ private connected;
17
+ private botUserId?;
18
+ constructor(config: SlackAdapterConfig);
19
+ private setupEventHandlers;
20
+ private toInboundMessage;
21
+ connect(): Promise<void>;
22
+ disconnect(): Promise<void>;
23
+ isConnected(): boolean;
24
+ send(channelId: string, message: OutboundMessage): Promise<SendResult>;
25
+ private chunkMessage;
26
+ onMessage(handler: (message: InboundMessage) => Promise<void>): void;
27
+ onError(handler: (error: Error) => void): void;
28
+ }
29
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/adapters/slack.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAID,qBAAa,YAAa,YAAW,cAAc;IACjD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,kBAAkB;IAYtC,OAAO,CAAC,kBAAkB;IAwG1B,OAAO,CAAC,gBAAgB;IAmBlB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAkC5E,OAAO,CAAC,YAAY;IA6BpB,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;CAG/C"}
@@ -0,0 +1,202 @@
1
+ import { App, LogLevel } from '@slack/bolt';
2
+ import { audit } from '@auxiora/audit';
3
+ const MAX_MESSAGE_LENGTH = 40000;
4
+ export class SlackAdapter {
5
+ type = 'slack';
6
+ name = 'Slack';
7
+ app;
8
+ config;
9
+ messageHandler;
10
+ errorHandler;
11
+ connected = false;
12
+ botUserId;
13
+ constructor(config) {
14
+ this.config = config;
15
+ this.app = new App({
16
+ token: config.botToken,
17
+ appToken: config.appToken,
18
+ socketMode: true,
19
+ logLevel: LogLevel.WARN,
20
+ });
21
+ this.setupEventHandlers();
22
+ }
23
+ setupEventHandlers() {
24
+ // Listen to all messages
25
+ this.app.message(async ({ message, say, client }) => {
26
+ // Type guard for regular messages
27
+ if (!('user' in message) || !('text' in message))
28
+ return;
29
+ if (message.subtype)
30
+ return; // Ignore edited, deleted, etc.
31
+ // Get bot user ID if we don't have it
32
+ if (!this.botUserId) {
33
+ const auth = await client.auth.test();
34
+ this.botUserId = auth.user_id;
35
+ }
36
+ // Ignore bot's own messages
37
+ if (message.user === this.botUserId)
38
+ return;
39
+ // Check allowed channels
40
+ if (this.config.allowedChannels?.length && message.channel && !this.config.allowedChannels.includes(message.channel)) {
41
+ audit('message.filtered', { channelType: 'slack', senderId: message.user, channelId: message.channel, reason: 'channel_not_allowed' });
42
+ return;
43
+ }
44
+ // Check allowed users
45
+ if (this.config.allowedUsers?.length && !this.config.allowedUsers.includes(message.user)) {
46
+ audit('message.filtered', { channelType: 'slack', senderId: message.user, channelId: message.channel, reason: 'user_not_allowed' });
47
+ return;
48
+ }
49
+ const inbound = this.toInboundMessage(message);
50
+ audit('message.received', {
51
+ channelType: 'slack',
52
+ senderId: inbound.senderId,
53
+ channelId: inbound.channelId,
54
+ });
55
+ if (this.messageHandler) {
56
+ try {
57
+ await this.messageHandler(inbound);
58
+ }
59
+ catch (error) {
60
+ this.errorHandler?.(error instanceof Error ? error : new Error(String(error)));
61
+ }
62
+ }
63
+ });
64
+ // Handle mentions specifically
65
+ this.app.event('app_mention', async ({ event, client }) => {
66
+ // Get bot user ID if we don't have it
67
+ if (!this.botUserId) {
68
+ const auth = await client.auth.test();
69
+ this.botUserId = auth.user_id;
70
+ }
71
+ // Check allowed channels
72
+ if (this.config.allowedChannels?.length && event.channel && !this.config.allowedChannels.includes(event.channel)) {
73
+ audit('message.filtered', { channelType: 'slack', senderId: event.user || '', channelId: event.channel, reason: 'channel_not_allowed' });
74
+ return;
75
+ }
76
+ // Check allowed users
77
+ if (this.config.allowedUsers?.length && event.user && !this.config.allowedUsers.includes(event.user)) {
78
+ audit('message.filtered', { channelType: 'slack', senderId: event.user, channelId: event.channel || '', reason: 'user_not_allowed' });
79
+ return;
80
+ }
81
+ // Strip bot mention from text
82
+ let content = event.text || '';
83
+ if (this.botUserId) {
84
+ content = content.replace(new RegExp(`<@${this.botUserId}>`, 'g'), '').trim();
85
+ }
86
+ const inbound = {
87
+ id: event.ts,
88
+ channelType: 'slack',
89
+ channelId: event.channel || '',
90
+ senderId: event.user || '',
91
+ content,
92
+ timestamp: parseFloat(event.ts) * 1000,
93
+ replyToId: event.thread_ts,
94
+ raw: event,
95
+ };
96
+ audit('message.received', {
97
+ channelType: 'slack',
98
+ senderId: inbound.senderId,
99
+ channelId: inbound.channelId,
100
+ isMention: true,
101
+ });
102
+ if (this.messageHandler) {
103
+ try {
104
+ await this.messageHandler(inbound);
105
+ }
106
+ catch (error) {
107
+ this.errorHandler?.(error instanceof Error ? error : new Error(String(error)));
108
+ }
109
+ }
110
+ });
111
+ this.app.error(async (error) => {
112
+ audit('channel.error', { channelType: 'slack', error: error.message });
113
+ this.errorHandler?.(error);
114
+ });
115
+ }
116
+ toInboundMessage(message) {
117
+ return {
118
+ id: message.ts,
119
+ channelType: 'slack',
120
+ channelId: message.channel || '',
121
+ senderId: message.user || '',
122
+ content: message.text || '',
123
+ timestamp: parseFloat(message.ts) * 1000,
124
+ replyToId: message.thread_ts,
125
+ raw: message,
126
+ };
127
+ }
128
+ async connect() {
129
+ await this.app.start();
130
+ this.connected = true;
131
+ audit('channel.connected', { channelType: 'slack' });
132
+ }
133
+ async disconnect() {
134
+ await this.app.stop();
135
+ this.connected = false;
136
+ audit('channel.disconnected', { channelType: 'slack' });
137
+ }
138
+ isConnected() {
139
+ return this.connected;
140
+ }
141
+ async send(channelId, message) {
142
+ try {
143
+ // Chunk long messages
144
+ const chunks = this.chunkMessage(message.content);
145
+ let lastTs;
146
+ for (const chunk of chunks) {
147
+ const result = await this.app.client.chat.postMessage({
148
+ channel: channelId,
149
+ text: chunk,
150
+ thread_ts: message.replyToId,
151
+ mrkdwn: message.formatting?.markdown !== false,
152
+ });
153
+ lastTs = result.ts;
154
+ }
155
+ audit('message.sent', {
156
+ channelType: 'slack',
157
+ channelId,
158
+ messageId: lastTs,
159
+ });
160
+ return { success: true, messageId: lastTs };
161
+ }
162
+ catch (error) {
163
+ const errorMessage = error instanceof Error ? error.message : String(error);
164
+ audit('channel.error', {
165
+ channelType: 'slack',
166
+ action: 'send',
167
+ error: errorMessage,
168
+ });
169
+ return { success: false, error: errorMessage };
170
+ }
171
+ }
172
+ chunkMessage(content) {
173
+ if (content.length <= MAX_MESSAGE_LENGTH) {
174
+ return [content];
175
+ }
176
+ const chunks = [];
177
+ let remaining = content;
178
+ while (remaining.length > 0) {
179
+ if (remaining.length <= MAX_MESSAGE_LENGTH) {
180
+ chunks.push(remaining);
181
+ break;
182
+ }
183
+ let breakPoint = remaining.lastIndexOf('\n', MAX_MESSAGE_LENGTH);
184
+ if (breakPoint === -1 || breakPoint < MAX_MESSAGE_LENGTH / 2) {
185
+ breakPoint = remaining.lastIndexOf(' ', MAX_MESSAGE_LENGTH);
186
+ }
187
+ if (breakPoint === -1 || breakPoint < MAX_MESSAGE_LENGTH / 2) {
188
+ breakPoint = MAX_MESSAGE_LENGTH;
189
+ }
190
+ chunks.push(remaining.slice(0, breakPoint));
191
+ remaining = remaining.slice(breakPoint).trimStart();
192
+ }
193
+ return chunks;
194
+ }
195
+ onMessage(handler) {
196
+ this.messageHandler = handler;
197
+ }
198
+ onError(handler) {
199
+ this.errorHandler = handler;
200
+ }
201
+ }
202
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/adapters/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { ChannelAdapter, InboundMessage, OutboundMessage, SendResult } from '../types.js';
2
+ export interface TeamsAdapterConfig {
3
+ microsoftAppId: string;
4
+ microsoftAppPassword: string;
5
+ allowedTenants?: string[];
6
+ allowedUsers?: string[];
7
+ }
8
+ interface TeamsActivity {
9
+ type: string;
10
+ id: string;
11
+ timestamp: string;
12
+ channelId: string;
13
+ from: {
14
+ id: string;
15
+ name?: string;
16
+ aadObjectId?: string;
17
+ };
18
+ conversation: {
19
+ id: string;
20
+ conversationType?: string;
21
+ tenantId?: string;
22
+ isGroup?: boolean;
23
+ };
24
+ recipient?: {
25
+ id: string;
26
+ name?: string;
27
+ };
28
+ text?: string;
29
+ serviceUrl: string;
30
+ channelData?: Record<string, unknown>;
31
+ replyToId?: string;
32
+ attachments?: Array<{
33
+ contentType: string;
34
+ contentUrl?: string;
35
+ name?: string;
36
+ content?: unknown;
37
+ }>;
38
+ }
39
+ export declare class TeamsAdapter implements ChannelAdapter {
40
+ readonly type: "teams";
41
+ readonly name = "Microsoft Teams";
42
+ private config;
43
+ private messageHandler?;
44
+ private errorHandler?;
45
+ private connected;
46
+ private accessToken?;
47
+ private tokenExpiry;
48
+ constructor(config: TeamsAdapterConfig);
49
+ connect(): Promise<void>;
50
+ disconnect(): Promise<void>;
51
+ isConnected(): boolean;
52
+ private getAccessToken;
53
+ /**
54
+ * Handle incoming webhook from Microsoft Bot Framework.
55
+ * Call this from your HTTP server when receiving POST to /api/messages.
56
+ */
57
+ handleWebhook(activity: TeamsActivity): Promise<void>;
58
+ private toInboundMessage;
59
+ send(channelId: string, message: OutboundMessage): Promise<SendResult>;
60
+ private chunkMessage;
61
+ startTyping(channelId: string): Promise<() => void>;
62
+ onMessage(handler: (message: InboundMessage) => Promise<void>): void;
63
+ onError(handler: (error: Error) => void): void;
64
+ }
65
+ export {};
66
+ //# sourceMappingURL=teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/adapters/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;CACJ;AAeD,qBAAa,YAAa,YAAW,cAAc;IACjD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,IAAI,qBAAqB;IAElC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAK;gBAEZ,MAAM,EAAE,kBAAkB;IAIhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,WAAW,IAAI,OAAO;YAIR,cAAc;IA8B5B;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC3D,OAAO,CAAC,gBAAgB;IA+BlB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAsD5E,OAAO,CAAC,YAAY;IA6Bd,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAiCzD,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;CAG/C"}