@framers/agentos 0.1.26 → 0.1.28
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/api/AgentOSOrchestrator.js +1 -1
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/channels/ChannelRouter.d.ts.map +1 -1
- package/dist/channels/ChannelRouter.js +1 -1
- package/dist/channels/ChannelRouter.js.map +1 -1
- package/dist/channels/IChannelAdapter.d.ts.map +1 -1
- package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
- package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
- package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
- package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
- package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
- package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
- package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/index.d.ts +34 -0
- package/dist/channels/adapters/index.d.ts.map +1 -0
- package/dist/channels/adapters/index.js +25 -0
- package/dist/channels/adapters/index.js.map +1 -0
- package/dist/channels/index.d.ts +24 -0
- package/dist/channels/index.d.ts.map +1 -1
- package/dist/channels/index.js +16 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.js +0 -2
- package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -1
- package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +2 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -1
- package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.js +0 -1
- package/dist/core/safety/ToolExecutionGuard.js.map +1 -1
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +3 -9
- package/dist/extensions/ExtensionManager.js.map +1 -1
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Microsoft Teams Channel Adapter for AgentOS.
|
|
3
|
+
*
|
|
4
|
+
* Integrates with Microsoft Teams via the Bot Framework SDK
|
|
5
|
+
* (`botbuilder` / `botframework-connector`). The adapter creates
|
|
6
|
+
* a Bot Framework connector client and sends proactive messages
|
|
7
|
+
* and activities to Teams conversations.
|
|
8
|
+
*
|
|
9
|
+
* **Dependencies**: Requires `botbuilder` and `botframework-connector`
|
|
10
|
+
* to be installed.
|
|
11
|
+
*
|
|
12
|
+
* The adapter supports:
|
|
13
|
+
* - Personal (1:1) chat messages
|
|
14
|
+
* - Group chat messages
|
|
15
|
+
* - Channel messages (with threading)
|
|
16
|
+
* - Adaptive Cards (via buttons / rich text)
|
|
17
|
+
* - File attachments
|
|
18
|
+
* - Typing indicators
|
|
19
|
+
* - Reactions
|
|
20
|
+
* - Mentions
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const teams = new TeamsChannelAdapter();
|
|
25
|
+
* await teams.initialize({
|
|
26
|
+
* platform: 'teams',
|
|
27
|
+
* credential: '<app_id>',
|
|
28
|
+
* params: {
|
|
29
|
+
* appPassword: 'your-app-password',
|
|
30
|
+
* tenantId: 'your-tenant-id', // optional, for single-tenant
|
|
31
|
+
* serviceUrl: 'https://smba.trafficmanager.net/teams/',
|
|
32
|
+
* },
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @module @framers/agentos/channels/adapters/TeamsChannelAdapter
|
|
37
|
+
*/
|
|
38
|
+
import { BaseChannelAdapter } from './BaseChannelAdapter.js';
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// TeamsChannelAdapter
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Channel adapter for Microsoft Teams via Bot Framework.
|
|
44
|
+
*
|
|
45
|
+
* Uses `botbuilder` and `botframework-connector` via dynamic imports.
|
|
46
|
+
*
|
|
47
|
+
* Capabilities: `text`, `rich_text`, `images`, `documents`, `buttons`,
|
|
48
|
+
* `threads`, `mentions`, `reactions`, `group_chat`, `channels`.
|
|
49
|
+
*
|
|
50
|
+
* Conversation ID format:
|
|
51
|
+
* - Direct: the conversation ID from Teams (opaque string)
|
|
52
|
+
* - Channel: `<channelId>` with optional `replyToMessageId` for threading
|
|
53
|
+
*/
|
|
54
|
+
export class TeamsChannelAdapter extends BaseChannelAdapter {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(...arguments);
|
|
57
|
+
this.platform = 'teams';
|
|
58
|
+
this.displayName = 'Microsoft Teams';
|
|
59
|
+
this.capabilities = [
|
|
60
|
+
'text',
|
|
61
|
+
'rich_text',
|
|
62
|
+
'images',
|
|
63
|
+
'documents',
|
|
64
|
+
'buttons',
|
|
65
|
+
'threads',
|
|
66
|
+
'mentions',
|
|
67
|
+
'reactions',
|
|
68
|
+
'group_chat',
|
|
69
|
+
'channels',
|
|
70
|
+
];
|
|
71
|
+
/** Service URL for the Teams tenant. */
|
|
72
|
+
this.serviceUrl = 'https://smba.trafficmanager.net/teams/';
|
|
73
|
+
/** Conversation references for proactive messaging, keyed by conversation ID. */
|
|
74
|
+
this.conversationReferences = new Map();
|
|
75
|
+
}
|
|
76
|
+
// ── Abstract hook implementations ──
|
|
77
|
+
async doConnect(auth) {
|
|
78
|
+
const params = auth.params ?? {};
|
|
79
|
+
this.appId = auth.credential;
|
|
80
|
+
if (!this.appId) {
|
|
81
|
+
throw new Error('Teams auth credential (appId) is required.');
|
|
82
|
+
}
|
|
83
|
+
if (!params.appPassword) {
|
|
84
|
+
throw new Error('Teams auth params must include "appPassword".');
|
|
85
|
+
}
|
|
86
|
+
this.serviceUrl = params.serviceUrl ?? this.serviceUrl;
|
|
87
|
+
this.tenantId = params.tenantId;
|
|
88
|
+
// Dynamic imports
|
|
89
|
+
let MicrosoftAppCredentials; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
90
|
+
let ConnectorClient; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
91
|
+
let BotFrameworkAdapter; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
92
|
+
try {
|
|
93
|
+
const connector = await import('botframework-connector');
|
|
94
|
+
MicrosoftAppCredentials =
|
|
95
|
+
connector.MicrosoftAppCredentials ??
|
|
96
|
+
connector.default?.MicrosoftAppCredentials;
|
|
97
|
+
ConnectorClient =
|
|
98
|
+
connector.ConnectorClient ??
|
|
99
|
+
connector.default?.ConnectorClient;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new Error('The "botframework-connector" package is required for the Teams adapter. ' +
|
|
103
|
+
'Install it with: npm install botframework-connector');
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const botbuilder = await import('botbuilder');
|
|
107
|
+
BotFrameworkAdapter =
|
|
108
|
+
botbuilder.BotFrameworkAdapter ??
|
|
109
|
+
botbuilder.default?.BotFrameworkAdapter;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// botbuilder is optional — needed only for incoming webhook processing
|
|
113
|
+
console.warn('[Teams] "botbuilder" package not found. Incoming message processing ' +
|
|
114
|
+
'will not be available. Install it with: npm install botbuilder');
|
|
115
|
+
}
|
|
116
|
+
// Create credentials
|
|
117
|
+
this.credentials = new MicrosoftAppCredentials(this.appId, params.appPassword);
|
|
118
|
+
if (this.tenantId) {
|
|
119
|
+
this.credentials.oAuthEndpoint = `https://login.microsoftonline.com/${this.tenantId}`;
|
|
120
|
+
}
|
|
121
|
+
// Create connector client
|
|
122
|
+
this.connectorClient = new ConnectorClient(this.credentials, {
|
|
123
|
+
baseUri: this.serviceUrl,
|
|
124
|
+
});
|
|
125
|
+
// Verify credentials by fetching the token
|
|
126
|
+
try {
|
|
127
|
+
await this.credentials.getToken(true);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
131
|
+
throw new Error(`Teams credential verification failed: ${message}`);
|
|
132
|
+
}
|
|
133
|
+
// Create bot adapter for incoming messages (if botbuilder is available)
|
|
134
|
+
if (BotFrameworkAdapter) {
|
|
135
|
+
this.botAdapter = new BotFrameworkAdapter({
|
|
136
|
+
appId: this.appId,
|
|
137
|
+
appPassword: params.appPassword,
|
|
138
|
+
...(this.tenantId ? { channelAuthTenant: this.tenantId } : {}),
|
|
139
|
+
});
|
|
140
|
+
// Set up error handler
|
|
141
|
+
this.botAdapter.onTurnError = async (_context, error) => {
|
|
142
|
+
console.error('[Teams] Bot adapter turn error:', error);
|
|
143
|
+
this.emit({
|
|
144
|
+
type: 'error',
|
|
145
|
+
platform: 'teams',
|
|
146
|
+
conversationId: '',
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
data: { error: error.message },
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
this.platformInfo = {
|
|
153
|
+
appId: this.appId,
|
|
154
|
+
serviceUrl: this.serviceUrl,
|
|
155
|
+
tenantId: this.tenantId ?? 'multi-tenant',
|
|
156
|
+
hasBotAdapter: !!this.botAdapter,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
async doSendMessage(conversationId, content) {
|
|
160
|
+
if (!this.connectorClient) {
|
|
161
|
+
throw new Error('[Teams] Connector client is not initialized.');
|
|
162
|
+
}
|
|
163
|
+
// Build the activity
|
|
164
|
+
const activity = this.buildActivity(content);
|
|
165
|
+
// Handle threading
|
|
166
|
+
if (content.replyToMessageId) {
|
|
167
|
+
activity.replyToId = content.replyToMessageId;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
// Send the activity to the conversation
|
|
171
|
+
const response = await this.connectorClient.conversations.sendToConversation(conversationId, activity);
|
|
172
|
+
return {
|
|
173
|
+
messageId: response?.id ?? `teams-${Date.now()}`,
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
179
|
+
// Check if we need to use a conversation reference for proactive messaging
|
|
180
|
+
const ref = this.conversationReferences.get(conversationId);
|
|
181
|
+
if (ref && this.botAdapter) {
|
|
182
|
+
return this.sendProactiveMessage(ref, activity);
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`[Teams] Failed to send message: ${message}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async doShutdown() {
|
|
188
|
+
this.connectorClient = undefined;
|
|
189
|
+
this.botAdapter = undefined;
|
|
190
|
+
this.credentials = undefined;
|
|
191
|
+
this.appId = undefined;
|
|
192
|
+
this.conversationReferences.clear();
|
|
193
|
+
}
|
|
194
|
+
// ── IChannelAdapter optional methods ──
|
|
195
|
+
async sendTypingIndicator(conversationId, _isTyping) {
|
|
196
|
+
if (!this.connectorClient)
|
|
197
|
+
return;
|
|
198
|
+
try {
|
|
199
|
+
await this.connectorClient.conversations.sendToConversation(conversationId, { type: 'typing' });
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Non-fatal — typing indicators are best-effort
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async editMessage(conversationId, messageId, content) {
|
|
206
|
+
if (!this.connectorClient) {
|
|
207
|
+
throw new Error('[Teams] Connector client is not initialized.');
|
|
208
|
+
}
|
|
209
|
+
const activity = this.buildActivity(content);
|
|
210
|
+
activity.id = messageId;
|
|
211
|
+
await this.connectorClient.conversations.updateActivity(conversationId, messageId, activity);
|
|
212
|
+
}
|
|
213
|
+
async deleteMessage(conversationId, messageId) {
|
|
214
|
+
if (!this.connectorClient) {
|
|
215
|
+
throw new Error('[Teams] Connector client is not initialized.');
|
|
216
|
+
}
|
|
217
|
+
await this.connectorClient.conversations.deleteActivity(conversationId, messageId);
|
|
218
|
+
}
|
|
219
|
+
// ── Teams-specific public methods ──
|
|
220
|
+
/**
|
|
221
|
+
* Process an incoming Bot Framework request (webhook handler).
|
|
222
|
+
* Call this from your HTTP endpoint that receives Teams webhook POSTs.
|
|
223
|
+
*
|
|
224
|
+
* @param req - HTTP request object.
|
|
225
|
+
* @param res - HTTP response object.
|
|
226
|
+
*/
|
|
227
|
+
async processIncomingActivity(req, res) {
|
|
228
|
+
if (!this.botAdapter) {
|
|
229
|
+
throw new Error('[Teams] Bot adapter not available. Install "botbuilder" package.');
|
|
230
|
+
}
|
|
231
|
+
await this.botAdapter.process(req, res, async (context) => {
|
|
232
|
+
await this.handleTurnContext(context);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Store a conversation reference for later proactive messaging.
|
|
237
|
+
* Typically called when first receiving a message from a conversation.
|
|
238
|
+
*/
|
|
239
|
+
storeConversationReference(conversationId, reference) {
|
|
240
|
+
this.conversationReferences.set(conversationId, reference);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Create a new conversation with a Teams user (proactive outreach).
|
|
244
|
+
*
|
|
245
|
+
* @param userId - The Teams user ID to start a conversation with.
|
|
246
|
+
* @returns The new conversation ID.
|
|
247
|
+
*/
|
|
248
|
+
async createConversation(userId) {
|
|
249
|
+
if (!this.connectorClient || !this.appId) {
|
|
250
|
+
throw new Error('[Teams] Connector client is not initialized.');
|
|
251
|
+
}
|
|
252
|
+
const conversationParams = {
|
|
253
|
+
bot: { id: this.appId },
|
|
254
|
+
members: [{ id: userId }],
|
|
255
|
+
isGroup: false,
|
|
256
|
+
tenantId: this.tenantId,
|
|
257
|
+
};
|
|
258
|
+
const response = await this.connectorClient.conversations.createConversation(conversationParams);
|
|
259
|
+
return response?.id ?? '';
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get the Bot Framework adapter for advanced use cases.
|
|
263
|
+
* Returns undefined if botbuilder is not installed.
|
|
264
|
+
*/
|
|
265
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
266
|
+
getBotAdapter() {
|
|
267
|
+
return this.botAdapter;
|
|
268
|
+
}
|
|
269
|
+
// ── Private: Activity building ──
|
|
270
|
+
buildActivity(content) {
|
|
271
|
+
const activity = {
|
|
272
|
+
type: 'message',
|
|
273
|
+
};
|
|
274
|
+
const textParts = [];
|
|
275
|
+
const attachments = [];
|
|
276
|
+
const entities = [];
|
|
277
|
+
for (const block of content.blocks) {
|
|
278
|
+
switch (block.type) {
|
|
279
|
+
case 'text':
|
|
280
|
+
textParts.push(block.text);
|
|
281
|
+
break;
|
|
282
|
+
case 'embed':
|
|
283
|
+
// Rich text / embeds sent as HTML in Teams
|
|
284
|
+
if ('text' in block && typeof block.text === 'string') {
|
|
285
|
+
textParts.push(block.text);
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
case 'image':
|
|
289
|
+
attachments.push({
|
|
290
|
+
contentType: block.mimeType ?? 'image/png',
|
|
291
|
+
contentUrl: block.url,
|
|
292
|
+
name: block.caption ?? 'image',
|
|
293
|
+
});
|
|
294
|
+
if (block.caption) {
|
|
295
|
+
textParts.push(block.caption);
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
case 'document':
|
|
299
|
+
attachments.push({
|
|
300
|
+
contentType: block.mimeType ?? 'application/octet-stream',
|
|
301
|
+
contentUrl: block.url,
|
|
302
|
+
name: block.filename,
|
|
303
|
+
});
|
|
304
|
+
break;
|
|
305
|
+
case 'video':
|
|
306
|
+
attachments.push({
|
|
307
|
+
contentType: block.mimeType ?? 'video/mp4',
|
|
308
|
+
contentUrl: block.url,
|
|
309
|
+
name: block.caption ?? 'video',
|
|
310
|
+
});
|
|
311
|
+
break;
|
|
312
|
+
case 'button_group':
|
|
313
|
+
// Build an Adaptive Card with actions
|
|
314
|
+
attachments.push(this.buildAdaptiveCardWithButtons(block.buttons));
|
|
315
|
+
break;
|
|
316
|
+
case 'embed':
|
|
317
|
+
attachments.push(this.buildAdaptiveCardEmbed(block));
|
|
318
|
+
break;
|
|
319
|
+
case 'poll':
|
|
320
|
+
attachments.push(this.buildAdaptiveCardPoll(block));
|
|
321
|
+
break;
|
|
322
|
+
default:
|
|
323
|
+
// Unsupported block type — skip
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (textParts.length > 0) {
|
|
328
|
+
activity.text = textParts.join('\n\n');
|
|
329
|
+
}
|
|
330
|
+
if (attachments.length > 0) {
|
|
331
|
+
activity.attachments = attachments;
|
|
332
|
+
}
|
|
333
|
+
if (entities.length > 0) {
|
|
334
|
+
activity.entities = entities;
|
|
335
|
+
}
|
|
336
|
+
// Platform options pass-through
|
|
337
|
+
if (content.platformOptions) {
|
|
338
|
+
Object.assign(activity, content.platformOptions);
|
|
339
|
+
}
|
|
340
|
+
return activity;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Build an Adaptive Card attachment containing action buttons.
|
|
344
|
+
*/
|
|
345
|
+
buildAdaptiveCardWithButtons(buttons) {
|
|
346
|
+
return {
|
|
347
|
+
contentType: 'application/vnd.microsoft.card.adaptive',
|
|
348
|
+
content: {
|
|
349
|
+
type: 'AdaptiveCard',
|
|
350
|
+
version: '1.4',
|
|
351
|
+
body: [],
|
|
352
|
+
actions: buttons.map((btn) => {
|
|
353
|
+
if (btn.action === 'url') {
|
|
354
|
+
return {
|
|
355
|
+
type: 'Action.OpenUrl',
|
|
356
|
+
title: btn.label,
|
|
357
|
+
url: btn.value,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
type: 'Action.Submit',
|
|
362
|
+
title: btn.label,
|
|
363
|
+
data: { actionId: btn.id, value: btn.value },
|
|
364
|
+
};
|
|
365
|
+
}),
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Build an Adaptive Card for embed-style content.
|
|
371
|
+
*/
|
|
372
|
+
buildAdaptiveCardEmbed(block) {
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
374
|
+
const body = [];
|
|
375
|
+
body.push({
|
|
376
|
+
type: 'TextBlock',
|
|
377
|
+
text: block.title,
|
|
378
|
+
weight: 'bolder',
|
|
379
|
+
size: 'medium',
|
|
380
|
+
});
|
|
381
|
+
if (block.description) {
|
|
382
|
+
body.push({
|
|
383
|
+
type: 'TextBlock',
|
|
384
|
+
text: block.description,
|
|
385
|
+
wrap: true,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
if (block.fields) {
|
|
389
|
+
const columns = block.fields.map((f) => ({
|
|
390
|
+
type: 'Column',
|
|
391
|
+
width: f.inline ? 'auto' : 'stretch',
|
|
392
|
+
items: [
|
|
393
|
+
{ type: 'TextBlock', text: f.name, weight: 'bolder', size: 'small' },
|
|
394
|
+
{ type: 'TextBlock', text: f.value, wrap: true },
|
|
395
|
+
],
|
|
396
|
+
}));
|
|
397
|
+
body.push({
|
|
398
|
+
type: 'ColumnSet',
|
|
399
|
+
columns,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
403
|
+
const actions = [];
|
|
404
|
+
if (block.url) {
|
|
405
|
+
actions.push({
|
|
406
|
+
type: 'Action.OpenUrl',
|
|
407
|
+
title: 'Open Link',
|
|
408
|
+
url: block.url,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
contentType: 'application/vnd.microsoft.card.adaptive',
|
|
413
|
+
content: {
|
|
414
|
+
type: 'AdaptiveCard',
|
|
415
|
+
version: '1.4',
|
|
416
|
+
body,
|
|
417
|
+
...(actions.length > 0 ? { actions } : {}),
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Build an Adaptive Card for poll content.
|
|
423
|
+
*/
|
|
424
|
+
buildAdaptiveCardPoll(block) {
|
|
425
|
+
return {
|
|
426
|
+
contentType: 'application/vnd.microsoft.card.adaptive',
|
|
427
|
+
content: {
|
|
428
|
+
type: 'AdaptiveCard',
|
|
429
|
+
version: '1.4',
|
|
430
|
+
body: [
|
|
431
|
+
{
|
|
432
|
+
type: 'TextBlock',
|
|
433
|
+
text: block.question,
|
|
434
|
+
weight: 'bolder',
|
|
435
|
+
size: 'medium',
|
|
436
|
+
wrap: true,
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
type: 'Input.ChoiceSet',
|
|
440
|
+
id: 'pollChoice',
|
|
441
|
+
style: 'expanded',
|
|
442
|
+
choices: block.options.map((opt, idx) => ({
|
|
443
|
+
title: opt,
|
|
444
|
+
value: String(idx),
|
|
445
|
+
})),
|
|
446
|
+
},
|
|
447
|
+
],
|
|
448
|
+
actions: [
|
|
449
|
+
{
|
|
450
|
+
type: 'Action.Submit',
|
|
451
|
+
title: 'Vote',
|
|
452
|
+
data: { action: 'pollVote' },
|
|
453
|
+
},
|
|
454
|
+
],
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
// ── Private: proactive messaging ──
|
|
459
|
+
async sendProactiveMessage(reference, activity) {
|
|
460
|
+
if (!this.botAdapter) {
|
|
461
|
+
throw new Error('[Teams] Bot adapter required for proactive messaging.');
|
|
462
|
+
}
|
|
463
|
+
return new Promise((resolve, reject) => {
|
|
464
|
+
this.botAdapter.continueConversation(reference, async (context) => {
|
|
465
|
+
try {
|
|
466
|
+
const response = await context.sendActivity(activity);
|
|
467
|
+
resolve({
|
|
468
|
+
messageId: response?.id ?? `teams-${Date.now()}`,
|
|
469
|
+
timestamp: new Date().toISOString(),
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
catch (err) {
|
|
473
|
+
reject(err);
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
// ── Private: incoming activity processing ──
|
|
479
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
480
|
+
async handleTurnContext(context) {
|
|
481
|
+
const activity = context.activity;
|
|
482
|
+
if (!activity)
|
|
483
|
+
return;
|
|
484
|
+
// Store conversation reference for proactive messaging
|
|
485
|
+
const ref = {
|
|
486
|
+
activityId: activity.id,
|
|
487
|
+
user: activity.from,
|
|
488
|
+
bot: activity.recipient,
|
|
489
|
+
conversation: activity.conversation,
|
|
490
|
+
channelId: activity.channelId,
|
|
491
|
+
serviceUrl: activity.serviceUrl,
|
|
492
|
+
};
|
|
493
|
+
this.conversationReferences.set(activity.conversation?.id, ref);
|
|
494
|
+
switch (activity.type) {
|
|
495
|
+
case 'message':
|
|
496
|
+
this.handleIncomingMessage(activity);
|
|
497
|
+
break;
|
|
498
|
+
case 'messageReaction':
|
|
499
|
+
this.handleReaction(activity);
|
|
500
|
+
break;
|
|
501
|
+
case 'conversationUpdate':
|
|
502
|
+
this.handleConversationUpdate(activity);
|
|
503
|
+
break;
|
|
504
|
+
default:
|
|
505
|
+
break;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
509
|
+
handleIncomingMessage(activity) {
|
|
510
|
+
const conversationId = activity.conversation?.id ?? 'unknown';
|
|
511
|
+
const isGroup = activity.conversation?.conversationType === 'groupChat' ||
|
|
512
|
+
activity.conversation?.conversationType === 'channel';
|
|
513
|
+
const contentBlocks = [];
|
|
514
|
+
if (activity.text) {
|
|
515
|
+
contentBlocks.push({ type: 'text', text: activity.text });
|
|
516
|
+
}
|
|
517
|
+
// Process attachments
|
|
518
|
+
if (activity.attachments) {
|
|
519
|
+
for (const att of activity.attachments) {
|
|
520
|
+
if (att.contentType?.startsWith('image/')) {
|
|
521
|
+
contentBlocks.push({
|
|
522
|
+
type: 'image',
|
|
523
|
+
url: att.contentUrl ?? '',
|
|
524
|
+
mimeType: att.contentType,
|
|
525
|
+
caption: att.name,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
else if (att.contentUrl) {
|
|
529
|
+
contentBlocks.push({
|
|
530
|
+
type: 'document',
|
|
531
|
+
url: att.contentUrl,
|
|
532
|
+
filename: att.name ?? 'attachment',
|
|
533
|
+
mimeType: att.contentType,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
const message = {
|
|
539
|
+
messageId: activity.id ?? `teams-${Date.now()}`,
|
|
540
|
+
platform: 'teams',
|
|
541
|
+
conversationId,
|
|
542
|
+
conversationType: isGroup ? 'group' : 'direct',
|
|
543
|
+
sender: {
|
|
544
|
+
id: activity.from?.id ?? 'unknown',
|
|
545
|
+
displayName: activity.from?.name,
|
|
546
|
+
username: activity.from?.aadObjectId,
|
|
547
|
+
},
|
|
548
|
+
content: contentBlocks.length > 0 ? contentBlocks : [{ type: 'text', text: '' }],
|
|
549
|
+
text: activity.text ?? '',
|
|
550
|
+
timestamp: activity.timestamp ?? new Date().toISOString(),
|
|
551
|
+
replyToMessageId: activity.replyToId,
|
|
552
|
+
rawEvent: activity,
|
|
553
|
+
};
|
|
554
|
+
this.emit({
|
|
555
|
+
type: 'message',
|
|
556
|
+
platform: 'teams',
|
|
557
|
+
conversationId,
|
|
558
|
+
timestamp: message.timestamp,
|
|
559
|
+
data: message,
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
563
|
+
handleReaction(activity) {
|
|
564
|
+
const conversationId = activity.conversation?.id ?? 'unknown';
|
|
565
|
+
if (activity.reactionsAdded) {
|
|
566
|
+
for (const reaction of activity.reactionsAdded) {
|
|
567
|
+
this.emit({
|
|
568
|
+
type: 'reaction_added',
|
|
569
|
+
platform: 'teams',
|
|
570
|
+
conversationId,
|
|
571
|
+
timestamp: new Date().toISOString(),
|
|
572
|
+
data: {
|
|
573
|
+
emoji: reaction.type,
|
|
574
|
+
messageId: activity.replyToId,
|
|
575
|
+
sender: {
|
|
576
|
+
id: activity.from?.id ?? 'unknown',
|
|
577
|
+
displayName: activity.from?.name,
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
if (activity.reactionsRemoved) {
|
|
584
|
+
for (const reaction of activity.reactionsRemoved) {
|
|
585
|
+
this.emit({
|
|
586
|
+
type: 'reaction_removed',
|
|
587
|
+
platform: 'teams',
|
|
588
|
+
conversationId,
|
|
589
|
+
timestamp: new Date().toISOString(),
|
|
590
|
+
data: {
|
|
591
|
+
emoji: reaction.type,
|
|
592
|
+
messageId: activity.replyToId,
|
|
593
|
+
sender: {
|
|
594
|
+
id: activity.from?.id ?? 'unknown',
|
|
595
|
+
displayName: activity.from?.name,
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
603
|
+
handleConversationUpdate(activity) {
|
|
604
|
+
const conversationId = activity.conversation?.id ?? 'unknown';
|
|
605
|
+
if (activity.membersAdded) {
|
|
606
|
+
for (const member of activity.membersAdded) {
|
|
607
|
+
this.emit({
|
|
608
|
+
type: 'member_joined',
|
|
609
|
+
platform: 'teams',
|
|
610
|
+
conversationId,
|
|
611
|
+
timestamp: new Date().toISOString(),
|
|
612
|
+
data: {
|
|
613
|
+
user: {
|
|
614
|
+
id: member.id,
|
|
615
|
+
displayName: member.name,
|
|
616
|
+
},
|
|
617
|
+
},
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
if (activity.membersRemoved) {
|
|
622
|
+
for (const member of activity.membersRemoved) {
|
|
623
|
+
this.emit({
|
|
624
|
+
type: 'member_left',
|
|
625
|
+
platform: 'teams',
|
|
626
|
+
conversationId,
|
|
627
|
+
timestamp: new Date().toISOString(),
|
|
628
|
+
data: {
|
|
629
|
+
user: {
|
|
630
|
+
id: member.id,
|
|
631
|
+
displayName: member.name,
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
//# sourceMappingURL=TeamsChannelAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamsChannelAdapter.js","sourceRoot":"","sources":["../../../src/channels/adapters/TeamsChannelAdapter.ts"],"names":[],"mappings":"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"}
|