@microsoft/agents-hosting-extensions-teams
Version:
Microsoft 365 Agents SDK for JavaScript. Teams extensions
283 lines • 13.4 kB
JavaScript
;
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