diff --git a/libraries/botbuilder-dialogs/src/skillDialog.ts b/libraries/botbuilder-dialogs/src/skillDialog.ts index 9e387183f7..3ee369bcf9 100644 --- a/libraries/botbuilder-dialogs/src/skillDialog.ts +++ b/libraries/botbuilder-dialogs/src/skillDialog.ts @@ -11,6 +11,7 @@ import { ActivityTypes, ConversationReference, DeliveryModes, + ExpectedReplies, SkillConversationIdFactoryOptions, TurnContext } from 'botbuilder-core'; @@ -182,7 +183,7 @@ export class SkillDialog extends Dialog { const skillInfo = this.dialogOptions.skill; await this.dialogOptions.conversationState.saveChanges(context, true); - const response = await this.dialogOptions.skillClient.postActivity(this.dialogOptions.botId, skillInfo.appId, skillInfo.skillEndpoint, this.dialogOptions.skillHostEndpoint, skillConversationId, activity); + const response = await this.dialogOptions.skillClient.postActivity(this.dialogOptions.botId, skillInfo.appId, skillInfo.skillEndpoint, this.dialogOptions.skillHostEndpoint, skillConversationId, activity); // Inspect the skill response status if (!(response.status >= 200 && response.status <= 299)) { @@ -190,10 +191,10 @@ export class SkillDialog extends Dialog { } let eocActivity: Activity; - if (activity.deliveryMode == DeliveryModes.ExpectReplies && response.body) { + if (activity.deliveryMode == DeliveryModes.ExpectReplies && response.body && response.body.activities) { // Process replies in the response.Body. - if (Array.isArray(response.body)) { - response.body.forEach(async (fromSkillActivity: Activity): Promise => { + if (Array.isArray(response.body.activities)) { + response.body.activities.forEach(async (fromSkillActivity: Activity): Promise => { if (fromSkillActivity.type === ActivityTypes.EndOfConversation) { // Capture the EndOfConversation activity if it was sent from skill eocActivity = fromSkillActivity; diff --git a/libraries/botbuilder/src/botFrameworkAdapter.ts b/libraries/botbuilder/src/botFrameworkAdapter.ts index 3ab5d282c1..a503b5d8f4 100644 --- a/libraries/botbuilder/src/botFrameworkAdapter.ts +++ b/libraries/botbuilder/src/botFrameworkAdapter.ts @@ -9,7 +9,7 @@ import { STATUS_CODES } from 'http'; import * as os from 'os'; -import { Activity, ActivityTypes, BotAdapter, BotCallbackHandlerKey, ChannelAccount, ConversationAccount, ConversationParameters, ConversationReference, ConversationsResult, DeliveryModes,InvokeResponse, ExtendedUserTokenProvider, ResourceResponse, StatusCodes, TokenResponse, TurnContext } from 'botbuilder-core'; +import { Activity, ActivityTypes, BotAdapter, BotCallbackHandlerKey, ChannelAccount, ConversationAccount, ConversationParameters, ConversationReference, ConversationsResult, DeliveryModes, ExpectedReplies, InvokeResponse, ExtendedUserTokenProvider, ResourceResponse, StatusCodes, TokenResponse, TurnContext } from 'botbuilder-core'; import { AuthenticationConfiguration, AuthenticationConstants, ChannelValidation, Claim, ClaimsIdentity, ConnectorClient, EmulatorApiClient, GovernmentConstants, GovernmentChannelValidation, JwtTokenValidation, MicrosoftAppCredentials, AppCredentials, CertificateAppCredentials, SimpleCredentialProvider, TokenApiClient, TokenStatus, TokenApiModels, SignInUrlResponse, SkillValidation, TokenExchangeRequest } from 'botframework-connector'; import { INodeBuffer, INodeSocket, IReceiveRequest, ISocket, IStreamingTransportServer, NamedPipeServer, NodeWebSocketFactory, NodeWebSocketFactoryBase, RequestHandler, StreamingResponse, WebSocketServer } from 'botframework-streaming'; @@ -838,7 +838,8 @@ export class BotFrameworkAdapter extends BotAdapter implements ExtendedUserToken status = 501; } } else if (request.deliveryMode === DeliveryModes.ExpectReplies) { - body = context.bufferedReplyActivities; + const expectedReplies: ExpectedReplies = { activities: context.bufferedReplyActivities as Activity[] }; + body = expectedReplies; status = StatusCodes.OK; } else { status = 200; @@ -1272,7 +1273,8 @@ export class BotFrameworkAdapter extends BotAdapter implements ExtendedUserToken response.statusCode = StatusCodes.NOT_IMPLEMENTED; } } else if (body.deliveryMode === DeliveryModes.ExpectReplies) { - response.setBody(context.bufferedReplyActivities); + const replies: ExpectedReplies = { activities : context.bufferedReplyActivities as Activity[] }; + response.setBody(replies); response.statusCode = StatusCodes.OK; } else { response.statusCode = StatusCodes.OK; diff --git a/libraries/botframework-connector/src/connectorApi/models/mappers.ts b/libraries/botframework-connector/src/connectorApi/models/mappers.ts index 730c3c0a56..40f6136b5b 100644 --- a/libraries/botframework-connector/src/connectorApi/models/mappers.ts +++ b/libraries/botframework-connector/src/connectorApi/models/mappers.ts @@ -956,6 +956,28 @@ export const ConversationsResult: msRest.CompositeMapper = { } }; +export const ExpectedReplies: msRest.CompositeMapper = { + serializedName: "ExpectedReplies", + type: { + name: "Composite", + className: "ExpectedReplies", + modelProperties: { + activities: { + serializedName: "activities", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "Activity" + } + } + } + } + } + } +}; + export const ResourceResponse: msRest.CompositeMapper = { serializedName: "ResourceResponse", type: { diff --git a/libraries/botframework-schema/src/index.ts b/libraries/botframework-schema/src/index.ts index 3a8a52676e..cfc36305b0 100644 --- a/libraries/botframework-schema/src/index.ts +++ b/libraries/botframework-schema/src/index.ts @@ -579,6 +579,16 @@ export interface ConversationsResult { conversations: ConversationMembers[]; } +/** + * Expected Replies in response to DeliveryModes.ExpectReplies + */ +export interface ExpectedReplies { + /** + * A collection of Activities that conforms to the ExpectedReplies schema. + */ + activities: Activity[]; +} + /** * A response containing a resource ID */ diff --git a/libraries/testskills/skillparent/parentBot.js b/libraries/testskills/skillparent/parentBot.js index b3a6753e0e..ea0b1eab43 100644 --- a/libraries/testskills/skillparent/parentBot.js +++ b/libraries/testskills/skillparent/parentBot.js @@ -69,7 +69,7 @@ class ParentBot extends ActivityHandler { if (response.status == 200) { - await context.sendActivities(response.body); + await context.sendActivities(response.body.activities); } await context.sendActivity('parent: after child');