@cuylabs/agent-channel-teams 0.14.1 → 0.16.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.
- package/dist/index.d.ts +22 -3
- package/dist/index.js +41 -7
- package/package.json +7 -5
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ declare function createTeamsInvokeActivity<T = unknown>(result: TeamsInvokeResul
|
|
|
15
15
|
declare function sendTeamsInvoke<T = unknown>(context: TurnContext, body?: T, status?: number): Promise<void>;
|
|
16
16
|
|
|
17
17
|
type TeamsSurface = "personal" | "channel" | "group" | "meeting" | "unknown";
|
|
18
|
-
type TeamsActivityKind = "message" | "conversation-update" | "members-added" | "members-removed" | "channel-created" | "channel-deleted" | "channel-renamed" | "channel-restored" | "channel-shared" | "channel-unshared" | "team-renamed" | "team-archived" | "team-unarchived" | "team-deleted" | "team-hard-deleted" | "team-restored" | "message-edit" | "message-delete" | "message-restore" | "reaction" | "read-receipt" | "config-fetch" | "config-submit" | "file-consent" | "actionable-message-execute-action" | "card-submit" | "feedback" | "dialog-open" | "dialog-submit" | "task-fetch" | "task-submit" | "search-command" | "message-extension-query" | "message-extension-query-link" | "message-extension-anonymous-query-link" | "select-result" | "message-extension-select-item" | "message-extension-submit-action" | "message-extension-fetch-task" | "message-extension-query-setting-url" | "message-extension-setting" | "message-extension-card-button-clicked" | "tab-fetch" | "tab-submit" | "invoke" | "meeting-start" | "meeting-end" | "participants-join" | "participants-leave" | "meeting-room-join" | "meeting-room-leave" | "meeting-stage-view" | "meeting-smart-reply" | "meeting-reaction" | "meeting-poll-response" | "meeting-apps-installed" | "meeting-apps-uninstalled" | "meeting-recording-started" | "meeting-recording-stopped" | "meeting-focus-change" | "meeting-screen-share-start" | "meeting-screen-share-stop" | "other";
|
|
18
|
+
type TeamsActivityKind = "message" | "conversation-update" | "members-added" | "members-removed" | "channel-created" | "channel-deleted" | "channel-renamed" | "channel-restored" | "channel-shared" | "channel-unshared" | "team-renamed" | "team-archived" | "team-unarchived" | "team-deleted" | "team-hard-deleted" | "team-restored" | "message-edit" | "message-delete" | "message-restore" | "reaction" | "read-receipt" | "config-fetch" | "config-submit" | "file-consent" | "actionable-message-execute-action" | "adaptive-card-action" | "adaptive-card-search" | "card-submit" | "feedback" | "dialog-open" | "dialog-submit" | "task-fetch" | "task-submit" | "search-command" | "message-extension-query" | "message-extension-query-link" | "message-extension-anonymous-query-link" | "select-result" | "message-extension-select-item" | "message-extension-submit-action" | "message-extension-fetch-task" | "message-extension-query-setting-url" | "message-extension-setting" | "message-extension-card-button-clicked" | "tab-fetch" | "tab-submit" | "invoke" | "meeting-start" | "meeting-end" | "participants-join" | "participants-leave" | "meeting-room-join" | "meeting-room-leave" | "meeting-stage-view" | "meeting-smart-reply" | "meeting-reaction" | "meeting-poll-response" | "meeting-apps-installed" | "meeting-apps-uninstalled" | "meeting-recording-started" | "meeting-recording-stopped" | "meeting-focus-change" | "meeting-screen-share-start" | "meeting-screen-share-stop" | "other";
|
|
19
19
|
interface TeamsActorReference {
|
|
20
20
|
id?: string;
|
|
21
21
|
displayName?: string;
|
|
@@ -94,6 +94,8 @@ interface TeamsMessageActivityHandlers {
|
|
|
94
94
|
}
|
|
95
95
|
interface TeamsCardActionHandlers {
|
|
96
96
|
cardSubmit?: TeamsActivityHandler;
|
|
97
|
+
adaptiveCardAction?: TeamsActivityHandler;
|
|
98
|
+
adaptiveCardSearch?: TeamsActivityHandler;
|
|
97
99
|
feedbackSubmit?: TeamsActivityHandler;
|
|
98
100
|
fileConsent?: TeamsActivityHandler;
|
|
99
101
|
actionableMessageExecuteAction?: TeamsActivityHandler;
|
|
@@ -171,6 +173,17 @@ interface TeamsActivityHandlers extends TeamsConversationUpdateHandlers, TeamsMe
|
|
|
171
173
|
invoke?: TeamsActivityHandler;
|
|
172
174
|
}
|
|
173
175
|
interface TeamsChannelOptions extends Omit<M365ChannelOptions, "prepareTurn"> {
|
|
176
|
+
/**
|
|
177
|
+
* Whether malformed Teams channelData should throw while parsing.
|
|
178
|
+
*
|
|
179
|
+
* Keep this enabled in tests and strict hosts that want SDK payload drift to
|
|
180
|
+
* fail fast. Disable it in production bots that should continue handling the
|
|
181
|
+
* turn with best-effort Teams metadata when an unexpected channelData shape
|
|
182
|
+
* arrives.
|
|
183
|
+
*
|
|
184
|
+
* @default true
|
|
185
|
+
*/
|
|
186
|
+
strictChannelData?: boolean;
|
|
174
187
|
/**
|
|
175
188
|
* Teams-native turn preparation hook. The result is forwarded into the
|
|
176
189
|
* underlying M365 channel adapter.
|
|
@@ -282,10 +295,15 @@ interface TeamsDialogMessageBody {
|
|
|
282
295
|
declare function createTeamsDialog(dialog: TeamsDialogDefinition): TeamsDialogResponse;
|
|
283
296
|
declare function createTeamsDialogMessage(message: string): TeamsDialogMessageBody;
|
|
284
297
|
|
|
298
|
+
interface ParseTeamsActivityOptions {
|
|
299
|
+
strictChannelData?: boolean;
|
|
300
|
+
}
|
|
285
301
|
declare const TEAMS_CONFIG_FETCH_NAMES: readonly ["config/fetch"];
|
|
286
302
|
declare const TEAMS_CONFIG_SUBMIT_NAMES: readonly ["config/submit"];
|
|
287
303
|
declare const TEAMS_FILE_CONSENT_NAMES: readonly ["fileConsent/invoke"];
|
|
288
304
|
declare const TEAMS_ACTIONABLE_MESSAGE_NAMES: readonly ["actionableMessage/executeAction"];
|
|
305
|
+
declare const TEAMS_ADAPTIVE_CARD_ACTION_NAMES: readonly ["adaptiveCard/action"];
|
|
306
|
+
declare const TEAMS_ADAPTIVE_CARD_SEARCH_NAMES: readonly ["application/search"];
|
|
289
307
|
declare const TEAMS_TASK_MODULE_FETCH_NAMES: readonly ["task/fetch", "composeExtension/fetchTask"];
|
|
290
308
|
declare const TEAMS_TASK_MODULE_SUBMIT_NAMES: readonly ["task/submit"];
|
|
291
309
|
declare const TEAMS_TAB_FETCH_NAMES: readonly ["tab/fetch"];
|
|
@@ -301,6 +319,7 @@ declare const TEAMS_CARD_ACTION_SUBMIT_NAMES: readonly ["message/submitAction"];
|
|
|
301
319
|
declare const TEAMS_CONVERSATION_UPDATE_EVENT_NAMES: Readonly<Record<string, TeamsActivityKind>>;
|
|
302
320
|
declare const TEAMS_MEETING_EVENT_NAMES: Readonly<Record<string, TeamsActivityKind>>;
|
|
303
321
|
declare const TEAMS_MEETING_INVOKE_NAMES: Readonly<Record<string, TeamsActivityKind>>;
|
|
304
|
-
declare function parseTeamsActivity(context: TurnContext): TeamsActivityInfo;
|
|
322
|
+
declare function parseTeamsActivity(context: TurnContext, options?: ParseTeamsActivityOptions): TeamsActivityInfo;
|
|
323
|
+
declare function parseTeamsActivitySafe(context: TurnContext): TeamsActivityInfo;
|
|
305
324
|
|
|
306
|
-
export { type MountTeamsAgentOptions, type MountTeamsAgentResult, TEAMS_ACTIONABLE_MESSAGE_NAMES, TEAMS_CARD_ACTION_SUBMIT_NAMES, TEAMS_CONFIG_FETCH_NAMES, TEAMS_CONFIG_SUBMIT_NAMES, TEAMS_CONVERSATION_UPDATE_EVENT_NAMES, TEAMS_FILE_CONSENT_NAMES, TEAMS_MEETING_EVENT_NAMES, TEAMS_MEETING_INVOKE_NAMES, TEAMS_MESSAGE_EXTENSION_CARD_BUTTON_CLICKED_NAMES, TEAMS_MESSAGE_EXTENSION_FETCH_TASK_NAMES, TEAMS_MESSAGE_EXTENSION_QUERY_NAMES, TEAMS_MESSAGE_EXTENSION_QUERY_SETTING_URL_NAMES, TEAMS_MESSAGE_EXTENSION_SELECT_NAMES, TEAMS_MESSAGE_EXTENSION_SETTING_NAMES, TEAMS_MESSAGE_EXTENSION_SUBMIT_ACTION_NAMES, TEAMS_TAB_FETCH_NAMES, TEAMS_TAB_SUBMIT_NAMES, TEAMS_TASK_MODULE_FETCH_NAMES, TEAMS_TASK_MODULE_SUBMIT_NAMES, type TeamsActivityHandler, type TeamsActivityHandlers, type TeamsActivityInfo, type TeamsActivityKind, type TeamsActorReference, type TeamsAmbientTurnContext, type TeamsCardActionHandlers, type TeamsChannelAdapter, type TeamsChannelOptions, type TeamsConfigHandlers, type TeamsConversationUpdateHandlers, type TeamsDialogDefinition, type TeamsDialogMessageBody, type TeamsDialogResponse, type TeamsDialogSize, type TeamsHandlerContext, type TeamsHandlerDecision, type TeamsInvokeResult, type TeamsMeetingHandlers, type TeamsMessageActivityHandlers, type TeamsMessageExtensionHandlers, type TeamsSearchAttachment, type TeamsSearchLayout, type TeamsSearchMessageBody, type TeamsSearchResponse, type TeamsSearchResult, type TeamsSearchResultBody, type TeamsSearchResultType, type TeamsSurface, type TeamsTabHandlers, type TeamsTaskModuleHandlers, type TeamsTurnPreparation, type TeamsTurnRequestContext, createTeamsChannelAdapter, createTeamsDialog, createTeamsDialogMessage, createTeamsInvokeActivity, createTeamsSearchMessage, createTeamsSearchResult, currentTeamsTurnContext, mountTeamsAgent, parseTeamsActivity, runWithTeamsTurnContext, sendTeamsInvoke };
|
|
325
|
+
export { type MountTeamsAgentOptions, type MountTeamsAgentResult, type ParseTeamsActivityOptions, TEAMS_ACTIONABLE_MESSAGE_NAMES, TEAMS_ADAPTIVE_CARD_ACTION_NAMES, TEAMS_ADAPTIVE_CARD_SEARCH_NAMES, TEAMS_CARD_ACTION_SUBMIT_NAMES, TEAMS_CONFIG_FETCH_NAMES, TEAMS_CONFIG_SUBMIT_NAMES, TEAMS_CONVERSATION_UPDATE_EVENT_NAMES, TEAMS_FILE_CONSENT_NAMES, TEAMS_MEETING_EVENT_NAMES, TEAMS_MEETING_INVOKE_NAMES, TEAMS_MESSAGE_EXTENSION_CARD_BUTTON_CLICKED_NAMES, TEAMS_MESSAGE_EXTENSION_FETCH_TASK_NAMES, TEAMS_MESSAGE_EXTENSION_QUERY_NAMES, TEAMS_MESSAGE_EXTENSION_QUERY_SETTING_URL_NAMES, TEAMS_MESSAGE_EXTENSION_SELECT_NAMES, TEAMS_MESSAGE_EXTENSION_SETTING_NAMES, TEAMS_MESSAGE_EXTENSION_SUBMIT_ACTION_NAMES, TEAMS_TAB_FETCH_NAMES, TEAMS_TAB_SUBMIT_NAMES, TEAMS_TASK_MODULE_FETCH_NAMES, TEAMS_TASK_MODULE_SUBMIT_NAMES, type TeamsActivityHandler, type TeamsActivityHandlers, type TeamsActivityInfo, type TeamsActivityKind, type TeamsActorReference, type TeamsAmbientTurnContext, type TeamsCardActionHandlers, type TeamsChannelAdapter, type TeamsChannelOptions, type TeamsConfigHandlers, type TeamsConversationUpdateHandlers, type TeamsDialogDefinition, type TeamsDialogMessageBody, type TeamsDialogResponse, type TeamsDialogSize, type TeamsHandlerContext, type TeamsHandlerDecision, type TeamsInvokeResult, type TeamsMeetingHandlers, type TeamsMessageActivityHandlers, type TeamsMessageExtensionHandlers, type TeamsSearchAttachment, type TeamsSearchLayout, type TeamsSearchMessageBody, type TeamsSearchResponse, type TeamsSearchResult, type TeamsSearchResultBody, type TeamsSearchResultType, type TeamsSurface, type TeamsTabHandlers, type TeamsTaskModuleHandlers, type TeamsTurnPreparation, type TeamsTurnRequestContext, createTeamsChannelAdapter, createTeamsDialog, createTeamsDialogMessage, createTeamsInvokeActivity, createTeamsSearchMessage, createTeamsSearchResult, currentTeamsTurnContext, mountTeamsAgent, parseTeamsActivity, parseTeamsActivitySafe, runWithTeamsTurnContext, sendTeamsInvoke };
|
package/dist/index.js
CHANGED
|
@@ -47,9 +47,16 @@ function detectSurface(conversationType, meetingId, teamId) {
|
|
|
47
47
|
function includesName(names, candidate) {
|
|
48
48
|
return !!candidate && names.includes(candidate);
|
|
49
49
|
}
|
|
50
|
-
function parseTypedChannelData(channelData) {
|
|
50
|
+
function parseTypedChannelData(channelData, options = {}) {
|
|
51
51
|
if (!channelData) return void 0;
|
|
52
|
-
|
|
52
|
+
try {
|
|
53
|
+
return parseTeamsChannelData(channelData);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (options.strictChannelData ?? true) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
return void 0;
|
|
59
|
+
}
|
|
53
60
|
}
|
|
54
61
|
var TEAMS_CONFIG_FETCH_NAMES = ["config/fetch"];
|
|
55
62
|
var TEAMS_CONFIG_SUBMIT_NAMES = ["config/submit"];
|
|
@@ -57,6 +64,10 @@ var TEAMS_FILE_CONSENT_NAMES = ["fileConsent/invoke"];
|
|
|
57
64
|
var TEAMS_ACTIONABLE_MESSAGE_NAMES = [
|
|
58
65
|
"actionableMessage/executeAction"
|
|
59
66
|
];
|
|
67
|
+
var TEAMS_ADAPTIVE_CARD_ACTION_NAMES = [
|
|
68
|
+
"adaptiveCard/action"
|
|
69
|
+
];
|
|
70
|
+
var TEAMS_ADAPTIVE_CARD_SEARCH_NAMES = ["application/search"];
|
|
60
71
|
var TEAMS_TASK_MODULE_FETCH_NAMES = [
|
|
61
72
|
"task/fetch",
|
|
62
73
|
"composeExtension/fetchTask"
|
|
@@ -172,6 +183,12 @@ function detectKind(context, eventType) {
|
|
|
172
183
|
if (includesName(TEAMS_ACTIONABLE_MESSAGE_NAMES, invokeName)) {
|
|
173
184
|
return "actionable-message-execute-action";
|
|
174
185
|
}
|
|
186
|
+
if (includesName(TEAMS_ADAPTIVE_CARD_ACTION_NAMES, invokeName)) {
|
|
187
|
+
return "adaptive-card-action";
|
|
188
|
+
}
|
|
189
|
+
if (includesName(TEAMS_ADAPTIVE_CARD_SEARCH_NAMES, invokeName)) {
|
|
190
|
+
return "adaptive-card-search";
|
|
191
|
+
}
|
|
175
192
|
if (includesName(TEAMS_TASK_MODULE_FETCH_NAMES, invokeName)) {
|
|
176
193
|
return invokeName === "composeExtension/fetchTask" ? "message-extension-fetch-task" : "task-fetch";
|
|
177
194
|
}
|
|
@@ -241,10 +258,10 @@ function parseActors(channelData) {
|
|
|
241
258
|
(actor) => actor.id !== void 0 || actor.displayName !== void 0 || actor.userPrincipalName !== void 0
|
|
242
259
|
);
|
|
243
260
|
}
|
|
244
|
-
function parseTeamsActivity(context) {
|
|
261
|
+
function parseTeamsActivity(context, options = {}) {
|
|
245
262
|
const { activity } = context;
|
|
246
263
|
const channelData = asObject(activity.channelData);
|
|
247
|
-
const parsedChannelData = parseTypedChannelData(channelData);
|
|
264
|
+
const parsedChannelData = parseTypedChannelData(channelData, options);
|
|
248
265
|
const team = asObject(channelData?.team);
|
|
249
266
|
const channel = asObject(channelData?.channel);
|
|
250
267
|
const tenant = asObject(channelData?.tenant);
|
|
@@ -276,6 +293,9 @@ function parseTeamsActivity(context) {
|
|
|
276
293
|
actors: parseActors(channelData)
|
|
277
294
|
};
|
|
278
295
|
}
|
|
296
|
+
function parseTeamsActivitySafe(context) {
|
|
297
|
+
return parseTeamsActivity(context, { strictChannelData: false });
|
|
298
|
+
}
|
|
279
299
|
|
|
280
300
|
// src/adapter.ts
|
|
281
301
|
function createTeamsChannelAdapter(options) {
|
|
@@ -284,12 +304,15 @@ function createTeamsChannelAdapter(options) {
|
|
|
284
304
|
handlers,
|
|
285
305
|
onInvoke: fallbackInvoke,
|
|
286
306
|
onTurn: onTurnHook,
|
|
307
|
+
strictChannelData,
|
|
287
308
|
...baseOptions
|
|
288
309
|
} = options;
|
|
289
310
|
const base = createM365ChannelAdapter({
|
|
290
311
|
...baseOptions,
|
|
291
312
|
prepareTurn: async (request) => {
|
|
292
|
-
const teams = parseTeamsActivity(request.turnContext
|
|
313
|
+
const teams = parseTeamsActivity(request.turnContext, {
|
|
314
|
+
strictChannelData
|
|
315
|
+
});
|
|
293
316
|
const prepared = prepareTurn ? await prepareTurn({
|
|
294
317
|
...request,
|
|
295
318
|
teams,
|
|
@@ -316,7 +339,9 @@ function createTeamsChannelAdapter(options) {
|
|
|
316
339
|
};
|
|
317
340
|
},
|
|
318
341
|
onInvoke: async (context) => {
|
|
319
|
-
const teams = parseTeamsActivity(context
|
|
342
|
+
const teams = parseTeamsActivity(context, {
|
|
343
|
+
strictChannelData
|
|
344
|
+
});
|
|
320
345
|
const dispatch = await dispatchTeamsHandler(
|
|
321
346
|
handlers,
|
|
322
347
|
teams.kind,
|
|
@@ -330,7 +355,9 @@ function createTeamsChannelAdapter(options) {
|
|
|
330
355
|
}
|
|
331
356
|
});
|
|
332
357
|
async function coreHandler(context) {
|
|
333
|
-
const teams = parseTeamsActivity(context
|
|
358
|
+
const teams = parseTeamsActivity(context, {
|
|
359
|
+
strictChannelData
|
|
360
|
+
});
|
|
334
361
|
if (teams.channelId !== "msteams") {
|
|
335
362
|
await base.handler(context);
|
|
336
363
|
return;
|
|
@@ -465,6 +492,10 @@ function resolveHandler(handlers, kind) {
|
|
|
465
492
|
return handlers?.fileConsent ?? handlers?.invoke;
|
|
466
493
|
case "actionable-message-execute-action":
|
|
467
494
|
return handlers?.actionableMessageExecuteAction ?? handlers?.invoke;
|
|
495
|
+
case "adaptive-card-action":
|
|
496
|
+
return handlers?.adaptiveCardAction ?? handlers?.cardSubmit;
|
|
497
|
+
case "adaptive-card-search":
|
|
498
|
+
return handlers?.adaptiveCardSearch ?? handlers?.searchCommand;
|
|
468
499
|
case "feedback":
|
|
469
500
|
return handlers?.feedbackSubmit ?? handlers?.cardSubmit;
|
|
470
501
|
case "card-submit":
|
|
@@ -739,6 +770,8 @@ function createTeamsDialogMessage(message) {
|
|
|
739
770
|
}
|
|
740
771
|
export {
|
|
741
772
|
TEAMS_ACTIONABLE_MESSAGE_NAMES,
|
|
773
|
+
TEAMS_ADAPTIVE_CARD_ACTION_NAMES,
|
|
774
|
+
TEAMS_ADAPTIVE_CARD_SEARCH_NAMES,
|
|
742
775
|
TEAMS_CARD_ACTION_SUBMIT_NAMES,
|
|
743
776
|
TEAMS_CONFIG_FETCH_NAMES,
|
|
744
777
|
TEAMS_CONFIG_SUBMIT_NAMES,
|
|
@@ -768,6 +801,7 @@ export {
|
|
|
768
801
|
currentTeamsTurnContext,
|
|
769
802
|
mountTeamsAgent,
|
|
770
803
|
parseTeamsActivity,
|
|
804
|
+
parseTeamsActivitySafe,
|
|
771
805
|
parseTeamsChannelData,
|
|
772
806
|
runWithTeamsTurnContext,
|
|
773
807
|
sendTeamsInvoke
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cuylabs/agent-channel-teams",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Teams-native channel layer for @cuylabs/agent-core built on top of @cuylabs/agent-channel-m365",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
"README.md"
|
|
24
24
|
],
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@microsoft/agents-activity": "^1.4.2",
|
|
27
|
-
"@microsoft/agents-hosting": "^1.4.2",
|
|
28
26
|
"@microsoft/agents-hosting-extensions-teams": "^1.4.2",
|
|
29
|
-
"@cuylabs/agent-channel-m365": "^0.
|
|
30
|
-
"@cuylabs/agent-core": "^0.
|
|
27
|
+
"@cuylabs/agent-channel-m365": "^0.16.0",
|
|
28
|
+
"@cuylabs/agent-core": "^0.16.0"
|
|
31
29
|
},
|
|
32
30
|
"peerDependencies": {
|
|
31
|
+
"@microsoft/agents-activity": "^1.4.2",
|
|
32
|
+
"@microsoft/agents-hosting": "^1.4.2",
|
|
33
33
|
"express": ">=4.21.0 || >=5.0.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependenciesMeta": {
|
|
@@ -38,6 +38,8 @@
|
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
+
"@microsoft/agents-activity": "^1.4.2",
|
|
42
|
+
"@microsoft/agents-hosting": "^1.4.2",
|
|
41
43
|
"@types/express": "^5.0.0",
|
|
42
44
|
"@types/node": "^22.0.0",
|
|
43
45
|
"express": "^5.2.1",
|