@cuylabs/agent-channel-teams 3.2.1 → 4.1.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.js CHANGED
@@ -1,3 +1,38 @@
1
+ import {
2
+ Conversation,
3
+ ConversationBuilder,
4
+ ConversationReferenceBuilder,
5
+ CreateConversationOptionsBuilder,
6
+ TEAMS_ACTIONABLE_MESSAGE_NAMES,
7
+ TEAMS_ADAPTIVE_CARD_ACTION_NAMES,
8
+ TEAMS_ADAPTIVE_CARD_SEARCH_NAMES,
9
+ TEAMS_CARD_ACTION_SUBMIT_NAMES,
10
+ TEAMS_CONFIG_FETCH_NAMES,
11
+ TEAMS_CONFIG_SUBMIT_NAMES,
12
+ TEAMS_CONVERSATION_UPDATE_EVENT_NAMES,
13
+ TEAMS_FILE_CONSENT_NAMES,
14
+ TEAMS_MEETING_EVENT_NAMES,
15
+ TEAMS_MEETING_INVOKE_NAMES,
16
+ TEAMS_MESSAGE_EXTENSION_CARD_BUTTON_CLICKED_NAMES,
17
+ TEAMS_MESSAGE_EXTENSION_FETCH_TASK_NAMES,
18
+ TEAMS_MESSAGE_EXTENSION_QUERY_NAMES,
19
+ TEAMS_MESSAGE_EXTENSION_QUERY_SETTING_URL_NAMES,
20
+ TEAMS_MESSAGE_EXTENSION_SELECT_NAMES,
21
+ TEAMS_MESSAGE_EXTENSION_SETTING_NAMES,
22
+ TEAMS_MESSAGE_EXTENSION_SUBMIT_ACTION_NAMES,
23
+ TEAMS_TAB_FETCH_NAMES,
24
+ TEAMS_TAB_SUBMIT_NAMES,
25
+ TEAMS_TASK_MODULE_FETCH_NAMES,
26
+ TEAMS_TASK_MODULE_SUBMIT_NAMES,
27
+ captureM365ConversationReference,
28
+ captureTeamsConversationReference,
29
+ continueM365Conversation,
30
+ isTargetedTeamsActivity,
31
+ makeTargetedTeamsActivity,
32
+ parseTeamsActivity,
33
+ parseTeamsActivitySafe,
34
+ restoreM365ConversationReference
35
+ } from "./chunk-MBDHSFBF.js";
1
36
  import {
2
37
  TeamsAttachmentDownloader,
3
38
  TeamsInfo,
@@ -10,7 +45,7 @@ import {
10
45
  extractUserIdentity,
11
46
  runWithM365TurnContext
12
47
  } from "@cuylabs/agent-channel-m365";
13
- import { ActivityTypes as ActivityTypes3 } from "@microsoft/agents-activity";
48
+ import { ActivityTypes as ActivityTypes2 } from "@microsoft/agents-activity";
14
49
 
15
50
  // src/invoke.ts
16
51
  import { Activity, ActivityTypes } from "@microsoft/agents-activity";
@@ -28,275 +63,6 @@ async function sendTeamsInvoke(context, body, status = 200) {
28
63
  );
29
64
  }
30
65
 
