@cuylabs/agent-channel-teams 4.0.0 → 4.2.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.
@@ -0,0 +1,258 @@
1
+ import { TurnContext } from '@microsoft/agents-hosting';
2
+ import { Conversation } from '@cuylabs/agent-channel-m365/proactive';
3
+ import { AgentTurnSource, AgentEvent } from '@cuylabs/agent-core';
4
+ import { M365ChannelOptions, M365TurnRequestContext, M365TurnPreparation, M365UserIdentity, M365ChannelAdapter } from '@cuylabs/agent-channel-m365';
5
+ import { TeamsChannelData } from '@microsoft/agents-hosting-extensions-teams';
6
+ import { Activity } from '@microsoft/agents-activity';
7
+
8
+ interface TeamsInvokeResult<T = unknown> {
9
+ status: number;
10
+ body?: T;
11
+ }
12
+ declare function createTeamsInvokeActivity<T = unknown>(result: TeamsInvokeResult<T>): Activity;
13
+ declare function sendTeamsInvoke<T = unknown>(context: TurnContext, body?: T, status?: number): Promise<void>;
14
+
15
+ type TeamsSurface = "personal" | "channel" | "group" | "meeting" | "unknown";
16
+ 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";
17
+ interface TeamsActorReference {
18
+ id?: string;
19
+ displayName?: string;
20
+ tenantId?: string;
21
+ userPrincipalName?: string;
22
+ }
23
+ interface TeamsActivityInfo {
24
+ channelId: string;
25
+ conversationId: string;
26
+ activityId?: string;
27
+ messageId?: string;
28
+ replyToId?: string;
29
+ invokeName?: string;
30
+ eventType?: string;
31
+ tenantId?: string;
32
+ teamId?: string;
33
+ channelThreadId?: string;
34
+ meetingId?: string;
35
+ channelData?: TeamsChannelData;
36
+ surface: TeamsSurface;
37
+ kind: TeamsActivityKind;
38
+ actors: TeamsActorReference[];
39
+ /**
40
+ * Whether the inbound activity carries an `activityTreatment: targeted` entity.
41
+ *
42
+ * Targeted activities are visible only to the recipient even inside a group
43
+ * Teams conversation. Set by Teams clients or outgoing helper code through
44
+ * the `activityTreatment: targeted` entity added in @microsoft/agents-activity 1.5.
45
+ */
46
+ targeted: boolean;
47
+ }
48
+ interface TeamsTurnRequestContext extends M365TurnRequestContext {
49
+ teams: TeamsActivityInfo;
50
+ channelData?: TeamsChannelData;
51
+ }
52
+ type TeamsTurnPreparation = M365TurnPreparation;
53
+ interface TeamsHandlerContext {
54
+ turnContext: TurnContext;
55
+ user: M365UserIdentity;
56
+ teams: TeamsActivityInfo;
57
+ channelData?: TeamsChannelData;
58
+ sessionId: string;
59
+ source: AgentTurnSource;
60
+ /**
61
+ * Start an agent turn inside the current Teams request context.
62
+ *
63
+ * This is useful for dialog submit/search-command handlers that still want
64
+ * to delegate their actual reasoning to agent-core.
65
+ */
66
+ runAgent(message: string, options?: {
67
+ abort?: AbortSignal;
68
+ system?: string;
69
+ }): AsyncGenerator<AgentEvent>;
70
+ /**
71
+ * Send an invoke response payload back to Teams.
72
+ */
73
+ sendInvoke(body?: unknown, status?: number): Promise<void>;
74
+ }
75
+ type TeamsHandlerDecision = void | "continue" | TeamsInvokeResult;
76
+ type TeamsActivityHandler = (context: TeamsHandlerContext) => TeamsHandlerDecision | Promise<TeamsHandlerDecision>;
77
+ interface TeamsConversationUpdateHandlers {
78
+ conversationUpdate?: TeamsActivityHandler;
79
+ membersAdded?: TeamsActivityHandler;
80
+ membersRemoved?: TeamsActivityHandler;
81
+ channelCreated?: TeamsActivityHandler;
82
+ channelDeleted?: TeamsActivityHandler;
83
+ channelRenamed?: TeamsActivityHandler;
84
+ channelRestored?: TeamsActivityHandler;
85
+ channelShared?: TeamsActivityHandler;
86
+ channelUnshared?: TeamsActivityHandler;
87
+ teamRenamed?: TeamsActivityHandler;
88
+ teamArchived?: TeamsActivityHandler;
89
+ teamUnarchived?: TeamsActivityHandler;
90
+ teamDeleted?: TeamsActivityHandler;
91
+ teamHardDeleted?: TeamsActivityHandler;
92
+ teamRestored?: TeamsActivityHandler;
93
+ }
94
+ interface TeamsMessageActivityHandlers {
95
+ messageEdited?: TeamsActivityHandler;
96
+ messageDeleted?: TeamsActivityHandler;
97
+ messageRestored?: TeamsActivityHandler;
98
+ reaction?: TeamsActivityHandler;
99
+ readReceipt?: TeamsActivityHandler;
100
+ }
101
+ interface TeamsCardActionHandlers {
102
+ cardSubmit?: TeamsActivityHandler;
103
+ adaptiveCardAction?: TeamsActivityHandler;
104
+ adaptiveCardSearch?: TeamsActivityHandler;
105
+ feedbackSubmit?: TeamsActivityHandler;
106
+ fileConsent?: TeamsActivityHandler;
107
+ actionableMessageExecuteAction?: TeamsActivityHandler;
108
+ }
109
+ interface TeamsConfigHandlers {
110
+ configFetch?: TeamsActivityHandler;
111
+ configSubmit?: TeamsActivityHandler;
112
+ }
113
+ interface TeamsTaskModuleHandlers {
114
+ dialogOpen?: TeamsActivityHandler;
115
+ dialogSubmit?: TeamsActivityHandler;
116
+ taskFetch?: TeamsActivityHandler;
117
+ taskSubmit?: TeamsActivityHandler;
118
+ }
119
+ interface TeamsMessageExtensionHandlers {
120
+ searchCommand?: TeamsActivityHandler;
121
+ selectResult?: TeamsActivityHandler;
122
+ messageExtensionQuery?: TeamsActivityHandler;
123
+ messageExtensionQueryLink?: TeamsActivityHandler;
124
+ messageExtensionAnonymousQueryLink?: TeamsActivityHandler;
125
+ messageExtensionSelectItem?: TeamsActivityHandler;
126
+ messageExtensionSubmitAction?: TeamsActivityHandler;
127
+ messageExtensionFetchTask?: TeamsActivityHandler;
128
+ messageExtensionQuerySettingUrl?: TeamsActivityHandler;
129
+ messageExtensionSetting?: TeamsActivityHandler;
130
+ messageExtensionCardButtonClicked?: TeamsActivityHandler;
131
+ }
132
+ interface TeamsTabHandlers {
133
+ tabFetch?: TeamsActivityHandler;
134
+ tabSubmit?: TeamsActivityHandler;
135
+ }
136
+ interface TeamsMeetingHandlers {
137
+ /** Fired when a Teams meeting starts. */
138
+ meetingStart?: TeamsActivityHandler;
139
+ /** Fired when a Teams meeting ends. */
140
+ meetingEnd?: TeamsActivityHandler;
141
+ /** Fired when participants join a Teams meeting. */
142
+ participantsJoin?: TeamsActivityHandler;
143
+ /** Fired when participants leave a Teams meeting. */
144
+ participantsLeave?: TeamsActivityHandler;
145
+ /** Fired when a physical meeting room joins a Teams meeting. */
146
+ meetingRoomJoin?: TeamsActivityHandler;
147
+ /** Fired when a physical meeting room leaves a Teams meeting. */
148
+ meetingRoomLeave?: TeamsActivityHandler;
149
+ /** Fired when the app is viewed in the meeting stage (invoke). */
150
+ meetingStageView?: TeamsActivityHandler;
151
+ /** Fired for smart reply recommendations during a meeting (invoke). */
152
+ meetingSmartReply?: TeamsActivityHandler;
153
+ /** Fired for emoji reactions during a meeting. */
154
+ meetingReaction?: TeamsActivityHandler;
155
+ /** Fired when a poll response is submitted during a meeting. */
156
+ meetingPollResponse?: TeamsActivityHandler;
157
+ /** Fired when apps are installed during a meeting. */
158
+ meetingAppsInstalled?: TeamsActivityHandler;
159
+ /** Fired when apps are uninstalled during a meeting. */
160
+ meetingAppsUninstalled?: TeamsActivityHandler;
161
+ /** Fired when meeting recording starts. */
162
+ meetingRecordingStarted?: TeamsActivityHandler;
163
+ /** Fired when meeting recording stops. */
164
+ meetingRecordingStopped?: TeamsActivityHandler;
165
+ /** Fired when the meeting focus changes. */
166
+ meetingFocusChange?: TeamsActivityHandler;
167
+ /** Fired when screen sharing starts in a meeting. */
168
+ meetingScreenShareStart?: TeamsActivityHandler;
169
+ /** Fired when screen sharing stops in a meeting. */
170
+ meetingScreenShareStop?: TeamsActivityHandler;
171
+ }
172
+ /**
173
+ * Aggregate Teams handler surface grouped by capability.
174
+ *
175
+ * This keeps the public API centered on Teams concepts without exposing
176
+ * Microsoft's `AgentApplication` routing types.
177
+ */
178
+ interface TeamsActivityHandlers extends TeamsConversationUpdateHandlers, TeamsMessageActivityHandlers, TeamsCardActionHandlers, TeamsConfigHandlers, TeamsTaskModuleHandlers, TeamsMessageExtensionHandlers, TeamsTabHandlers, TeamsMeetingHandlers {
179
+ invoke?: TeamsActivityHandler;
180
+ }
181
+ interface TeamsChannelOptions extends Omit<M365ChannelOptions, "prepareTurn"> {
182
+ /**
183
+ * Whether malformed Teams channelData should throw while parsing.
184
+ *
185
+ * Keep this enabled in tests and strict hosts that want SDK payload drift to
186
+ * fail fast. Disable it in production bots that should continue handling the
187
+ * turn with best-effort Teams metadata when an unexpected channelData shape
188
+ * arrives.
189
+ *
190
+ * @default true
191
+ */
192
+ strictChannelData?: boolean;
193
+ /**
194
+ * Teams-native turn preparation hook. The result is forwarded into the
195
+ * underlying M365 channel adapter.
196
+ */
197
+ prepareTurn?: (request: TeamsTurnRequestContext) => TeamsTurnPreparation | Promise<TeamsTurnPreparation>;
198
+ /**
199
+ * Teams-specific activity hooks that run before generic M365 handling.
200
+ *
201
+ * Notes:
202
+ * - the `"feedback"` kind falls through to `cardSubmit` when
203
+ * `feedbackSubmit` is not defined
204
+ * - specialized Teams invoke kinds fall back to grouped handlers such as
205
+ * `dialogOpen`, `searchCommand`, or `selectResult` when the narrow handler
206
+ * is not provided
207
+ */
208
+ handlers?: TeamsActivityHandlers;
209
+ /**
210
+ * General-purpose middleware that runs on every turn before cuylabs
211
+ * processing. Gives raw `TurnContext` access for Microsoft SDK helpers
212
+ * or custom logic. Call `next()` to continue into the normal handler
213
+ * pipeline, or return without calling it to short-circuit.
214
+ */
215
+ onTurn?: (context: TurnContext, next: () => Promise<void>) => Promise<void>;
216
+ }
217
+ interface TeamsChannelAdapter extends M365ChannelAdapter {
218
+ /**
219
+ * The underlying generic M365 adapter used for ordinary message turns.
220
+ */
221
+ readonly m365: M365ChannelAdapter;
222
+ }
223
+
224
+ /**
225
+ * Proactive messaging primitives for the Teams channel.
226
+ *
227
+ * Re-exports the M365 proactive bridge so Teams consumers have a single
228
+ * import surface, plus a Teams-specific helper that captures a
229
+ * {@link Conversation} together with the parsed Teams metadata most apps
230
+ * need at replay time (tenant, surface, team, channel thread, meeting id).
231
+ *
232
+ * Use this module when an app needs to send a message into Teams without an
233
+ * inbound turn — async tool completions, mail dispatcher results,
234
+ * notifications, scheduled reminders.
235
+ */
236
+
237
+ /**
238
+ * Captured Teams conversation reference plus parsed channel metadata.
239
+ *
240
+ * The {@link Conversation} is what `continueM365Conversation` needs to replay
241
+ * a turn; `teams` is the parsed {@link TeamsActivityInfo} so callers can
242
+ * persist surface / tenant / team / channel ids alongside the reference for
243
+ * later routing decisions.
244
+ */
245
+ interface TeamsProactiveCapture {
246
+ conversation: Conversation;
247
+ teams: TeamsActivityInfo;
248
+ }
249
+ /**
250
+ * Capture a serializable {@link Conversation} from a live Teams turn alongside
251
+ * the parsed Teams metadata. Validates the captured reference.
252
+ *
253
+ * Persist the result to your storage of choice; replay later through
254
+ * `continueM365Conversation(adapter, capture.conversation, async (ctx) => …)`.
255
+ */
256
+ declare function captureTeamsConversationReference(context: TurnContext): TeamsProactiveCapture;
257
+
258
+ export { type TeamsChannelOptions as T, type TeamsChannelAdapter as a, type TeamsActivityInfo as b, type TeamsActivityKind as c, type TeamsActivityHandler as d, type TeamsActivityHandlers as e, type TeamsActorReference as f, type TeamsCardActionHandlers as g, type TeamsConfigHandlers as h, type TeamsConversationUpdateHandlers as i, type TeamsHandlerContext as j, type TeamsHandlerDecision as k, type TeamsInvokeResult as l, type TeamsMeetingHandlers as m, type TeamsMessageActivityHandlers as n, type TeamsMessageExtensionHandlers as o, type TeamsProactiveCapture as p, type TeamsSurface as q, type TeamsTabHandlers as r, type TeamsTaskModuleHandlers as s, type TeamsTurnPreparation as t, type TeamsTurnRequestContext as u, captureTeamsConversationReference as v, createTeamsInvokeActivity as w, sendTeamsInvoke as x };
@@ -0,0 +1,7 @@
1
+ import '@microsoft/agents-hosting';
2
+ export { Conversation, ConversationBuilder, ConversationClaims, ConversationReference, ConversationReferenceBuilder, CreateConversationOptions, CreateConversationOptionsBuilder, M365ConversationInput, M365ConversationRecord, ProactiveIdentity, captureM365ConversationReference, continueM365Conversation, restoreM365ConversationReference } from '@cuylabs/agent-channel-m365/proactive';
3
+ export { p as TeamsProactiveCapture, v as captureTeamsConversationReference } from './proactive-DF5XvDLJ.js';
4
+ import '@cuylabs/agent-core';
5
+ import '@cuylabs/agent-channel-m365';
6
+ import '@microsoft/agents-hosting-extensions-teams';
7
+ import '@microsoft/agents-activity';
@@ -0,0 +1,21 @@
1
+ import {
2
+ Conversation,
3
+ ConversationBuilder,
4
+ ConversationReferenceBuilder,
5
+ CreateConversationOptionsBuilder,
6
+ captureM365ConversationReference,
7
+ captureTeamsConversationReference,
8
+ continueM365Conversation,
9
+ restoreM365ConversationReference
10
+ } from "./chunk-MBDHSFBF.js";
11
+ import "./chunk-B5KRH22J.js";
12
+ export {
13
+ Conversation,
14
+ ConversationBuilder,
15
+ ConversationReferenceBuilder,
16
+ CreateConversationOptionsBuilder,
17
+ captureM365ConversationReference,
18
+ captureTeamsConversationReference,
19
+ continueM365Conversation,
20
+ restoreM365ConversationReference
21
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuylabs/agent-channel-teams",
3
- "version": "4.0.0",
3
+ "version": "4.2.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",
@@ -15,6 +15,11 @@
15
15
  "types": "./dist/extensions.d.ts",
16
16
  "import": "./dist/extensions.js",
17
17
  "default": "./dist/extensions.js"
18
+ },
19
+ "./proactive": {
20
+ "types": "./dist/proactive.d.ts",
21
+ "import": "./dist/proactive.js",
22
+ "default": "./dist/proactive.js"
18
23
  }
