UNPKG

@microsoft/agents-hosting-extensions-teams

Version:

Microsoft 365 Agents SDK for JavaScript. Teams extensions

283 lines 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageExtension = void 0; const agents_activity_1 = require("@microsoft/agents-activity"); const zod_1 = require("zod"); const messagingExtensionQuery_1 = require("./messagingExtensionQuery"); /** * Class that exposes Teams messaging extension-related events. * Provides an organized way to handle messaging extension operations in Microsoft Teams. */ class MessageExtension { /** * Creates a new instance of the MessageExtension class. * @param app - The agent application */ constructor(app) { this._app = app; } /** * Handles queries from messaging extensions. * @param handler - The handler to call when a query is received * @returns this (for method chaining) */ onQuery(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/query'); }; const routeHandler = async (context, state) => { var _a; const messageExtensionQuery = messagingExtensionQuery_1.messagingExtensionQueryZodSchema.parse(context.activity.value); const parameters = {}; (_a = messageExtensionQuery.parameters) === null || _a === void 0 ? void 0 : _a.forEach((param) => { parameters[param.name] = param.value; }); const result = await handler(context, state, messageExtensionQuery); const response = { composeExtension: result }; const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200, body: response }; context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); // Invoke requires true return this; } onSelectItem(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/selectItem'); }; const routeHandler = async (context, state) => { const result = await handler(context, state, context.activity.value); const response = { composeExtension: result }; const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200, body: response }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); // Invoke requires true return this; } /** * Handles link queries from messaging extensions. * @param handler - The handler to call when a link query is received * @returns this (for method chaining) */ onQueryLink(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/queryLink'); }; const routeHandler = async (context, state) => { const appBasedLinkQuerySchema = zod_1.z.object({ url: zod_1.z.string().url() }); const query = appBasedLinkQuerySchema.parse(context.activity.value); const res = await handler(context, state, query.url); const response = { composeExtension: res }; const invokeResponse = agents_activity_1.Activity.fromObject({ type: agents_activity_1.ActivityTypes.InvokeResponse, value: { status: 200, body: response } }); await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles anonymous link queries (for public access) from messaging extensions. * @param handler - The handler to call when an anonymous link query is received * @returns this (for method chaining) */ onAnonymousQueryLink(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/anonymousQueryLink'); }; const routeHandler = async (context, state) => { const appBasedLinkQuerySchema = zod_1.z.object({ url: zod_1.z.string().url() }); const query = appBasedLinkQuerySchema.parse(context.activity.value); const res = await handler(context, state, query.url); const response = { composeExtension: res }; const invokeResponse = agents_activity_1.Activity.fromObject({ type: agents_activity_1.ActivityTypes.InvokeResponse, value: { status: 200, body: response } }); await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles fetch task requests from messaging extensions. * @param handler - The handler to call when a fetch task is requested * @returns this (for method chaining) */ onFetchTask(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/fetchTask'); }; const routeHandler = async (context, state) => { const taskModuleResponse = await handler(context, state); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200, body: taskModuleResponse }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles action submissions from messaging extensions. * @param handler - The handler to call when an action is submitted * @returns this (for method chaining) */ onSubmitAction(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/submitAction' // && TODO // (!context.activity.value || !('botMessagePreviewAction' in context.activity.value.)) ); }; const routeHandler = async (context, state) => { const data = context.activity.value; const response = await handler(context, state, data); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200, body: response }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); // Invoke requires true return this; } /** * Handles message preview edit actions from messaging extensions. * @param handler - The handler to call when a message preview edit action is received * @returns this (for method chaining) */ onMessagePreviewEdit(handler) { const routeSel = (context) => { return Promise.resolve(!!(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/submitAction' && context.activity.value && // @ts-ignore context.activity.value['botMessagePreviewAction'] === 'edit')); }; const routeHandler = async (context, state) => { const activity = context.activity.value; const response = await handler(context, state, activity); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200, body: response }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles message preview send actions from messaging extensions. * @param handler - The handler to call when a message preview send action is received * @returns this (for method chaining) */ onMessagePreviewSend(handler) { const routeSel = (context) => { return Promise.resolve(!!(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/submitAction' && context.activity.value && // @ts-ignore context.activity.value['botMessagePreviewAction'] === 'send')); }; const routeHandler = async (context, state) => { var _a; const msgExtensionAction = context.activity.value; const activityPreview = ((_a = msgExtensionAction.activityPreview) === null || _a === void 0 ? void 0 : _a.length) > 0 ? agents_activity_1.Activity.fromObject(msgExtensionAction.activityPreview[0]) : new agents_activity_1.Activity(agents_activity_1.ActivityTypes.Message); await handler(context, state, activityPreview); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles configuration query setting URL requests from messaging extensions. * @param handler - The handler to call when a config query setting URL is requested * @returns this (for method chaining) */ onConfigurationQuerySettingUrl(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/querySettingUrl'); }; const routeHandler = async (context, state) => { await handler(context, state, context.activity.value); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200 }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles configuration setting updates from messaging extensions. * @param handler - The handler to call when configuration settings are updated * @returns this (for method chaining) */ onConfigurationSetting(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/setting'); }; const routeHandler = async (context, state) => { await handler(context, state, context.activity.value); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200 }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } /** * Handles card button click events from messaging extensions. * @param handler - The handler to call when a card button is clicked * @returns this (for method chaining) */ onCardButtonClicked(handler) { const routeSel = (context) => { return Promise.resolve(context.activity.type === agents_activity_1.ActivityTypes.Invoke && context.activity.channelId === 'msteams' && context.activity.name === 'composeExtension/onCardButtonClicked'); }; const routeHandler = async (context, state) => { await handler(context, state, context.activity.value); const invokeResponse = new agents_activity_1.Activity(agents_activity_1.ActivityTypes.InvokeResponse); invokeResponse.value = { status: 200 }; await context.sendActivity(invokeResponse); }; this._app.addRoute(routeSel, routeHandler, true); return this; } } exports.MessageExtension = MessageExtension; //# sourceMappingURL=messageExtension.js.map