31
- // src/teams-activity.ts
32
- import { ActivityTypes as ActivityTypes2 } from "@microsoft/agents-activity";
33
- function asObject(value) {
34
- return value && typeof value === "object" ? value : void 0;
35
- }
36
- function readString(value, key) {
37
- const candidate = value?.[key];
38
- return typeof candidate === "string" && candidate.trim() ? candidate : void 0;
39
- }
40
- function detectSurface(conversationType, meetingId, teamId) {
41
- if (meetingId) return "meeting";
42
- if (teamId) return "channel";
43
- if (conversationType === "personal") return "personal";
44
- if (conversationType === "groupChat") return "group";
45
- return "unknown";
46
- }
47
- function includesName(names, candidate) {
48
- return !!candidate && names.includes(candidate);
49
- }
50
- function parseTypedChannelData(channelData, options = {}) {
51
- if (!channelData) return void 0;
52
- try {
53
- return parseTeamsChannelData(channelData);
54
- } catch (error) {
55
- if (options.strictChannelData ?? true) {
56
- throw error;
57
- }
58
- return void 0;
59
- }
60
- }
61
- var TEAMS_CONFIG_FETCH_NAMES = ["config/fetch"];
62
- var TEAMS_CONFIG_SUBMIT_NAMES = ["config/submit"];
63
- var TEAMS_FILE_CONSENT_NAMES = ["fileConsent/invoke"];
64
- var TEAMS_ACTIONABLE_MESSAGE_NAMES = [
65
- "actionableMessage/executeAction"
66
- ];
67
- var TEAMS_ADAPTIVE_CARD_ACTION_NAMES = [
68
- "adaptiveCard/action"
69
- ];
70
- var TEAMS_ADAPTIVE_CARD_SEARCH_NAMES = ["application/search"];
71
- var TEAMS_TASK_MODULE_FETCH_NAMES = [
72
- "task/fetch",
73
- "composeExtension/fetchTask"
74
- ];
75
- var TEAMS_TASK_MODULE_SUBMIT_NAMES = ["task/submit"];
76
- var TEAMS_TAB_FETCH_NAMES = ["tab/fetch"];
77
- var TEAMS_TAB_SUBMIT_NAMES = ["tab/submit"];
78
- var TEAMS_MESSAGE_EXTENSION_QUERY_NAMES = [
79
- "composeExtension/query",
80
- "composeExtension/queryLink",
81
- "composeExtension/anonymousQueryLink"
82
- ];
83
- var TEAMS_MESSAGE_EXTENSION_SUBMIT_ACTION_NAMES = [
84
- "composeExtension/submitAction"
85
- ];
86
- var TEAMS_MESSAGE_EXTENSION_FETCH_TASK_NAMES = [
87
- "composeExtension/fetchTask"
88
- ];
89
- var TEAMS_MESSAGE_EXTENSION_QUERY_SETTING_URL_NAMES = [
90
- "composeExtension/querySettingUrl"
91
- ];
92
- var TEAMS_MESSAGE_EXTENSION_SETTING_NAMES = [
93
- "composeExtension/setting"
94
- ];
95
- var TEAMS_MESSAGE_EXTENSION_CARD_BUTTON_CLICKED_NAMES = [
96
- "composeExtension/onCardButtonClicked"
97
- ];
98
- var TEAMS_MESSAGE_EXTENSION_SELECT_NAMES = [
99
- "composeExtension/selectItem"
100
- ];
101
- var TEAMS_CARD_ACTION_SUBMIT_NAMES = ["message/submitAction"];
102
- var TEAMS_CONVERSATION_UPDATE_EVENT_NAMES = {
103
- channelCreated: "channel-created",
104
- channelDeleted: "channel-deleted",
105
- channelRenamed: "channel-renamed",
106
- channelRestored: "channel-restored",
107
- channelShared: "channel-shared",
108
- channelUnshared: "channel-unshared",
109
- teamRenamed: "team-renamed",
110
- teamArchived: "team-archived",
111
- teamUnarchived: "team-unarchived",
112
- teamDeleted: "team-deleted",
113
- teamHardDeleted: "team-hard-deleted",
114
- teamRestored: "team-restored"
115
- };
116
- var TEAMS_MEETING_EVENT_NAMES = {
117
- "application/vnd.microsoft.readReceipt": "read-receipt",
118
- "application/vnd.microsoft.meetingStart": "meeting-start",
119
- "application/vnd.microsoft.meetingEnd": "meeting-end",
120
- "application/vnd.microsoft.meetingParticipantJoin": "participants-join",
121
- "application/vnd.microsoft.meetingParticipantLeave": "participants-leave",
122
- "application/vnd.microsoft.meetingRoomJoin": "meeting-room-join",
123
- "application/vnd.microsoft.meetingRoomLeave": "meeting-room-leave",
124
- "application/vnd.microsoft.meetingReaction": "meeting-reaction",
125
- "application/vnd.microsoft.meetingPollResponse": "meeting-poll-response",
126
- "application/vnd.microsoft.meetingAppsInstalled": "meeting-apps-installed",
127
- "application/vnd.microsoft.meetingAppsUninstalled": "meeting-apps-uninstalled",
128
- "application/vnd.microsoft.meetingRecordingStarted": "meeting-recording-started",
129
- "application/vnd.microsoft.meetingRecordingStopped": "meeting-recording-stopped",
130
- "application/vnd.microsoft.meetingFocusChange": "meeting-focus-change",
131
- "application/vnd.microsoft.meetingScreenShareStart": "meeting-screen-share-start",
132
- "application/vnd.microsoft.meetingScreenShareStop": "meeting-screen-share-stop"
133
- };
134
- var TEAMS_MEETING_INVOKE_NAMES = {
135
- "application/vnd.microsoft.meetingStageView": "meeting-stage-view",
136
- "application/vnd.microsoft.meetingSmartReply": "meeting-smart-reply"
137
- };
138
- function detectKind(context, eventType) {
139
- const { activity } = context;
140
- const payload = asObject(activity.value);
141
- const invokeName = activity.name;
142
- switch (activity.type) {
143
- case ActivityTypes2.Message:
144
- return "message";
145
- case ActivityTypes2.MessageReaction:
146
- return "reaction";
147
- case ActivityTypes2.ConversationUpdate:
148
- if (Array.isArray(activity.membersAdded) && activity.membersAdded.length > 0) {
149
- return "members-added";
150
- }
151
- if (Array.isArray(activity.membersRemoved) && activity.membersRemoved.length > 0) {
152
- return "members-removed";
153
- }
154
- if (eventType && eventType in TEAMS_CONVERSATION_UPDATE_EVENT_NAMES) {
155
- return TEAMS_CONVERSATION_UPDATE_EVENT_NAMES[eventType];
156
- }
157
- return "conversation-update";
158
- case ActivityTypes2.MessageUpdate:
159
- if (eventType === "editMessage") return "message-edit";
160
- if (eventType === "undeleteMessage") return "message-restore";
161
- return "other";
162
- case ActivityTypes2.MessageDelete:
163
- if (eventType === "softDeleteMessage") return "message-delete";
164
- return "other";
165
- case ActivityTypes2.Event:
166
- if (invokeName && invokeName in TEAMS_MEETING_EVENT_NAMES) {
167
- return TEAMS_MEETING_EVENT_NAMES[invokeName];
168
- }
169
- return "other";
170
- case ActivityTypes2.Invoke:
171
- if (invokeName && invokeName in TEAMS_MEETING_INVOKE_NAMES) {
172
- return TEAMS_MEETING_INVOKE_NAMES[invokeName];
173
- }
174
- if (includesName(TEAMS_CONFIG_FETCH_NAMES, invokeName)) {
175
- return "config-fetch";
176
- }
177
- if (includesName(TEAMS_CONFIG_SUBMIT_NAMES, invokeName)) {
178
- return "config-submit";
179
- }
180
- if (includesName(TEAMS_FILE_CONSENT_NAMES, invokeName)) {
181
- return "file-consent";
182
- }
183
- if (includesName(TEAMS_ACTIONABLE_MESSAGE_NAMES, invokeName)) {
184
- return "actionable-message-execute-action";
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
- }
192
- if (includesName(TEAMS_TASK_MODULE_FETCH_NAMES, invokeName)) {
193
- return invokeName === "composeExtension/fetchTask" ? "message-extension-fetch-task" : "task-fetch";
194
- }
195
- if (includesName(TEAMS_TASK_MODULE_SUBMIT_NAMES, invokeName)) {
196
- return "task-submit";
197
- }
198
- if (includesName(TEAMS_TAB_FETCH_NAMES, invokeName)) {
199
- return "tab-fetch";
200
- }
201
- if (includesName(TEAMS_TAB_SUBMIT_NAMES, invokeName)) {
202
- return "tab-submit";
203
- }
204
- if (includesName(TEAMS_MESSAGE_EXTENSION_QUERY_NAMES, invokeName)) {
205
- switch (invokeName) {
206
- case "composeExtension/queryLink":
207
- return "message-extension-query-link";
208
- case "composeExtension/anonymousQueryLink":
209
- return "message-extension-anonymous-query-link";
210
- default:
211
- return "message-extension-query";
212
- }
213
- }
214
- if (includesName(TEAMS_MESSAGE_EXTENSION_SELECT_NAMES, invokeName)) {
215
- return "message-extension-select-item";
216
- }
217
- if (includesName(TEAMS_MESSAGE_EXTENSION_SUBMIT_ACTION_NAMES, invokeName)) {
218
- return "message-extension-submit-action";
219
- }
220
- if (includesName(
221
- TEAMS_MESSAGE_EXTENSION_QUERY_SETTING_URL_NAMES,
222
- invokeName
223
- )) {
224
- return "message-extension-query-setting-url";
225
- }
226
- if (includesName(TEAMS_MESSAGE_EXTENSION_SETTING_NAMES, invokeName)) {
227
- return "message-extension-setting";
228
- }
229
- if (includesName(
230
- TEAMS_MESSAGE_EXTENSION_CARD_BUTTON_CLICKED_NAMES,
231
- invokeName
232
- )) {
233
- return "message-extension-card-button-clicked";
234
- }
235
- if (includesName(TEAMS_CARD_ACTION_SUBMIT_NAMES, invokeName)) {
236
- return payload?.actionName === "feedback" ? "feedback" : "card-submit";
237
- }
238
- return "invoke";
239
- default:
240
- return "other";
241
- }
242
- }
243
- function parseActors(channelData) {
244
- const raw = channelData?.onBehalfOf;
245
- if (!Array.isArray(raw)) return [];
246
- const actors = [];
247
- for (const item of raw) {
248
- const actor = asObject(item);
249
- const itemRef = asObject(actor?.item);
250
- actors.push({
251
- id: readString(itemRef, "id"),
252
- displayName: readString(itemRef, "displayName"),
253
- tenantId: readString(actor, "tenantId"),
254
- userPrincipalName: readString(itemRef, "userPrincipalName")
255
- });
256
- }
257
- return actors.filter(
258
- (actor) => actor.id !== void 0 || actor.displayName !== void 0 || actor.userPrincipalName !== void 0
259
- );
260
- }
261
- function parseTeamsActivity(context, options = {}) {
262
- const { activity } = context;
263
- const channelData = asObject(activity.channelData);
264
- const parsedChannelData = parseTypedChannelData(channelData, options);
265
- const team = asObject(channelData?.team);
266
- const channel = asObject(channelData?.channel);
267
- const tenant = asObject(channelData?.tenant);
268
- const meeting = asObject(channelData?.meeting);
269
- const eventType = parsedChannelData?.eventType ?? readString(channelData, "eventType");
270
- const conversationType = typeof activity.conversation?.conversationType === "string" ? activity.conversation.conversationType : void 0;
271
- const teamId = parsedChannelData?.team?.aadGroupId ?? parsedChannelData?.team?.id ?? readString(team, "aadGroupId") ?? readString(team, "id");
272
- const meetingId = parsedChannelData?.meeting?.id ?? readString(meeting, "id");
273
- const surface = detectSurface(
274
- conversationType,
275
- meetingId,
276
- teamId
277
- );
278
- return {
279
- channelId: activity.channelId ?? "unknown",
280
- conversationId: activity.conversation?.id ?? "unknown",
281
- activityId: activity.id ?? void 0,
282
- messageId: activity.id ?? void 0,
283
- replyToId: activity.replyToId ?? void 0,
284
- invokeName: activity.name ?? void 0,
285
- eventType,
286
- tenantId: parsedChannelData?.tenant?.id ?? readString(tenant, "id") ?? activity.conversation?.tenantId,
287
- teamId,
288
- channelData: parsedChannelData,
289
- channelThreadId: parsedChannelData?.channel?.id ?? readString(channel, "id"),
290
- meetingId,
291
- surface,
292
- kind: detectKind(context, eventType),
293
- actors: parseActors(channelData)
294
- };
295
- }
296
- function parseTeamsActivitySafe(context) {
297
- return parseTeamsActivity(context, { strictChannelData: false });
298
- }
299
-
300
66
  // src/adapter.ts
