UNPKG

@microsoft/agents-hosting-extensions-teams

Version:

Microsoft 365 Agents SDK for JavaScript. Teams extensions

299 lines (278 loc) 12.7 kB
import { Meeting } from './meeting/meeting' import { ActivityTypes } from '@microsoft/agents-activity' import { AgentApplication, AgentExtension, RouteHandler, RouteSelector, TurnContext, TurnState } from '@microsoft/agents-hosting' import { parseTeamsChannelData } from './activity-extensions/teamsChannelDataParser' import { MessageExtension } from './messageExtension/messageExtension' import { TaskModule } from './taskModule/taskModule' /** * Microsoft Teams-specific extension for agent applications that provides event handlers and functionality * for Teams-specific activities such as message operations, member management, channel operations, and team lifecycle events. * @template TState The type of turn state, extending TurnState */ export class TeamsAgentExtension<TState extends TurnState = TurnState> extends AgentExtension<TState> { _app: AgentApplication<TState> _meeting: Meeting<TState> _messageExtension: MessageExtension<TState> _taskModule: TaskModule<TState> /** * Creates a new instance of TeamsAgentExtension. * @param app The agent application instance to extend with Teams functionality */ constructor (private app: AgentApplication<TState>) { super('msteams') this._app = app this._meeting = new Meeting(app) this._messageExtension = new MessageExtension(app) this._taskModule = new TaskModule(app) } /** * Gets the meeting functionality for handling Teams meeting-related activities. * @returns The Meeting instance for this extension */ public get meeting (): Meeting<TState> { return this._meeting } /** * Gets the message extension functionality for handling Teams message extension activities. * @returns The MessageExtension instance for this extension */ public get messageExtension (): MessageExtension<TState> { return this._messageExtension } /** * Gets the task module functionality for handling Teams task module activities. * @returns The TaskModule instance for this extension */ public get taskModule (): TaskModule<TState> { return this._taskModule } /** * Registers a handler for message edit events in Teams. * @param handler The route handler to execute when a message is edited * @returns This TeamsAgentExtension instance for method chaining */ onMessageEdit = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(!!(context.activity.type === ActivityTypes.MessageUpdate && channelData?.eventType === 'editMessage')) } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for message delete events in Teams. * @param handler The route handler to execute when a message is deleted * @returns This TeamsAgentExtension instance for method chaining */ onMessageDelete = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.MessageDelete && channelData && channelData.eventType === 'softDeleteMessage') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for message undelete events in Teams. * @param handler The route handler to execute when a message is undeleted * @returns This TeamsAgentExtension instance for method chaining */ onMessageUndelete = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.MessageUpdate && channelData && channelData.eventType === 'undeleteMessage') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when members are added to a Teams conversation. * @param handler The route handler to execute when members are added * @returns This TeamsAgentExtension instance for method chaining */ onTeamsMembersAdded = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { return Promise.resolve(!!(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && context.activity.membersAdded && context.activity.membersAdded.length > 0)) } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when members are removed from a Teams conversation. * @param handler The route handler to execute when members are removed * @returns This TeamsAgentExtension instance for method chaining */ onTeamsMembersRemoved = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { return Promise.resolve(!!(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && context.activity.membersRemoved && context.activity.membersRemoved.length > 0)) } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams channel is created. * @param handler The route handler to execute when a channel is created * @returns This TeamsAgentExtension instance for method chaining */ onTeamsChannelCreated = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'channelCreated') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams channel is deleted. * @param handler The route handler to execute when a channel is deleted * @returns This TeamsAgentExtension instance for method chaining */ onTeamsChannelDeleted = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'channelDeleted') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams channel is renamed. * @param handler The route handler to execute when a channel is renamed * @returns This TeamsAgentExtension instance for method chaining */ onTeamsChannelRenamed = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'channelRenamed') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams channel is restored. * @param handler The route handler to execute when a channel is restored * @returns This TeamsAgentExtension instance for method chaining */ onTeamsChannelRestored = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'channelRestored') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is renamed. * @param handler The route handler to execute when a team is renamed * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamRenamed = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamRenamed') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is archived. * @param handler The route handler to execute when a team is archived * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamArchived = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamArchived') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is unarchived. * @param handler The route handler to execute when a team is unarchived * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamUnarchived = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamUnarchived') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is deleted (soft delete). * @param handler The route handler to execute when a team is deleted * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamDeleted = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamDeleted') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is hard deleted (permanently deleted). * @param handler The route handler to execute when a team is hard deleted * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamHardDeleted = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamHardDeleted') } this.addRoute(this._app, routeSel, handler, false) return this } /** * Registers a handler for when a Teams team is restored. * @param handler The route handler to execute when a team is restored * @returns This TeamsAgentExtension instance for method chaining */ onTeamsTeamRestored = (handler: RouteHandler<TurnState>) => { const routeSel: RouteSelector = (context: TurnContext) => { const channelData = parseTeamsChannelData(context.activity.channelData) return Promise.resolve(context.activity.type === ActivityTypes.ConversationUpdate && context.activity.channelId === 'msteams' && channelData && channelData.eventType === 'teamRestored') } this.addRoute(this._app, routeSel, handler, false) return this } }