19
24
  },
20
25
  "files": [
@@ -23,23 +28,28 @@
23
28
  "README.md"
24
29
  ],
25
30
  "dependencies": {
26
- "@microsoft/agents-hosting-extensions-teams": "^1.4.2",
27
- "@cuylabs/agent-channel-m365": "^4.0.0",
28
- "@cuylabs/agent-core": "^4.0.0"
31
+ "@microsoft/agents-hosting-extensions-teams": "^1.5.0",
32
+ "@cuylabs/agent-channel-m365": "^4.2.0",
33
+ "@cuylabs/agent-core": "^4.2.0"
29
34
  },
30
35
  "peerDependencies": {
31
- "@microsoft/agents-activity": "^1.4.2",
32
- "@microsoft/agents-hosting": "^1.4.2",
36
+ "@microsoft/agents-activity": "^1.5.0",
37
+ "@microsoft/agents-hosting": "^1.5.0",
38
+ "@microsoft/agents-telemetry": "^1.5.0",
33
39
  "express": ">=4.21.0 || >=5.0.0"
34
40
  },
35
41
  "peerDependenciesMeta": {
42
+ "@microsoft/agents-telemetry": {
43
+ "optional": true
44
+ },
36
45
  "express": {
37
46
  "optional": true
38
47
  }
39
48
  },
40
49
  "devDependencies": {
41
- "@microsoft/agents-activity": "^1.4.2",
42
- "@microsoft/agents-hosting": "^1.4.2",
50
+ "@microsoft/agents-activity": "^1.5.0",
51
+ "@microsoft/agents-hosting": "^1.5.0",
52
+ "@microsoft/agents-telemetry": "^1.5.0",
43
53
  "@types/express": "^5.0.0",
44
54
  "@types/node": "^22.0.0",
45
55
  "express": "^5.2.1",
@@ -69,8 +79,8 @@
69
79
  "access": "public"
70
80
  },
71
81
  "scripts": {
72
- "build": "tsup src/index.ts src/extensions.ts --format esm --dts --clean",
73
- "dev": "tsup src/index.ts src/extensions.ts --format esm --dts --watch",
82
+ "build": "tsup src/index.ts src/extensions.ts src/proactive.ts --format esm --dts --clean",
83
+ "dev": "tsup src/index.ts src/extensions.ts src/proactive.ts --format esm --dts --watch",
74
84
  "typecheck": "tsc --noEmit",
75
85
  "test": "vitest run",
76
86
  "test:watch": "vitest",