301
67
  function createTeamsChannelAdapter(options) {
302
68
  const {
@@ -362,8 +128,8 @@ function createTeamsChannelAdapter(options) {
362
128
  await base.handler(context);
363
129
  return;
364
130
  }
365
- const isTeamsSpecificEvent = context.activity.type === ActivityTypes3.Event && teams.kind !== "other";
366
- const isTeamsSpecificActivity = context.activity.type === ActivityTypes3.ConversationUpdate || context.activity.type === ActivityTypes3.MessageUpdate || context.activity.type === ActivityTypes3.MessageDelete || context.activity.type === ActivityTypes3.MessageReaction || isTeamsSpecificEvent;
131
+ const isTeamsSpecificEvent = context.activity.type === ActivityTypes2.Event && teams.kind !== "other";
132
+ const isTeamsSpecificActivity = context.activity.type === ActivityTypes2.ConversationUpdate || context.activity.type === ActivityTypes2.MessageUpdate || context.activity.type === ActivityTypes2.MessageDelete || context.activity.type === ActivityTypes2.MessageReaction || isTeamsSpecificEvent;
367
133
  if (isTeamsSpecificActivity) {
368
134
  const dispatch = await dispatchTeamsHandler(
369
135
  handlers,
@@ -433,7 +199,7 @@ async function dispatchTeamsHandler(handlers, kind, context) {
433
199
  return { handled: false };
434
200
  }
435
201
  const result = await handler(context);
436
- if (context.turnContext.activity.type === ActivityTypes3.Invoke && result !== "continue") {
202
+ if (context.turnContext.activity.type === ActivityTypes2.Invoke && result !== "continue") {
437
203
  if (!getInvokeResponseSent(context) && isTeamsInvokeResult(result)) {
438
204
  await context.sendInvoke(result.body, result.status);
439
205
  } else if (!getInvokeResponseSent(context) && result === void 0) {
@@ -959,13 +725,13 @@ function createTeamsHumanInputRequestCard(input, options = {}) {
959
725
  }
960
726
  function parseTeamsInputRequestSubmit(value) {
961
727
  const data = readSubmitData(value);
962
- const verb = readString2(data, "verb");
963
- const requestId = readString2(data, "requestId");
728
+ const verb = readString(data, "verb");
729
+ const requestId = readString(data, "requestId");
964
730
  if (!requestId || verb !== TEAMS_INPUT_REQUEST_APPROVAL_VERB && verb !== TEAMS_INPUT_REQUEST_HUMAN_VERB) {
965
731
  return void 0;
966
732
  }
967
- const sessionId = readString2(data, "sessionId");
968
- const turnId = readString2(data, "turnId");
733
+ const sessionId = readString(data, "sessionId");
734
+ const turnId = readString(data, "turnId");
969
735
  if (verb === TEAMS_INPUT_REQUEST_APPROVAL_VERB) {
970
736
  const action = readApprovalAction(data);
971
737
  if (!action) {
@@ -1067,10 +833,10 @@ function readSubmitData(value) {
1067
833
  };
1068
834
  }
1069
835
  function readHumanInputResponse(data) {
1070
- const responseKind = readString2(data, "responseKind");
836
+ const responseKind = readString(data, "responseKind");
1071
837
  switch (responseKind) {
1072
838
  case "text": {
1073
- const text = readString2(data, "text") ?? "";
839
+ const text = readString(data, "text") ?? "";
1074
840
  return { kind: "text", text };
1075
841
  }
1076
842
  case "confirm": {
@@ -1078,7 +844,7 @@ function readHumanInputResponse(data) {
1078
844
  if (confirmed === void 0) {
1079
845
  return void 0;
1080
846
  }
1081
- const text = readString2(data, "text") ?? (confirmed ? "confirmed" : "denied");
847
+ const text = readString(data, "text") ?? (confirmed ? "confirmed" : "denied");
1082
848
  return { kind: "confirm", confirmed, text };
1083
849
  }
1084
850
  case "choice": {
@@ -1090,11 +856,11 @@ function readHumanInputResponse(data) {
1090
856
  }
1091
857
  }
1092
858
  function readApprovalAction(data) {
1093
- const action = readString2(data, "action");
859
+ const action = readString(data, "action");
1094
860
  return action === "allow" || action === "deny" || action === "remember" ? action : void 0;
1095
861
  }
1096
862
  function readRememberScope(data) {
1097
- const scope = readString2(data, "rememberScope");
863
+ const scope = readString(data, "rememberScope");
1098
864
  return scope === "session" || scope === "project" || scope === "user" ? scope : void 0;
1099
865
  }
1100
866
  function readSelectedValues(data, key) {
@@ -1108,9 +874,9 @@ function readSelectedValues(data, key) {
1108
874
  return [];
1109
875
  }
1110
876
  function readTrimmedString(data, key) {
1111
- return readString2(data, key)?.trim() || void 0;
877
+ return readString(data, key)?.trim() || void 0;
1112
878
  }
1113
- function readString2(data, key) {
879
+ function readString(data, key) {
1114
880
  const value = data?.[key];
1115
881
  return typeof value === "string" ? value : void 0;
1116
882
  }
@@ -1131,6 +897,10 @@ function asRecord(value) {
1131
897
  return value && typeof value === "object" ? value : void 0;
1132
898
  }
1133
899
  export {
900
+ Conversation,
901
+ ConversationBuilder,
902
+ ConversationReferenceBuilder,
903
+ CreateConversationOptionsBuilder,
1134
904
  TEAMS_ACTIONABLE_MESSAGE_NAMES,
1135
905
  TEAMS_ADAPTIVE_CARD_ACTION_NAMES,
1136
906
  TEAMS_ADAPTIVE_CARD_SEARCH_NAMES,
@@ -1156,6 +926,9 @@ export {
1156
926
  TEAMS_TASK_MODULE_SUBMIT_NAMES,
1157
927
  TeamsAttachmentDownloader,
1158
928
  TeamsInfo,
929
+ captureM365ConversationReference,
930
+ captureTeamsConversationReference,
931
+ continueM365Conversation,
1159
932
  createTeamsApprovalRequestCard,
1160
933
  createTeamsChannelAdapter,
1161
934
  createTeamsDialog,
@@ -1165,11 +938,14 @@ export {
1165
938
  createTeamsSearchMessage,
1166
939
  createTeamsSearchResult,
1167
940
  currentTeamsTurnContext,
941
+ isTargetedTeamsActivity,
942
+ makeTargetedTeamsActivity,
1168
943
  mountTeamsAgent,
1169
944
  parseTeamsActivity,
1170
945
  parseTeamsActivitySafe,
1171
946
  parseTeamsChannelData,
1172
947
  parseTeamsInputRequestSubmit,
948
+ restoreM365ConversationReference,
1173
949
  runWithTeamsTurnContext,
1174
950
  sendTeamsInvoke
1175
951
  };