@cuylabs/agent-channel-teams 0.14.1 → 0.15.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 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
- return parseTeamsChannelData(channelData);
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.14.1",
3
+ "version": "0.15.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.14.1",
30
- "@cuylabs/agent-core": "^0.14.1"
27
+ "@cuylabs/agent-channel-m365": "^0.15.0",
28
+ "@cuylabs/agent-core": "^0.15.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",