diff --git a/.eslintrc.json b/.eslintrc.json index d21952753f..5bcc487e97 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,6 +8,7 @@ "plugins": ["prettier"], "rules": { "prettier/prettier": "error" - } + }, + "root": true } diff --git a/.gitignore b/.gitignore index cf918b024c..54da99a7b6 100644 --- a/.gitignore +++ b/.gitignore @@ -385,6 +385,9 @@ experimental/generator-dotnet-yeoman/node_modules !/[Pp]ackages/* !/tests/[Pp]ackages/* +# Allow the packages directory under tests +!/tests/unit/[Pp]ackages/* + # Ignore correct yarn files (no zero install support) .yarn/* !.yarn/patches diff --git a/build/yaml/templates/component-template.yml b/build/yaml/templates/component-template.yml index cce084d0c1..b2b5884c4b 100644 --- a/build/yaml/templates/component-template.yml +++ b/build/yaml/templates/component-template.yml @@ -33,7 +33,6 @@ stages: - job: build_test_dotnet displayName: Build and test .csproj with dotnet steps: - - template: dotnet-install-sdk-steps.yml - template: dotnet-build-test-steps.yml - stage: stage_package_nuget @@ -46,7 +45,6 @@ stages: condition: eq(variables.ComponentType, 'codeExtension') steps: - template: nuget-versioning-steps.yml - - template: dotnet-install-sdk-steps.yml - template: dotnet-package-steps.yml - template: nuget-signing-steps.yml - job: job_pack_nuspec diff --git a/build/yaml/templates/dotnet-build-test-steps.yml b/build/yaml/templates/dotnet-build-test-steps.yml index cf6901e5b2..6a6c0e7bc5 100644 --- a/build/yaml/templates/dotnet-build-test-steps.yml +++ b/build/yaml/templates/dotnet-build-test-steps.yml @@ -1,4 +1,14 @@ steps: +- task: UseDotNet@2 + displayName: 'Use .Net Core sdk 2.1.x' + inputs: + version: 2.1.x + +- task: UseDotNet@2 + displayName: 'Use .Net Core sdk 3.1.x' + inputs: + version: 3.1.x + - task: DotNetCoreCLI@2 displayName: 'Run `dotnet restore`' inputs: diff --git a/build/yaml/templates/dotnet-install-sdk-steps.yml b/build/yaml/templates/dotnet-install-sdk-steps.yml deleted file mode 100644 index 772e09f578..0000000000 --- a/build/yaml/templates/dotnet-install-sdk-steps.yml +++ /dev/null @@ -1,10 +0,0 @@ -steps: -- task: UseDotNet@2 - displayName: 'Use .Net Core sdk 2.1.x' - inputs: - version: 2.1.x - -- task: UseDotNet@2 - displayName: 'Use .Net Core sdk 3.1.x' - inputs: - version: 3.1.x diff --git a/build/yaml/templates/dotnet-package-steps.yml b/build/yaml/templates/dotnet-package-steps.yml index 49e0a39302..106b8caa7e 100644 --- a/build/yaml/templates/dotnet-package-steps.yml +++ b/build/yaml/templates/dotnet-package-steps.yml @@ -1,4 +1,9 @@ steps: +- task: UseDotNet@2 + displayName: 'Use .Net Core sdk 2.1.x' + inputs: + version: 2.1.x + - task: DotNetCoreCLI@2 displayName: 'Run `dotnet publish`' inputs: diff --git a/build/yaml/templates/npm-versioning-steps.yml b/build/yaml/templates/npm-versioning-steps.yml index a028d41658..a37761b4eb 100644 --- a/build/yaml/templates/npm-versioning-steps.yml +++ b/build/yaml/templates/npm-versioning-steps.yml @@ -13,7 +13,7 @@ steps: $deploymentRing = $deploymentRingOverride; } - if ($deploymentRing.ToLowerInvariant() -eq "rc") { + if (($deploymentRing.ToLowerInvariant() -eq "rc") -or ($deploymentRing.ToLowerInvariant() -eq "preview")) { $releaseCandidateNumber = "$env:RELEASECANDIDATENUMBER"; "Release Candidate Number = $releaseCandidateNumber"; diff --git a/build/yaml/templates/nuget-signing-steps.yml b/build/yaml/templates/nuget-signing-steps.yml index 5e08c14ebe..269af981c7 100644 --- a/build/yaml/templates/nuget-signing-steps.yml +++ b/build/yaml/templates/nuget-signing-steps.yml @@ -2,11 +2,6 @@ # Extra steps are required to sign the binaries of the code extensions. steps: -- task: UseDotNet@2 - displayName: 'Use .Net Core sdk 2.1.x' - inputs: - version: 2.1.x - - task: CopyFiles@2 displayName: 'Copy packages to Signing' inputs: diff --git a/build/yaml/templates/nuget-versioning-steps.yml b/build/yaml/templates/nuget-versioning-steps.yml index 2d3b37b515..022e483ed7 100644 --- a/build/yaml/templates/nuget-versioning-steps.yml +++ b/build/yaml/templates/nuget-versioning-steps.yml @@ -13,7 +13,7 @@ steps: $deploymentRing = $deploymentRingOverride; } - if ($deploymentRing.ToLowerInvariant() -eq "rc") { + if (($deploymentRing.ToLowerInvariant() -eq "rc") -or ($deploymentRing.ToLowerInvariant() -eq "preview")) { $releaseCandidateNumber = "$env:RELEASECANDIDATENUMBER"; "Release Candidate Number = $releaseCandidateNumber"; diff --git a/generators/command-line-instructions.md b/generators/command-line-instructions.md index 0a1b3a60f4..d760a1ff67 100644 --- a/generators/command-line-instructions.md +++ b/generators/command-line-instructions.md @@ -1,6 +1,6 @@ # Command line instructions -Our templates can also be used from the command-line. First, install [Yeoman][yeoman] using [npm][npm] (we assume you have pre-installed [node.js][nodejs]): +Our templates can also be used from the command-line. First, install [Yeoman](https://yeoman.io) using [npm](https://npmjs.com) (we assume you have pre-installed [node.js](https://nodejs.org/)): ```bash npm install -g yo @@ -17,13 +17,13 @@ Next, identify the template you would like to use from the table below: | [Enterprise People Bot](/generator-bot-enterprise-people) | [@microsoft/generator-bot-enterprise-people](https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-people) | [![npm version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-people.svg)](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-people) | dotnet | webapp, functions | | [Adaptive](/generator-bot-adaptive) | [@microsoft/generator-bot-adaptive](https://www.npmjs.com/package/@microsoft/generator-bot-adaptive) | [![npm version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive.svg)](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive) | dotnet, js | webapp, functions | -Once you have identified the template you would like to use, install it using [npm][npm]. For example, to install the Empty Bot template: +Once you have identified the template you would like to use, install it using [npm](https://npmjs.com). For example, to install the Empty Bot template: ```bash npm install -g @microsoft/generator-bot-empty ``` -Finally, generate your new project using [Yeoman][yeoman], taking note of the following: +Finally, generate your new project using [Yeoman](https://yeoman.io), taking note of the following: - Remove `generator` from the package name, e.g. `@microsoft/generator-bot-empty` becomes `@microsoft/bot-empty`. - `--platform` and `--integration` match one of the listed values from template's platforms and integrations. @@ -33,7 +33,3 @@ Finally, generate your new project using [Yeoman][yeoman], taking note of the fo ```bash yo @microsoft/bot-empty '{BOT_NAME}' --platform '{dotnet|js}' --integration '{webapp|functions}' ``` - -[yeoman]: https://yeoman.io -[npm]: https://npmjs.com -[nodejs]: https://nodejs.org/ diff --git a/generators/generator-bot-adaptive/README.md b/generators/generator-bot-adaptive/README.md index 0a2b5e5ba9..18c3126a23 100644 --- a/generators/generator-bot-adaptive/README.md +++ b/generators/generator-bot-adaptive/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-adaptive [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-adaptive [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-adaptive) This generator is for creating an Azure Bot Framework bot using the Adaptive Dialog stack. This generator is designed to be used as a base for other more purpose-specific generators, and is responsible for scaffolding: @@ -28,6 +28,3 @@ This template can also be installed from the [command line](https://github.com/m ## License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-adaptive \ No newline at end of file diff --git a/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.schema b/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.schema index f43be3014a..9e26dfeeb6 100644 --- a/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.schema +++ b/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.schema @@ -1,9873 +1 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", - "type": "object", - "title": "Component kinds", - "description": "These are all of the kinds that can be created by the loader.", - "oneOf": [ - { - "$ref": "#/definitions/Microsoft.ActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog" - }, - { - "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.Ask" - }, - { - "$ref": "#/definitions/Microsoft.AttachmentInput" - }, - { - "$ref": "#/definitions/Microsoft.BeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.BeginSkill" - }, - { - "$ref": "#/definitions/Microsoft.BreakLoop" - }, - { - "$ref": "#/definitions/Microsoft.CancelAllDialogs" - }, - { - "$ref": "#/definitions/Microsoft.CancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.ChannelMentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ChoiceInput" - }, - { - "$ref": "#/definitions/Microsoft.ConditionalSelector" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmInput" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ContinueConversationLater" - }, - { - "$ref": "#/definitions/Microsoft.ContinueLoop" - }, - { - "$ref": "#/definitions/Microsoft.CrossTrainedRecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.CurrencyEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeInput" - }, - { - "$ref": "#/definitions/Microsoft.DebugBreak" - }, - { - "$ref": "#/definitions/Microsoft.DeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperties" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperty" - }, - { - "$ref": "#/definitions/Microsoft.DimensionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EditActions" - }, - { - "$ref": "#/definitions/Microsoft.EditArray" - }, - { - "$ref": "#/definitions/Microsoft.EmailEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EmitEvent" - }, - { - "$ref": "#/definitions/Microsoft.EndDialog" - }, - { - "$ref": "#/definitions/Microsoft.EndTurn" - }, - { - "$ref": "#/definitions/Microsoft.FirstSelector" - }, - { - "$ref": "#/definitions/Microsoft.Foreach" - }, - { - "$ref": "#/definitions/Microsoft.ForeachPage" - }, - { - "$ref": "#/definitions/Microsoft.GetActivityMembers" - }, - { - "$ref": "#/definitions/Microsoft.GetConversationMembers" - }, - { - "$ref": "#/definitions/Microsoft.GotoAction" - }, - { - "$ref": "#/definitions/Microsoft.GuidEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HashtagEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HttpRequest" - }, - { - "$ref": "#/definitions/Microsoft.IfCondition" - }, - { - "$ref": "#/definitions/Microsoft.IpEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.LogAction" - }, - { - "$ref": "#/definitions/Microsoft.LuisRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MostSpecificSelector" - }, - { - "$ref": "#/definitions/Microsoft.MultiLanguageRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberInput" - }, - { - "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OAuthInput" - }, - { - "$ref": "#/definitions/Microsoft.OnActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnAssignEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnBeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnCancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseProperty" - }, - { - "$ref": "#/definitions/Microsoft.OnCondition" - }, - { - "$ref": "#/definitions/Microsoft.OnContinueConversation" - }, - { - "$ref": "#/definitions/Microsoft.OnConversationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnDialogEvent" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfActions" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfConversationActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnError" - }, - { - "$ref": "#/definitions/Microsoft.OnEventActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnInstallationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnInvokeActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageDeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageReactionActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnQnAMatch" - }, - { - "$ref": "#/definitions/Microsoft.OnRepromptDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnTypingActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnUnknownIntent" - }, - { - "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerDialog" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RandomSelector" - }, - { - "$ref": "#/definitions/Microsoft.RecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RegexRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RepeatDialog" - }, - { - "$ref": "#/definitions/Microsoft.ReplaceDialog" - }, - { - "$ref": "#/definitions/Microsoft.ResourceMultiLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.SendActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.StaticActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEvent" - }, - { - "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.TemplateEngineLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - }, - { - "$ref": "#/definitions/Microsoft.TextTemplate" - }, - { - "$ref": "#/definitions/Microsoft.ThrowException" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.TrueSelector" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" - } - ], - "definitions": { - "Microsoft.ActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft activity template", - "type": "object", - "required": [ - "template", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "template": { - "title": "Template", - "description": "Language Generator template to use to create the activity", - "type": "string" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ActivityTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AdaptiveDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Adaptive dialog", - "description": "Flexible, data driven dialog that can adapt to the conversation.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional dialog ID." - }, - "autoEndDialog": { - "$ref": "#/definitions/booleanExpression", - "title": "Auto end dialog", - "description": "If set to true the dialog will automatically end when there are no further actions. If set to false, remember to manually end the dialog using EndDialog action.", - "default": true - }, - "defaultResultProperty": { - "type": "string", - "title": "Default result property", - "description": "Value that will be passed back to the parent dialog.", - "default": "dialog.result" - }, - "recognizer": { - "$kind": "Microsoft.IRecognizer", - "title": "Recognizer", - "description": "Input recognizer that interprets user input into intent and entities.", - "$ref": "#/definitions/Microsoft.IRecognizer" - }, - "generator": { - "$kind": "Microsoft.ILanguageGenerator", - "title": "Language generator", - "description": "Language generator that generates bot responses.", - "$ref": "#/definitions/Microsoft.ILanguageGenerator" - }, - "selector": { - "$kind": "Microsoft.ITriggerSelector", - "title": "Selector", - "description": "Policy to determine which trigger is executed. Defaults to a 'best match' selector (optional).", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "triggers": { - "type": "array", - "description": "List of triggers defined for this dialog.", - "title": "Triggers", - "items": { - "$kind": "Microsoft.ITrigger", - "title": "Event triggers", - "description": "Event triggers for handling events.", - "$ref": "#/definitions/Microsoft.ITrigger" - } - }, - "schema": { - "title": "Schema", - "description": "Schema to fill in.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Core schema meta-schema", - "definitions": { - "schemaArray": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - } - }, - "nonNegativeInteger": { - "type": "integer", - "minimum": 0 - }, - "nonNegativeIntegerDefault0": { - "type": "integer", - "minimum": 0, - "default": 0 - }, - "simpleTypes": { - "enum": [ - "array", - "boolean", - "integer", - "null", - "number", - "object", - "string" - ] - }, - "stringArray": { - "type": "array", - "uniqueItems": true, - "default": [], - "items": { - "type": "string" - } - } - }, - "type": [ - "object", - "boolean" - ], - "properties": { - "$schema": { - "type": "string", - "format": "uri" - }, - "$ref": { - "type": "string", - "format": "uri-reference" - }, - "$comment": { - "type": "string" - }, - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "default": true, - "readOnly": { - "type": "boolean", - "default": false - }, - "writeOnly": { - "type": "boolean", - "default": false - }, - "examples": { - "type": "array", - "items": true - }, - "multipleOf": { - "type": "number", - "exclusiveMinimum": 0 - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "number" - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "number" - }, - "maxLength": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeInteger" - }, - "minLength": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeIntegerDefault0" - }, - "pattern": { - "type": "string", - "format": "regex" - }, - "additionalItems": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/schemaArray" - } - ], - "default": true - }, - "maxItems": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeInteger" - }, - "minItems": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeIntegerDefault0" - }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "contains": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "maxProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeInteger" - }, - "minProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/nonNegativeIntegerDefault0" - }, - "required": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/stringArray" - }, - "additionalProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "definitions": { - "type": "object", - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - } - }, - "properties": { - "type": "object", - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - } - }, - "patternProperties": { - "type": "object", - "propertyNames": { - "format": "regex" - }, - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - } - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/stringArray" - } - ] - } - }, - "propertyNames": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "const": true, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": true - }, - "type": { - "anyOf": [ - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/simpleTypes" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/simpleTypes" - }, - "minItems": 1, - "uniqueItems": true - } - ] - }, - "format": { - "type": "string" - }, - "contentMediaType": { - "type": "string" - }, - "contentEncoding": { - "type": "string" - }, - "if": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "then": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "else": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - }, - "allOf": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/schemaArray" - }, - "anyOf": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/schemaArray" - }, - "oneOf": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0/definitions/schemaArray" - }, - "not": { - "$ref": "#/definitions/Microsoft.AdaptiveDialog/properties/schema/anyOf/0" - } - }, - "default": true - }, - { - "type": "string", - "title": "Reference to JSON schema", - "description": "Reference to JSON schema .dialog file." - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AdaptiveDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AgeEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Age entity recognizer", - "description": "Recognizer which recognizes age.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AgeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Ask": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.SendActivity)" - ], - "title": "Send activity to ask a question", - "description": "This is an action which sends an activity to the user when a response is expected", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "expectedProperties": { - "$ref": "#/definitions/arrayExpression", - "title": "Expected properties", - "description": "Properties expected from the user.", - "examples": [ - [ - "age", - "name" - ] - ], - "items": { - "type": "string", - "title": "Name", - "description": "Name of the property" - } - }, - "defaultOperation": { - "$ref": "#/definitions/stringExpression", - "title": "Default operation", - "description": "Sets the default operation that will be used when no operation is recognized in the response to this Ask.", - "examples": [ - "Add()", - "Remove()" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action." - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Ask" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AttachmentInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Attachment input dialog", - "description": "Collect information - Ask for a file or image.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$role": "expression", - "title": "Default value", - "description": "'Property' will be set to the object or the result of this expression when max turn count is exceeded.", - "oneOf": [ - { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/attachments/items", - "title": "Object", - "description": "Attachment object." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "value": { - "$role": "expression", - "title": "Value", - "description": "'Property' will be set to the object or the result of this expression unless it evaluates to null.", - "oneOf": [ - { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/attachments/items", - "title": "Object", - "description": "Attachment object." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "outputFormat": { - "$role": "expression", - "title": "Output format", - "description": "Attachment output format.", - "oneOf": [ - { - "type": "string", - "title": "Standard format", - "description": "Standard output formats.", - "enum": [ - "all", - "first" - ], - "default": "first" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AttachmentInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BeginDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Begin a dialog", - "description": "Begin another dialog.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "dialog": { - "oneOf": [ - { - "$kind": "Microsoft.IDialog", - "pattern": "^(?!(=)).*", - "title": "Dialog", - "$ref": "#/definitions/Microsoft.IDialog" - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=settings.dialogId" - ] - } - ], - "title": "Dialog name", - "description": "Name of the dialog to call." - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "examples": [ - { - "arg1": "=expression" - } - ], - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "dialog.userName" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BeginDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BeginSkill": { - "$role": "implements(Microsoft.IDialog)", - "title": "Begin a skill", - "description": "Begin a remote skill.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the skill dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=f(x)" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the skill will be started using the activity in the current turn context instead of the activity in the Activity property.", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "dialog.userName" - ] - }, - "botId": { - "$ref": "#/definitions/stringExpression", - "title": "Skill host bot ID", - "description": "The Microsoft App ID that will be calling the skill.", - "default": "=settings.MicrosoftAppId" - }, - "skillHostEndpoint": { - "$ref": "#/definitions/stringExpression", - "title": "Skill host", - "description": "The callback Url for the skill host.", - "default": "=settings.skillHostEndpoint", - "examples": [ - "https://mybot.contoso.com/api/skills/" - ] - }, - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "OAuth connection name (SSO)", - "description": "The OAuth Connection Name, that would be used to perform Single SignOn with a skill.", - "default": "=settings.connectionName" - }, - "skillAppId": { - "$ref": "#/definitions/stringExpression", - "title": "Skill App Id", - "description": "The Microsoft App ID for the skill." - }, - "skillEndpoint": { - "$ref": "#/definitions/stringExpression", - "title": "Skill endpoint ", - "description": "The /api/messages endpoint for the skill.", - "examples": [ - "https://myskill.contoso.com/api/messages/" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "The activity to send to the skill.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the skill.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BeginSkill" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BreakLoop": { - "$role": "implements(Microsoft.IDialog)", - "title": "Break loop", - "description": "Stop executing this loop", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BreakLoop" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CancelAllDialogs": { - "$role": "implements(Microsoft.IDialog)", - "title": "Cancel all dialogs", - "description": "Cancel all active dialogs. All dialogs in the dialog chain will need a trigger to capture the event configured in this action.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the caller dialog is told it should process the current activity.", - "default": true - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event name", - "description": "Name of the event to emit." - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional).", - "additionalProperties": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CancelAllDialogs" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CancelDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Cancel all dialogs", - "description": "Cancel all active dialogs. All dialogs in the dialog chain will need a trigger to capture the event configured in this action.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the caller dialog is told it should process the current activity.", - "default": true - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event name", - "description": "Name of the event to emit." - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional).", - "additionalProperties": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CancelDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ChannelMentionEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)" - ], - "title": "Channel mention entity recognizer", - "description": "Promotes mention entities passed by a channel via the activity.entities into recognizer result.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ChannelMentionEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ChoiceInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Choice input dialog", - "description": "Collect information - Pick from a list of choices", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "outputFormat": { - "$role": "expression", - "title": "Output format", - "description": "Sets the desired choice output format (either value or index into choices).", - "oneOf": [ - { - "type": "string", - "title": "Standard", - "description": "Standard output format.", - "enum": [ - "value", - "index" - ], - "default": "value" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choices": { - "$role": "expression", - "title": "Array of choices", - "description": "Choices to choose from.", - "oneOf": [ - { - "type": "array", - "title": "Simple choices", - "description": "Simple choices to choose from.", - "items": [ - { - "type": "string", - "title": "Simple choice", - "description": "One choice for choice input." - } - ] - }, - { - "type": "array", - "title": "Structured choices", - "description": "Choices that allow full control.", - "items": [ - { - "type": "object", - "title": "Structured choice", - "description": "Structured choice to choose from.", - "properties": { - "value": { - "type": "string", - "title": "Value", - "description": "Value to return when this choice is selected." - }, - "action": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/suggestedActions/properties/actions/items", - "title": "Action", - "description": "Card action for the choice." - }, - "synonyms": { - "type": "array", - "title": "Synonyms", - "description": "List of synonyms to recognize in addition to the value (optional).", - "items": { - "type": "string", - "title": "Synonym", - "description": "Synonym for value." - } - } - } - } - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "The default locale to use to parse confirmation choices if there is not one passed by the caller.", - "default": "en-us", - "examples": [ - "en-us" - ] - }, - "style": { - "$role": "expression", - "title": "List style", - "description": "Sets the ListStyle to control how choices are rendered.", - "oneOf": [ - { - "type": "string", - "title": "List style", - "description": "Standard list style.", - "enum": [ - "none", - "auto", - "inline", - "list", - "suggestedAction", - "heroCard" - ], - "default": "auto" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choiceOptions": { - "title": "Choice options", - "description": "Sets the choice options used for controlling how choices are combined.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Choice options object.", - "properties": { - "inlineSeparator": { - "type": "string", - "title": "Inline separator", - "description": "Character used to separate individual choices when there are more than 2 choices", - "default": ", " - }, - "inlineOr": { - "type": "string", - "title": "Inline or", - "description": "Separator inserted between the choices when there are only 2 choices", - "default": " or " - }, - "inlineOrMore": { - "type": "string", - "title": "Inline or more", - "description": "Separator inserted between the last 2 choices when their are more than 2 choices.", - "default": ", or " - }, - "includeNumbers": { - "type": "boolean", - "title": "Include numbers", - "description": "If true, 'inline' and 'list' list style will be prefixed with the index of the choice.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "recognizerOptions": { - "title": "Recognizer options", - "description": "Sets how to recognize choices in the response", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Options for recognizer.", - "properties": { - "noValue": { - "type": "boolean", - "title": "No value", - "description": "If true, the choices value field will NOT be search over", - "default": false - }, - "noAction": { - "type": "boolean", - "title": "No action", - "description": "If true, the choices action.title field will NOT be searched over", - "default": false - }, - "recognizeNumbers": { - "type": "boolean", - "title": "Recognize numbers", - "description": "If true, the number recognizer will be used to recognize an index response (1,2,3...) to the prompt.", - "default": true - }, - "recognizeOrdinals": { - "type": "boolean", - "title": "Recognize ordinals", - "description": "If true, the ordinal recognizer will be used to recognize ordinal response (first/second/...) to the prompt.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ChoiceInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConditionalSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Conditional trigger selector", - "description": "Use a rule selector based on a condition", - "type": "object", - "required": [ - "condition", - "ifTrue", - "ifFalse", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression to evaluate" - }, - "ifTrue": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "ifFalse": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConditionalSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConfirmInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Confirm input dialog", - "description": "Collect information - Ask for confirmation (yes or no).", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "outputFormat": { - "$ref": "#/definitions/valueExpression", - "title": "Output format", - "description": "Optional expression to use to format the output.", - "examples": [ - "=concat('confirmation:', this.value)" - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "The Default locale or an expression which provides the default locale to use as default if not found in the activity.", - "default": "en-us", - "examples": [ - "en-us" - ] - }, - "style": { - "$role": "expression", - "title": "List style", - "description": "Sets the ListStyle to control how choices are rendered.", - "oneOf": [ - { - "type": "string", - "title": "Standard style", - "description": "Standard style for rendering choices.", - "enum": [ - "none", - "auto", - "inline", - "list", - "suggestedAction", - "heroCard" - ], - "default": "auto" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choiceOptions": { - "title": "Choice options", - "description": "Choice Options or expression which provides Choice Options to control display choices to the user.", - "oneOf": [ - { - "type": "object", - "title": "Choice options", - "description": "Choice options.", - "properties": { - "inlineSeparator": { - "type": "string", - "title": "Inline separator", - "description": "Text to separate individual choices when there are more than 2 choices", - "default": ", " - }, - "inlineOr": { - "type": "string", - "title": "Inline or", - "description": "Text to be inserted between the choices when their are only 2 choices", - "default": " or " - }, - "inlineOrMore": { - "type": "string", - "title": "Inline or more", - "description": "Text to be inserted between the last 2 choices when their are more than 2 choices.", - "default": ", or " - }, - "includeNumbers": { - "type": "boolean", - "title": "Include numbers", - "description": "If true, inline and list style choices will be prefixed with the index of the choice.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "defaultValue": { - "$ref": "#/definitions/booleanExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "value": { - "$ref": "#/definitions/booleanExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - true, - "=user.isVip" - ] - }, - "confirmChoices": { - "$role": "expression", - "title": "Array of choice objects", - "description": "Array of simple or structured choices.", - "oneOf": [ - { - "type": "array", - "title": "Simple choices", - "description": "Simple choices to confirm from.", - "items": [ - { - "type": "string", - "title": "Simple choice", - "description": "Simple choice to confirm." - } - ] - }, - { - "type": "array", - "title": "Structured choices", - "description": "Structured choices for confirmations.", - "items": [ - { - "type": "object", - "title": "Choice", - "description": "Choice to confirm.", - "properties": { - "value": { - "type": "string", - "title": "Value", - "description": "Value to return when this choice is selected." - }, - "action": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/suggestedActions/properties/actions/items", - "title": "Action", - "description": "Card action for the choice." - }, - "synonyms": { - "type": "array", - "title": "Synonyms", - "description": "List of synonyms to recognize in addition to the value (optional).", - "items": { - "type": "string", - "title": "Synonym", - "description": "Synonym for choice." - } - } - } - } - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConfirmInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConfirmationEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Confirmation entity recognizer", - "description": "Recognizer which recognizes confirmation choices (yes/no).", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConfirmationEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ContinueConversationLater": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue conversation later (Queue)", - "description": "Continue conversation at later time (via Azure Storage Queue).", - "type": "object", - "required": [ - "date", - "connectionString", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "date": { - "$ref": "#/definitions/stringExpression", - "title": "Date", - "description": "Date in the future as a ISO string when the conversation should continue.", - "examples": [ - "=addHours(utcNow(), 1)" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Value to send in the activity.value." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ContinueConversationLater" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ContinueLoop": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue loop", - "description": "Stop executing this template and continue with the next iteration of the loop.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ContinueLoop" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CrossTrainedRecognizerSet": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Cross-trained recognizer set", - "description": "Recognizer for selecting between cross trained recognizers.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet." - }, - "recognizers": { - "type": "array", - "title": "Recognizers", - "description": "List of Recognizers defined for this set.", - "items": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CrossTrainedRecognizerSet" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CurrencyEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Currency entity recognizer", - "description": "Recognizer which recognizes currency.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CurrencyEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DateTimeEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Date and time entity recognizer", - "description": "Recognizer which recognizes dates and time fragments.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DateTimeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DateTimeInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Date/time input dialog", - "description": "Collect information - Ask for date and/ or time", - "type": "object", - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "Default locale.", - "default": "en-us" - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "format": "date-time", - "title": "Default date", - "description": "'Property' will be set to the value or the result of the expression when max turn count is exceeded.", - "examples": [ - "=user.birthday" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "format": "date-time", - "title": "Value", - "description": "'Property' will be set to the value or the result of the expression unless it evaluates to null.", - "examples": [ - "=user.birthday" - ] - }, - "outputFormat": { - "$ref": "#/definitions/expression", - "title": "Output format", - "description": "Expression to use for formatting the output.", - "examples": [ - "=this.value[0].Value" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DateTimeInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DebugBreak": { - "$role": "implements(Microsoft.IDialog)", - "title": "Debugger break", - "description": "If debugger is attached, stop the execution at this point in the conversation.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DebugBreak" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete Activity", - "description": "Delete an activity that was previously sent.", - "type": "object", - "required": [ - "activityId", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "ActivityId", - "description": "expression to an activityId to delete", - "examples": [ - "=$lastActivity" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteProperties": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete Properties", - "description": "Delete multiple properties and any value it holds.", - "type": "object", - "required": [ - "properties", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "properties": { - "type": "array", - "title": "Properties", - "description": "Properties to delete.", - "items": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to delete." - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteProperties" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteProperty": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete property", - "description": "Delete a property and any value it holds.", - "type": "object", - "required": [ - "property", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to delete." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DimensionEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Dimension entity recognizer", - "description": "Recognizer which recognizes dimension.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DimensionEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EditActions": { - "$role": "implements(Microsoft.IDialog)", - "title": "Edit actions.", - "description": "Edit the current list of actions.", - "type": "object", - "required": [ - "changeType", - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "changeType": { - "title": "Type of change", - "description": "Type of change to apply to the current actions.", - "oneOf": [ - { - "type": "string", - "title": "Standard change", - "description": "Standard change types.", - "enum": [ - "insertActions", - "insertActionsBeforeTags", - "appendActions", - "endSequence", - "replaceSequence" - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to apply.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EditActions" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EditArray": { - "$role": "implements(Microsoft.IDialog)", - "title": "Edit array", - "description": "Modify an array in memory", - "type": "object", - "required": [ - "itemsProperty", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "changeType": { - "title": "Type of change", - "description": "Type of change to the array in memory.", - "oneOf": [ - { - "type": "string", - "title": "Change type", - "description": "Standard change type.", - "enum": [ - "push", - "pop", - "take", - "remove", - "clear" - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array to update." - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Result property", - "description": "Property to store the result of this action." - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "milk", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EditArray" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EmailEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Email entity recognizer", - "description": "Recognizer which recognizes email.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EmailEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EmitEvent": { - "$role": "implements(Microsoft.IDialog)", - "title": "Emit a custom event", - "description": "Emit an event. Capture this event with a trigger.", - "type": "object", - "required": [ - "eventName", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "eventName": { - "$role": "expression", - "title": "Event name", - "description": "Name of the event to emit.", - "oneOf": [ - { - "type": "string", - "title": "Built-in event", - "description": "Standard event type.", - "enum": [ - "beginDialog", - "resumeDialog", - "repromptDialog", - "cancelDialog", - "endDialog", - "activityReceived", - "recognizedIntent", - "unknownIntent", - "actionsStarted", - "actionsSaved", - "actionsEnded", - "actionsResumed" - ] - }, - { - "type": "string", - "title": "Custom event", - "description": "Custom event type", - "pattern": "^(?!(beginDialog$|resumeDialog$|repromptDialog$|cancelDialog$|endDialog$|activityReceived$|recognizedIntent$|unknownIntent$|actionsStarted$|actionsSaved$|actionsEnded$|actionsResumed))(\\S){1}.*" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional)." - }, - "bubbleEvent": { - "$ref": "#/definitions/booleanExpression", - "title": "Bubble event", - "description": "If true this event is passed on to parent dialogs." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EmitEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EndDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "End dialog", - "description": "End this dialog.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Result value returned to the parent dialog.", - "examples": [ - "=dialog.userName", - "='tomato'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EndDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EndTurn": { - "$role": "implements(Microsoft.IDialog)", - "title": "End turn", - "description": "End the current turn without ending the dialog.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EndTurn" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.FirstSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "First trigger selector", - "description": "Selector for first true rule", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.FirstSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Foreach": { - "$role": "implements(Microsoft.IDialog)", - "title": "For each item", - "description": "Execute actions on each item in an a collection.", - "type": "object", - "required": [ - "itemsProperty", - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array.", - "examples": [ - "user.todoList" - ] - }, - "index": { - "$ref": "#/definitions/stringExpression", - "title": "Index property", - "description": "Property that holds the index of the item.", - "default": "dialog.foreach.index" - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value property", - "description": "Property that holds the value of the item.", - "default": "dialog.foreach.value" - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute for each item. Use '$foreach.value' to access the value of each item. Use '$foreach.index' to access the index of each item.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Foreach" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ForeachPage": { - "$role": "implements(Microsoft.IDialog)", - "title": "For each page", - "description": "Execute actions on each page (collection of items) in an array.", - "type": "object", - "required": [ - "itemsProperty", - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array.", - "examples": [ - "user.todoList" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute for each page. Use '$foreach.page' to access each page.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "pageIndex": { - "$ref": "#/definitions/stringExpression", - "title": "Index property", - "description": "Property that holds the index of the page.", - "default": "dialog.foreach.pageindex" - }, - "page": { - "$ref": "#/definitions/stringExpression", - "title": "Page property", - "description": "Property that holds the value of the page.", - "default": "dialog.foreach.page" - }, - "pageSize": { - "$ref": "#/definitions/integerExpression", - "title": "Page size", - "description": "Number of items in each page.", - "default": 10 - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ForeachPage" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GetActivityMembers": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get activity members", - "description": "Get the members who are participating in an activity. (BotFrameworkAdapter only)", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "Activity Id", - "description": "Activity ID or expression to an activityId to use to get the members. If none is defined then the current activity id will be used.", - "examples": [ - "$lastActivity" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GetActivityMembers" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GetConversationMembers": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get conversation members", - "description": "Get the members who are participating in an conversation. (BotFrameworkAdapter only)", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GetConversationMembers" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GotoAction": { - "$role": "implements(Microsoft.IDialog)", - "title": "Go to action", - "description": "Go to an an action by id.", - "type": "object", - "required": [ - "actionId", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "actionId": { - "$ref": "#/definitions/stringExpression", - "title": "Action Id", - "description": "Action Id to execute next" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GotoAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GuidEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Guid entity recognizer", - "description": "Recognizer which recognizes guids.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GuidEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.HashtagEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Hashtag entity recognizer", - "description": "Recognizer which recognizes Hashtags.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.HashtagEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.HttpRequest": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "HTTP request", - "description": "Make a HTTP request.", - "required": [ - "url", - "method", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "method": { - "type": "string", - "title": "HTTP method", - "description": "HTTP method to use.", - "enum": [ - "GET", - "POST", - "PATCH", - "PUT", - "DELETE" - ], - "examples": [ - "GET", - "POST" - ] - }, - "url": { - "$ref": "#/definitions/stringExpression", - "title": "Url", - "description": "URL to call (supports data binding).", - "examples": [ - "https://contoso.com" - ] - }, - "body": { - "$ref": "#/definitions/valueExpression", - "title": "Body", - "description": "Body to include in the HTTP call (supports data binding).", - "additionalProperties": true - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Result property", - "description": "A property to store the result of this action. The result can include any of the 4 properties from the HTTP response: statusCode, reasonPhrase, content, and headers. If the content is JSON it will be a deserialized object. The values can be accessed via .content for example.", - "examples": [ - "dialog.contosodata" - ] - }, - "contentType": { - "$ref": "#/definitions/stringExpression", - "title": "Content type", - "description": "Content media type for the body.", - "examples": [ - "application/json", - "text/plain" - ] - }, - "headers": { - "type": "object", - "title": "Headers", - "description": "One or more headers to include in the request (supports data binding).", - "additionalProperties": { - "$ref": "#/definitions/stringExpression" - } - }, - "responseType": { - "$ref": "#/definitions/stringExpression", - "title": "Response type", - "description": "Defines the type of HTTP response. Automatically calls the 'Send a response' action if set to 'Activity' or 'Activities'.", - "oneOf": [ - { - "type": "string", - "title": "Standard response", - "description": "Standard response type.", - "enum": [ - "none", - "json", - "activity", - "activities", - "binary" - ], - "default": "json" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.HttpRequest" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.IActivityTemplate": { - "title": "Microsoft ActivityTemplates", - "description": "Components which are ActivityTemplate, which is string template, an activity, or a implementation of ActivityTemplate", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "required": [ - "type" - ], - "description": "An Activity is the basic communication type for the Bot Framework 3.0 protocol.", - "title": "Activity", - "type": "object", - "properties": { - "type": { - "description": "Contains the activity type. Possible values include: 'message', 'contactRelationUpdate',\n'conversationUpdate', 'typing', 'endOfConversation', 'event', 'invoke', 'deleteUserData',\n'messageUpdate', 'messageDelete', 'installationUpdate', 'messageReaction', 'suggestion',\n'trace', 'handoff'", - "type": "string", - "title": "type" - }, - "id": { - "description": "Contains an ID that uniquely identifies the activity on the channel.", - "type": "string", - "title": "id" - }, - "timestamp": { - "description": "Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.", - "type": "string", - "format": "date-time", - "title": "timestamp" - }, - "localTimestamp": { - "description": "Contains the date and time that the message was sent, in local time, expressed in ISO-8601\nformat.\nFor example, 2016-09-23T13:07:49.4714686-07:00.", - "type": "string", - "format": "date-time", - "title": "localTimestamp" - }, - "localTimezone": { - "description": "Contains the name of the timezone in which the message, in local time, expressed in IANA Time\nZone database format.\nFor example, America/Los_Angeles.", - "type": "string", - "title": "localTimezone" - }, - "serviceUrl": { - "description": "Contains the URL that specifies the channel's service endpoint. Set by the channel.", - "type": "string", - "title": "serviceUrl" - }, - "channelId": { - "description": "Contains an ID that uniquely identifies the channel. Set by the channel.", - "type": "string", - "title": "channelId" - }, - "from": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/membersAdded/items", - "description": "Identifies the sender of the message.", - "title": "from" - }, - "conversation": { - "description": "Identifies the conversation to which the activity belongs.", - "title": "conversation", - "type": "object", - "required": [ - "conversationType", - "id", - "isGroup", - "name" - ], - "properties": { - "isGroup": { - "description": "Indicates whether the conversation contains more than two participants at the time the\nactivity was generated", - "type": "boolean", - "title": "isGroup" - }, - "conversationType": { - "description": "Indicates the type of the conversation in channels that distinguish between conversation types", - "type": "string", - "title": "conversationType" - }, - "id": { - "description": "Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\n123456)", - "type": "string", - "title": "id" - }, - "name": { - "description": "Display friendly name", - "type": "string", - "title": "name" - }, - "aadObjectId": { - "description": "This account's object ID within Azure Active Directory (AAD)", - "type": "string", - "title": "aadObjectId" - }, - "role": { - "description": "Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\n'user', 'bot'", - "enum": [ - "bot", - "user" - ], - "type": "string", - "title": "role" - } - } - }, - "recipient": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/membersAdded/items", - "description": "Identifies the recipient of the message.", - "title": "recipient" - }, - "textFormat": { - "description": "Format of text fields Default:markdown. Possible values include: 'markdown', 'plain', 'xml'", - "type": "string", - "title": "textFormat" - }, - "attachmentLayout": { - "description": "The layout hint for multiple attachments. Default: list. Possible values include: 'list',\n'carousel'", - "type": "string", - "title": "attachmentLayout" - }, - "membersAdded": { - "description": "The collection of members added to the conversation.", - "type": "array", - "title": "membersAdded", - "items": { - "description": "Channel account information needed to route a message", - "title": "ChannelAccount", - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "description": "Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\n123456)", - "type": "string", - "title": "id" - }, - "name": { - "description": "Display friendly name", - "type": "string", - "title": "name" - }, - "aadObjectId": { - "description": "This account's object ID within Azure Active Directory (AAD)", - "type": "string", - "title": "aadObjectId" - }, - "role": { - "description": "Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\n'user', 'bot'", - "type": "string", - "title": "role" - } - } - } - }, - "membersRemoved": { - "description": "The collection of members removed from the conversation.", - "type": "array", - "title": "membersRemoved", - "items": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/membersAdded/items" - } - }, - "reactionsAdded": { - "description": "The collection of reactions added to the conversation.", - "type": "array", - "title": "reactionsAdded", - "items": { - "description": "Message reaction object", - "title": "MessageReaction", - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "description": "Message reaction type. Possible values include: 'like', 'plusOne'", - "type": "string", - "title": "type" - } - } - } - }, - "reactionsRemoved": { - "description": "The collection of reactions removed from the conversation.", - "type": "array", - "title": "reactionsRemoved", - "items": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/reactionsAdded/items" - } - }, - "topicName": { - "description": "The updated topic name of the conversation.", - "type": "string", - "title": "topicName" - }, - "historyDisclosed": { - "description": "Indicates whether the prior history of the channel is disclosed.", - "type": "boolean", - "title": "historyDisclosed" - }, - "locale": { - "description": "A locale name for the contents of the text field.\nThe locale name is a combination of an ISO 639 two- or three-letter culture code associated\nwith a language\nand an ISO 3166 two-letter subculture code associated with a country or region.\nThe locale name can also correspond to a valid BCP-47 language tag.", - "type": "string", - "title": "locale" - }, - "text": { - "description": "The text content of the message.", - "type": "string", - "title": "text" - }, - "speak": { - "description": "The text to speak.", - "type": "string", - "title": "speak" - }, - "inputHint": { - "description": "Indicates whether your bot is accepting,\nexpecting, or ignoring user input after the message is delivered to the client. Possible\nvalues include: 'acceptingInput', 'ignoringInput', 'expectingInput'", - "type": "string", - "title": "inputHint" - }, - "summary": { - "description": "The text to display if the channel cannot render cards.", - "type": "string", - "title": "summary" - }, - "suggestedActions": { - "description": "The suggested actions for the activity.", - "title": "suggestedActions", - "type": "object", - "required": [ - "actions", - "to" - ], - "properties": { - "to": { - "description": "Ids of the recipients that the actions should be shown to. These Ids are relative to the\nchannelId and a subset of all recipients of the activity", - "type": "array", - "title": "to", - "items": { - "title": "Id", - "description": "Id of recipient.", - "type": "string" - } - }, - "actions": { - "description": "Actions that can be shown to the user", - "type": "array", - "title": "actions", - "items": { - "description": "A clickable action", - "title": "CardAction", - "type": "object", - "required": [ - "title", - "type", - "value" - ], - "properties": { - "type": { - "description": "The type of action implemented by this button. Possible values include: 'openUrl', 'imBack',\n'postBack', 'playAudio', 'playVideo', 'showImage', 'downloadFile', 'signin', 'call',\n'payment', 'messageBack'", - "type": "string", - "title": "type" - }, - "title": { - "description": "Text description which appears on the button", - "type": "string", - "title": "title" - }, - "image": { - "description": "Image URL which will appear on the button, next to text label", - "type": "string", - "title": "image" - }, - "text": { - "description": "Text for this action", - "type": "string", - "title": "text" - }, - "displayText": { - "description": "(Optional) text to display in the chat feed if the button is clicked", - "type": "string", - "title": "displayText" - }, - "value": { - "description": "Supplementary parameter for action. Content of this property depends on the ActionType", - "title": "value" - }, - "channelData": { - "description": "Channel-specific data associated with this action", - "title": "channelData" - } - } - } - } - } - }, - "attachments": { - "description": "Attachments", - "type": "array", - "title": "attachments", - "items": { - "description": "An attachment within an activity", - "title": "Attachment", - "type": "object", - "required": [ - "contentType" - ], - "properties": { - "contentType": { - "description": "mimetype/Contenttype for the file", - "type": "string", - "title": "contentType" - }, - "contentUrl": { - "description": "Content Url", - "type": "string", - "title": "contentUrl" - }, - "content": { - "type": "object", - "description": "Embedded content", - "title": "content" - }, - "name": { - "description": "(OPTIONAL) The name of the attachment", - "type": "string", - "title": "name" - }, - "thumbnailUrl": { - "description": "(OPTIONAL) Thumbnail associated with attachment", - "type": "string", - "title": "thumbnailUrl" - } - } - } - }, - "entities": { - "description": "Represents the entities that were mentioned in the message.", - "type": "array", - "title": "entities", - "items": { - "description": "Metadata object pertaining to an activity", - "title": "Entity", - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "description": "Type of this entity (RFC 3987 IRI)", - "type": "string", - "title": "type" - } - } - } - }, - "channelData": { - "description": "Contains channel-specific content.", - "title": "channelData" - }, - "action": { - "description": "Indicates whether the recipient of a contactRelationUpdate was added or removed from the\nsender's contact list.", - "type": "string", - "title": "action" - }, - "replyToId": { - "description": "Contains the ID of the message to which this message is a reply.", - "type": "string", - "title": "replyToId" - }, - "label": { - "description": "A descriptive label for the activity.", - "type": "string", - "title": "label" - }, - "valueType": { - "description": "The type of the activity's value object.", - "type": "string", - "title": "valueType" - }, - "value": { - "description": "A value that is associated with the activity.", - "title": "value" - }, - "name": { - "description": "The name of the operation associated with an invoke or event activity.", - "type": "string", - "title": "name" - }, - "relatesTo": { - "description": "A reference to another conversation or activity.", - "title": "relatesTo", - "type": "object", - "required": [ - "bot", - "channelId", - "conversation", - "serviceUrl" - ], - "properties": { - "activityId": { - "description": "(Optional) ID of the activity to refer to", - "type": "string", - "title": "activityId" - }, - "user": { - "description": "(Optional) User participating in this conversation", - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/membersAdded/items", - "title": "user" - }, - "bot": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/membersAdded/items", - "description": "Bot participating in this conversation", - "title": "bot" - }, - "conversation": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/conversation", - "description": "Conversation reference", - "title": "conversation" - }, - "channelId": { - "description": "Channel ID", - "type": "string", - "title": "channelId" - }, - "serviceUrl": { - "description": "Service endpoint where operations concerning the referenced conversation may be performed", - "type": "string", - "title": "serviceUrl" - } - } - }, - "code": { - "description": "The a code for endOfConversation activities that indicates why the conversation ended.\nPossible values include: 'unknown', 'completedSuccessfully', 'userCancelled', 'botTimedOut',\n'botIssuedInvalidMessage', 'channelFailed'", - "type": "string", - "title": "code" - }, - "expiration": { - "description": "The time at which the activity should be considered to be \"expired\" and should not be\npresented to the recipient.", - "type": "string", - "format": "date-time", - "title": "expiration" - }, - "importance": { - "description": "The importance of the activity. Possible values include: 'low', 'normal', 'high'", - "type": "string", - "title": "importance" - }, - "deliveryMode": { - "description": "A delivery hint to signal to the recipient alternate delivery paths for the activity.\nThe default delivery mode is \"default\". Possible values include: 'normal', 'notification'", - "type": "string", - "title": "deliveryMode" - }, - "listenFor": { - "description": "List of phrases and references that speech and language priming systems should listen for", - "type": "array", - "title": "listenFor", - "items": { - "type": "string", - "title": "Phrase", - "description": "Phrase to listen for." - } - }, - "textHighlights": { - "description": "The collection of text fragments to highlight when the activity contains a ReplyToId value.", - "type": "array", - "title": "textHighlights", - "items": { - "description": "Refers to a substring of content within another field", - "title": "TextHighlight", - "type": "object", - "required": [ - "occurrence", - "text" - ], - "properties": { - "text": { - "description": "Defines the snippet of text to highlight", - "type": "string", - "title": "text" - }, - "occurrence": { - "description": "Occurrence of the text field within the referenced text, if multiple exist.", - "type": "number", - "title": "occurrence" - } - } - } - }, - "semanticAction": { - "description": "An optional programmatic action accompanying this request", - "title": "semanticAction", - "type": "object", - "required": [ - "entities", - "id" - ], - "properties": { - "id": { - "description": "ID of this action", - "type": "string", - "title": "id" - }, - "entities": { - "description": "Entities associated with this action", - "type": "object", - "title": "entities", - "additionalProperties": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1/properties/entities/items" - } - } - } - } - } - }, - { - "$ref": "#/definitions/Microsoft.ActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.StaticActivityTemplate" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.11.0" - } - }, - "Microsoft.IDialog": { - "title": "Microsoft dialogs", - "description": "Components which derive from Dialog", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerDialog" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog" - }, - { - "$ref": "#/definitions/Microsoft.BeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.BeginSkill" - }, - { - "$ref": "#/definitions/Microsoft.BreakLoop" - }, - { - "$ref": "#/definitions/Microsoft.CancelAllDialogs" - }, - { - "$ref": "#/definitions/Microsoft.CancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.ContinueConversationLater" - }, - { - "$ref": "#/definitions/Microsoft.ContinueLoop" - }, - { - "$ref": "#/definitions/Microsoft.DebugBreak" - }, - { - "$ref": "#/definitions/Microsoft.DeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperties" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperty" - }, - { - "$ref": "#/definitions/Microsoft.EditActions" - }, - { - "$ref": "#/definitions/Microsoft.EditArray" - }, - { - "$ref": "#/definitions/Microsoft.EmitEvent" - }, - { - "$ref": "#/definitions/Microsoft.EndDialog" - }, - { - "$ref": "#/definitions/Microsoft.EndTurn" - }, - { - "$ref": "#/definitions/Microsoft.Foreach" - }, - { - "$ref": "#/definitions/Microsoft.ForeachPage" - }, - { - "$ref": "#/definitions/Microsoft.GetActivityMembers" - }, - { - "$ref": "#/definitions/Microsoft.GetConversationMembers" - }, - { - "$ref": "#/definitions/Microsoft.GotoAction" - }, - { - "$ref": "#/definitions/Microsoft.HttpRequest" - }, - { - "$ref": "#/definitions/Microsoft.IfCondition" - }, - { - "$ref": "#/definitions/Microsoft.LogAction" - }, - { - "$ref": "#/definitions/Microsoft.RepeatDialog" - }, - { - "$ref": "#/definitions/Microsoft.ReplaceDialog" - }, - { - "$ref": "#/definitions/Microsoft.SendActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEvent" - }, - { - "$ref": "#/definitions/Microsoft.ThrowException" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.Ask" - }, - { - "$ref": "#/definitions/Microsoft.AttachmentInput" - }, - { - "$ref": "#/definitions/Microsoft.ChoiceInput" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmInput" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeInput" - }, - { - "$ref": "#/definitions/Microsoft.NumberInput" - }, - { - "$ref": "#/definitions/Microsoft.OAuthInput" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.11.0" - } - }, - "Microsoft.IEntityRecognizer": { - "$role": "interface", - "title": "Entity recognizers", - "description": "Components which derive from EntityRecognizer.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.IEntityRecognizer", - "description": "Reference to Microsoft.IEntityRecognizer .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.CurrencyEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DimensionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EmailEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.GuidEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HashtagEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.IpEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" - } - ] - }, - "Microsoft.ILanguageGenerator": { - "title": "Microsoft LanguageGenerator", - "description": "Components which dervie from the LanguageGenerator class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.ResourceMultiLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.TemplateEngineLanguageGenerator" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - } - }, - "Microsoft.IRecognizer": { - "title": "Microsoft recognizer", - "description": "Components which derive from Recognizer class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.LuisRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.CrossTrainedRecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.MultiLanguageRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.RegexRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ChannelMentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.CurrencyEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DimensionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EmailEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.GuidEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HashtagEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.IpEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.11.0" - } - }, - "Microsoft.ITextTemplate": { - "title": "Microsoft TextTemplate", - "description": "Components which derive from TextTemplate class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.TextTemplate" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.11.0" - } - }, - "Microsoft.ITrigger": { - "$role": "interface", - "title": "Microsoft Triggers", - "description": "Components which derive from OnCondition class.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.ITrigger", - "description": "Reference to Microsoft.ITrigger .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.OnActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnAssignEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnBeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnCancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseProperty" - }, - { - "$ref": "#/definitions/Microsoft.OnCondition" - }, - { - "$ref": "#/definitions/Microsoft.OnContinueConversation" - }, - { - "$ref": "#/definitions/Microsoft.OnConversationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnDialogEvent" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfActions" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfConversationActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnError" - }, - { - "$ref": "#/definitions/Microsoft.OnEventActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnInstallationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnInvokeActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageDeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageReactionActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnQnAMatch" - }, - { - "$ref": "#/definitions/Microsoft.OnRepromptDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnTypingActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnUnknownIntent" - } - ] - }, - "Microsoft.ITriggerSelector": { - "$role": "interface", - "title": "Selectors", - "description": "Components which derive from TriggerSelector class.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.ITriggerSelector", - "description": "Reference to Microsoft.ITriggerSelector .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.ConditionalSelector" - }, - { - "$ref": "#/definitions/Microsoft.FirstSelector" - }, - { - "$ref": "#/definitions/Microsoft.MostSpecificSelector" - }, - { - "$ref": "#/definitions/Microsoft.RandomSelector" - }, - { - "$ref": "#/definitions/Microsoft.TrueSelector" - } - ] - }, - "Microsoft.IfCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "If condition", - "description": "Two-way branch the conversation flow based on a condition.", - "type": "object", - "required": [ - "condition", - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression to evaluate.", - "examples": [ - "user.age > 3" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute if condition is true.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "elseActions": { - "type": "array", - "title": "Else", - "description": "Actions to execute if condition is false.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.IfCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.InputDialog": { - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.InputDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.IpEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "IP entity recognizer", - "description": "Recognizer which recognizes internet IP patterns (like 192.1.1.1).", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.IpEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LanguagePolicy": { - "title": "Language policy", - "description": "This represents a policy map for locales lookups to use for language", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": { - "type": "array", - "title": "Per-locale policy", - "description": "Language policy per locale.", - "items": { - "type": "string", - "title": "Locale", - "description": "Locale like en-us." - } - }, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LanguagePolicy" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LogAction": { - "$role": "implements(Microsoft.IDialog)", - "title": "Log to console", - "description": "Log a message to the host application. Send a TraceActivity to Bot Framework Emulator (optional).", - "type": "object", - "required": [ - "text", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "text": { - "$ref": "#/definitions/stringExpression", - "title": "Text", - "description": "Information to log." - }, - "label": { - "$ref": "#/definitions/stringExpression", - "title": "Label", - "description": "Label for the trace activity (used to identify it in a list of trace activities.)" - }, - "traceActivity": { - "$ref": "#/definitions/booleanExpression", - "title": "Send trace activity", - "description": "If true, automatically sends a TraceActivity (view in Bot Framework Emulator)." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LogAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LuisRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "LUIS Recognizer", - "description": "LUIS recognizer.", - "type": "object", - "required": [ - "applicationId", - "endpoint", - "endpointKey", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.AI.Luis", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "applicationId": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS application id", - "description": "Application ID for your model from the LUIS service." - }, - "version": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS version", - "description": "Optional version to target. If null then predictionOptions.Slot is used." - }, - "endpoint": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS endpoint", - "description": "Endpoint to use for LUIS service like https://westus.api.cognitive.microsoft.com." - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS prediction key", - "description": "LUIS prediction key used to call endpoint." - }, - "externalEntityRecognizer": { - "$kind": "Microsoft.IRecognizer", - "title": "External entity recognizer", - "description": "Entities recognized by this recognizer will be passed to LUIS as external entities.", - "$ref": "#/definitions/Microsoft.IRecognizer" - }, - "dynamicLists": { - "$ref": "#/definitions/arrayExpression", - "title": "Dynamic lists", - "description": "Runtime defined entity lists.", - "items": { - "title": "Entity list", - "description": "Lists of canonical values and synonyms for an entity.", - "type": "object", - "properties": { - "entity": { - "title": "Entity", - "description": "Entity to extend with a dynamic list.", - "type": "string" - }, - "list": { - "title": "Dynamic list", - "description": "List of canonical forms and synonyms.", - "type": "array", - "items": { - "type": "object", - "title": "List entry", - "description": "Canonical form and synonynms.", - "properties": { - "canonicalForm": { - "title": "Canonical form", - "description": "Resolution if any synonym matches.", - "type": "string" - }, - "synonyms": { - "title": "Synonyms", - "description": "List of synonyms for a canonical form.", - "type": "array", - "items": { - "title": "Synonym", - "description": "Synonym for canonical form.", - "type": "string" - } - } - } - } - } - } - } - }, - "predictionOptions": { - "type": "object", - "title": "Prediction options", - "description": "Options to control LUIS prediction behavior.", - "properties": { - "includeAllIntents": { - "$ref": "#/definitions/booleanExpression", - "title": "Include all intents", - "description": "True for all intents, false for only top intent." - }, - "includeInstanceData": { - "$ref": "#/definitions/booleanExpression", - "title": "Include $instance", - "description": "True to include $instance metadata in the LUIS response." - }, - "log": { - "$ref": "#/definitions/booleanExpression", - "title": "Log utterances", - "description": "True to log utterances on LUIS service." - }, - "preferExternalEntities": { - "$ref": "#/definitions/booleanExpression", - "title": "Prefer external entities", - "description": "True to prefer external entities to those generated by LUIS models." - }, - "slot": { - "$ref": "#/definitions/stringExpression", - "title": "Slot", - "description": "Slot to use for talking to LUIS service like production or staging." - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LuisRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MentionEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Mentions entity recognizer", - "description": "Recognizer which recognizes @Mentions", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MentionEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MostSpecificSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Most specific trigger selector", - "description": "Select most specific true events with optional additional selector", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "selector": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MostSpecificSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MultiLanguageRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Multi-language recognizer", - "description": "Configure one recognizer per language and the specify the language fallback policy.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "languagePolicy": { - "$kind": "Microsoft.LanguagePolicy", - "type": "object", - "title": "Language policy", - "description": "Defines fall back languages to try per user input language.", - "$ref": "#/definitions/Microsoft.LanguagePolicy" - }, - "recognizers": { - "type": "object", - "title": "Recognizers", - "description": "Map of language -> Recognizer", - "additionalProperties": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MultiLanguageRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Number entity recognizer", - "description": "Recognizer which recognizes numbers.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Number input dialog", - "description": "Collect information - Ask for a number.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/numberExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - 13, - "=user.age" - ] - }, - "value": { - "$ref": "#/definitions/numberExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - 13, - "=user.age" - ] - }, - "outputFormat": { - "$ref": "#/definitions/expression", - "title": "Output format", - "description": "Expression to format the number output.", - "examples": [ - "=this.value", - "=int(this.text)" - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "Default locale to use if there is no locale available..", - "default": "en-us" - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberRangeEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Number range entity recognizer", - "description": "Recognizer which recognizes ranges of numbers (Example:2 to 5).", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberRangeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OAuthInput": { - "$role": "implements(Microsoft.IDialog)", - "title": "OAuthInput Dialog", - "description": "Collect login information.", - "type": "object", - "required": [ - "connectionName", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "Connection name", - "description": "The connection name configured in Azure Web App Bot OAuth settings.", - "examples": [ - "msgraphOAuthConnection" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "text": { - "$ref": "#/definitions/stringExpression", - "title": "Text", - "description": "Text shown in the OAuth signin card.", - "examples": [ - "Please sign in. ", - "=concat(x,y,z)" - ] - }, - "title": { - "$ref": "#/definitions/stringExpression", - "title": "Title", - "description": "Title shown in the OAuth signin card.", - "examples": [ - "Login" - ] - }, - "timeout": { - "$ref": "#/definitions/integerExpression", - "title": "Timeout", - "description": "Time out setting for the OAuth signin card.", - "default": 900000 - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Token property", - "description": "Property to store the OAuth token result.", - "examples": [ - "dialog.token" - ] - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send if user response is invalid.", - "examples": [ - "Sorry, the login info you provided is not valid." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Login failed." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3 - ] - }, - "defaultValue": { - "$ref": "#/definitions/expression", - "title": "Default value", - "description": "Expression to examine on each turn of the conversation as possible value to the property.", - "examples": [ - "@token" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OAuthInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On activity", - "description": "Actions to perform on receipt of a generic activity.", - "type": "object", - "required": [ - "type", - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "type": { - "type": "string", - "title": "Activity type", - "description": "The Activity.Type to match" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnAssignEntity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On entity assignment", - "description": "Actions to take when an entity should be assigned to a property.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "property": { - "type": "string", - "title": "Property", - "description": "Property that will be set after entity is selected." - }, - "entity": { - "type": "string", - "title": "Entity", - "description": "Entity being put into property" - }, - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation for assigning entity." - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnAssignEntity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnBeginDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On begin dialog", - "description": "Actions to perform when this dialog begins.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnBeginDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCancelDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On cancel dialog", - "description": "Actions to perform on cancel dialog event.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnCancelDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseEntity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On choose entity", - "description": "Actions to be performed when an entity value needs to be resolved.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "property": { - "type": "string", - "title": "Property to be set", - "description": "Property that will be set after entity is selected." - }, - "entity": { - "type": "string", - "title": "Ambiguous entity", - "description": "Ambiguous entity" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseEntity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On ambigious intent", - "description": "Actions to perform on when an intent is ambigious.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "intents": { - "type": "array", - "title": "Intents", - "description": "Intents that must be in the ChooseIntent result for this condition to trigger.", - "items": { - "title": "Intent", - "description": "Intent name to trigger on.", - "type": "string" - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseProperty": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On choose property", - "description": "Actions to take when there are multiple possible mappings of entities to properties.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "entity": { - "type": "string", - "title": "Entity being assigned", - "description": "Entity being assigned to property choice" - }, - "properties": { - "type": "array", - "title": "Possible properties", - "description": "Properties to be chosen between.", - "items": { - "type": "string", - "title": "Property name", - "description": "Possible property to choose." - } - }, - "entities": { - "type": "array", - "title": "Entities", - "description": "Ambiguous entity names.", - "items": { - "type": "string", - "title": "Entity name", - "description": "Entity name being chosen between." - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCondition": { - "$role": "implements(Microsoft.ITrigger)", - "title": "On condition", - "description": "Actions to perform when specified condition is true.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnContinueConversation": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On continue conversation", - "description": "Actions to perform when a conversation is started up again from a ContinueConversationLater action.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnContinueConversation" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnConversationUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On ConversationUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'ConversationUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnConversationUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnDialogEvent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On dialog event", - "description": "Actions to perform when a specific dialog event occurs.", - "type": "object", - "required": [ - "actions", - "event", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "event": { - "type": "string", - "title": "Dialog event name", - "description": "Name of dialog event." - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnDialogEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEndOfActions": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On end of actions", - "description": "Actions to take when there are no more actions in the current dialog.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEndOfActions" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEndOfConversationActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On EndOfConversation activity", - "description": "Actions to perform on receipt of an activity with type 'EndOfConversation'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEndOfConversationActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnError": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On error", - "description": "Action to perform when an 'Error' dialog event occurs.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnError" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEventActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Event activity", - "description": "Actions to perform on receipt of an activity with type 'Event'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEventActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnHandoffActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Handoff activity", - "description": "Actions to perform on receipt of an activity with type 'HandOff'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnHandoffActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnInstallationUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On InstallationUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'InstallationUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnInstallationUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On intent recognition", - "description": "Actions to perform when specified intent is recognized.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "intent": { - "type": "string", - "title": "Intent", - "description": "Name of intent." - }, - "entities": { - "type": "array", - "title": "Entities", - "description": "Required entities.", - "items": { - "type": "string", - "title": "Entity", - "description": "Entity that must be present." - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnInvokeActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Invoke activity", - "description": "Actions to perform on receipt of an activity with type 'Invoke'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnInvokeActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Message activity", - "description": "Actions to perform on receipt of an activity with type 'Message'. Overrides Intent trigger.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageDeleteActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageDelete activity", - "description": "Actions to perform on receipt of an activity with type 'MessageDelete'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageDeleteActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageReactionActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageReaction activity", - "description": "Actions to perform on receipt of an activity with type 'MessageReaction'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageReactionActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'MessageUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnQnAMatch": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On QnAMaker match", - "description": "Actions to perform on when an match from QnAMaker is found.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnQnAMatch" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnRepromptDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On RepromptDialog", - "description": "Actions to perform when 'RepromptDialog' event occurs.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnRepromptDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnTypingActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Typing activity", - "description": "Actions to perform on receipt of an activity with type 'Typing'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnTypingActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnUnknownIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On unknown intent", - "description": "Action to perform when user input is unrecognized or if none of the 'on intent recognition' triggers match recognized intent.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnUnknownIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OrdinalEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Ordinal entity recognizer", - "description": "Recognizer which recognizes ordinals (example: first, second, 3rd).", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OrdinalEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.PercentageEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Percentage entity recognizer", - "description": "Recognizer which recognizes percentages.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.PercentageEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.PhoneNumberEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Phone number entity recognizer", - "description": "Recognizer which recognizes phone numbers.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.PhoneNumberEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.QnAMakerDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "QnAMaker dialog", - "description": "Dialog which uses QnAMAker knowledge base to answer questions.", - "type": "object", - "required": [ - "knowledgeBaseId", - "endpointKey", - "hostname", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.AI.QnA", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "knowledgeBaseId": { - "$ref": "#/definitions/stringExpression", - "title": "KnowledgeBase Id", - "description": "KnowledgeBase Id of your QnA Maker KnowledgeBase.", - "default": "=settings.qna.knowledgebaseid" - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "Endpoint key", - "description": "Endpoint key for the QnA Maker KB.", - "default": "=settings.qna.endpointkey" - }, - "hostname": { - "$ref": "#/definitions/stringExpression", - "title": "Hostname", - "description": "Hostname for your QnA Maker service.", - "default": "=settings.qna.hostname", - "examples": [ - "https://yourserver.azurewebsites.net/qnamaker" - ] - }, - "noAnswer": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Fallback answer", - "description": "Default answer to return when none found in KB.", - "default": "Sorry, I did not find an answer.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "threshold": { - "$ref": "#/definitions/numberExpression", - "title": "Threshold", - "description": "Threshold score to filter results.", - "default": 0.3 - }, - "activeLearningCardTitle": { - "$ref": "#/definitions/stringExpression", - "title": "Active learning card title", - "description": "Title for active learning suggestions card.", - "default": "Did you mean:" - }, - "cardNoMatchText": { - "$ref": "#/definitions/stringExpression", - "title": "Card no match text", - "description": "Text for no match option.", - "default": "None of the above." - }, - "cardNoMatchResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Card no match response", - "description": "Custom response when no match option was selected.", - "default": "Thanks for the feedback.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "strictFilters": { - "$ref": "#/definitions/arrayExpression", - "title": "Strict filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filter", - "description": "Metadata filter.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of filter property.", - "maximum": 100 - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to filter on.", - "maximum": 100 - } - } - } - }, - "top": { - "$ref": "#/definitions/numberExpression", - "title": "Top", - "description": "The number of answers you want to retrieve.", - "default": 3 - }, - "isTest": { - "type": "boolean", - "title": "IsTest", - "description": "True, if pointing to Test environment, else false.", - "default": false - }, - "rankerType": { - "$ref": "#/definitions/stringExpression", - "title": "Ranker type", - "description": "Type of Ranker.", - "oneOf": [ - { - "title": "Standard ranker", - "description": "Standard ranker types.", - "enum": [ - "default", - "questionOnly", - "autoSuggestQuestion" - ], - "default": "default" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "strictFiltersJoinOperator": { - "$ref": "#/definitions/stringExpression", - "title": "StrictFiltersJoinOperator", - "description": "Join operator for Strict Filters.", - "oneOf": [ - { - "title": "Join operator", - "description": "Value of Join Operator to be used as conjunction with Strict Filter values.", - "enum": [ - "AND", - "OR" - ], - "default": "AND" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.QnAMakerDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.QnAMakerRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "QnAMaker recognizer", - "description": "Recognizer for generating QnAMatch intents from a KB.", - "type": "object", - "required": [ - "knowledgeBaseId", - "endpointKey", - "hostname", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.AI.QnA", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet." - }, - "knowledgeBaseId": { - "$ref": "#/definitions/stringExpression", - "title": "KnowledgeBase Id", - "description": "Knowledge base Id of your QnA Maker knowledge base.", - "default": "=settings.qna.knowledgebaseid" - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "Endpoint key", - "description": "Endpoint key for the QnA Maker KB.", - "default": "=settings.qna.endpointkey" - }, - "hostname": { - "$ref": "#/definitions/stringExpression", - "title": "Hostname", - "description": "Hostname for your QnA Maker service.", - "default": "=settings.qna.hostname", - "examples": [ - "https://yourserver.azurewebsites.net/qnamaker" - ] - }, - "threshold": { - "$ref": "#/definitions/numberExpression", - "title": "Threshold", - "description": "Threshold score to filter results.", - "default": 0.3 - }, - "strictFilters": { - "$ref": "#/definitions/arrayExpression", - "title": "Strict filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filters", - "description": "Metadata filters to use when querying QnA Maker KB.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name to filter on.", - "maximum": 100 - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to restrict filter.", - "maximum": 100 - } - } - } - }, - "top": { - "$ref": "#/definitions/numberExpression", - "title": "Top", - "description": "The number of answers you want to retrieve.", - "default": 3 - }, - "isTest": { - "$ref": "#/definitions/booleanExpression", - "title": "Use test environment", - "description": "True, if pointing to Test environment, else false.", - "examples": [ - true, - "=f(x)" - ] - }, - "rankerType": { - "title": "Ranker type", - "description": "Type of Ranker.", - "oneOf": [ - { - "type": "string", - "title": "Ranker type", - "description": "Type of Ranker.", - "enum": [ - "default", - "questionOnly", - "autoSuggestQuestion" - ], - "default": "default" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "strictFiltersJoinOperator": { - "$ref": "#/definitions/stringExpression", - "title": "StrictFiltersJoinOperator", - "description": "Join operator for Strict Filters.", - "oneOf": [ - { - "title": "Join operator", - "description": "Value of Join Operator to be used as onjuction with Strict Filter values.", - "enum": [ - "AND", - "OR" - ], - "default": "AND" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "includeDialogNameInMetadata": { - "$ref": "#/definitions/booleanExpression", - "title": "Include dialog name", - "description": "When set to false, the dialog name will not be passed to QnAMaker. (default) is true", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "metadata": { - "$ref": "#/definitions/arrayExpression", - "title": "Metadata filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filter", - "description": "Metadata filter to use when calling the QnA Maker KB.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of value to test." - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to filter against." - } - } - } - }, - "context": { - "$ref": "#/definitions/objectExpression", - "title": "QnA request context", - "description": "Context to use for ranking." - }, - "qnaId": { - "$ref": "#/definitions/integerExpression", - "title": "QnA Id", - "description": "A number or expression which is the QnAId to paass to QnAMaker API." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.QnAMakerRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RandomSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Random rule selector", - "description": "Select most specific true rule.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "seed": { - "type": "integer", - "title": "Random seed", - "description": "Random seed to start random number generation." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RandomSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RecognizerSet": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Recognizer set", - "description": "Creates the union of the intents and entities of the recognizers in the set.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "recognizers": { - "type": "array", - "title": "Recognizers", - "description": "List of Recognizers defined for this set.", - "items": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RecognizerSet" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RegexEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Regex entity recognizer", - "description": "Recognizer which recognizes patterns of input based on regex.", - "type": "object", - "required": [ - "name", - "pattern", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the entity" - }, - "pattern": { - "type": "string", - "title": "Pattern", - "description": "Pattern expressed as regular expression." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RegexEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RegexRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Regex recognizer", - "description": "Use regular expressions to recognize intents and entities from user input.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "intents": { - "type": "array", - "title": "RegEx patterns to intents", - "description": "Collection of patterns to match for an intent.", - "items": { - "type": "object", - "title": "Pattern", - "description": "Intent and regex pattern.", - "properties": { - "intent": { - "type": "string", - "title": "Intent", - "description": "The intent name." - }, - "pattern": { - "type": "string", - "title": "Pattern", - "description": "The regular expression pattern." - } - } - } - }, - "entities": { - "type": "array", - "title": "Entity recognizers", - "description": "Collection of entity recognizers to use.", - "items": { - "$kind": "Microsoft.IEntityRecognizer", - "$ref": "#/definitions/Microsoft.IEntityRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RegexRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RepeatDialog": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Repeat dialog", - "description": "Repeat current dialog.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "allowLoop": { - "$ref": "#/definitions/booleanExpression", - "title": "AllowLoop", - "description": "Optional condition which if true will allow loop of the repeated dialog.", - "examples": [ - "user.age > 3" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for repeating dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RepeatDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ReplaceDialog": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Replace dialog", - "description": "Replace current dialog with another dialog.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "dialog": { - "oneOf": [ - { - "$kind": "Microsoft.IDialog", - "pattern": "^(?!(=)).*", - "title": "Dialog", - "$ref": "#/definitions/Microsoft.IDialog" - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=settings.dialogId" - ] - } - ], - "title": "Dialog name", - "description": "Name of the dialog to call." - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for replacing dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ReplaceDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ResourceMultiLanguageGenerator": { - "$role": "implements(Microsoft.ILanguageGenerator)", - "title": "Resource multi-language generator", - "description": "MultiLanguage Generator which is bound to resource by resource Id.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional generator ID." - }, - "resourceId": { - "type": "string", - "title": "Resource Id", - "description": "Resource which is the root language generator. Other generaters with the same name and language suffix will be loaded into this generator and used based on the Language Policy.", - "default": "dialog.result" - }, - "languagePolicy": { - "type": "object", - "title": "Language policy", - "description": "Set alternate language policy for this generator. If not set, the global language policy will be used." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ResourceMultiLanguageGenerator" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SendActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send an activity", - "description": "Respond with an activity.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action." - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SendActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SetProperties": { - "$role": "implements(Microsoft.IDialog)", - "title": "Set property", - "description": "Set one or more property values.", - "type": "object", - "required": [ - "assignments", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "assignments": { - "type": "array", - "title": "Assignments", - "description": "Property value assignments to set.", - "items": { - "type": "object", - "title": "Assignment", - "description": "Property assignment.", - "properties": { - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "='milk'", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - } - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SetProperties" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SetProperty": { - "$role": "implements(Microsoft.IDialog)", - "title": "Set property", - "description": "Set property to a value.", - "type": "object", - "required": [ - "property", - "value", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "='milk'", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SetProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SignOutUser": { - "$role": "implements(Microsoft.IDialog)", - "title": "Sign out user", - "description": "Sign a user out that was logged in previously using OAuthInput.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "userId": { - "$ref": "#/definitions/stringExpression", - "title": "UserId", - "description": "Expression to an user to signout. Default is user.id.", - "default": "=user.id" - }, - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "Connection name", - "description": "Connection name that was used with OAuthInput to log a user in." - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SignOutUser" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.StaticActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft static activity template", - "description": "This allows you to define a static Activity object", - "type": "object", - "required": [ - "activity", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "activity": { - "$ref": "#/definitions/Microsoft.IActivityTemplate/oneOf/1", - "title": "Activity", - "description": "A static Activity to used.", - "required": [ - "type" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.StaticActivityTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SwitchCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "Switch condition", - "description": "Execute different actions based on the value of a property.", - "type": "object", - "required": [ - "condition", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "condition": { - "$ref": "#/definitions/stringExpression", - "title": "Condition", - "description": "Property to evaluate.", - "examples": [ - "user.favColor" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "cases": { - "type": "array", - "title": "Cases", - "description": "Actions for each possible condition.", - "items": { - "type": "object", - "title": "Case", - "description": "Case and actions.", - "required": [ - "value", - "actions" - ], - "properties": { - "value": { - "type": [ - "number", - "integer", - "boolean", - "string" - ], - "title": "Value", - "description": "The value to compare the condition with.", - "examples": [ - "red", - "true", - "13" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - } - } - } - }, - "default": { - "type": "array", - "title": "Default", - "description": "Actions to execute if none of the cases meet the condition.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SwitchCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TelemetryTrackEvent": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Telemetry - track event", - "description": "Track a custom event using the registered Telemetry Client.", - "required": [ - "url", - "method", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event name", - "description": "The name of the event to track.", - "examples": [ - "MyEventStarted", - "MyEventCompleted" - ] - }, - "properties": { - "type": "object", - "title": "Properties", - "description": "One or more properties to attach to the event being tracked.", - "additionalProperties": { - "$ref": "#/definitions/stringExpression" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TelemetryTrackEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TemperatureEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Temperature recognizer", - "description": "Recognizer which recognizes temperatures.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TemperatureEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TemplateEngineLanguageGenerator": { - "$role": "implements(Microsoft.ILanguageGenerator)", - "title": "Template multi-language generator", - "description": "Template Generator which allows only inline evaluation of templates.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional generator ID." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TemplateEngineLanguageGenerator" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TextInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "type": "object", - "title": "Text input dialog", - "description": "Collection information - Ask for a word or sentence.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "outputFormat": { - "$ref": "#/definitions/stringExpression", - "title": "Output format", - "description": "Expression to format the output.", - "examples": [ - "=toUpper(this.value)", - "${toUpper(this.value)}" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TextInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TextTemplate": { - "$role": "implements(Microsoft.ITextTemplate)", - "title": "Microsoft TextTemplate", - "description": "Use LG Templates to create text", - "type": "object", - "required": [ - "template", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "template": { - "title": "Template", - "description": "Language Generator template to evaluate to create the text.", - "type": "string" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TextTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ThrowException": { - "$role": "implements(Microsoft.IDialog)", - "title": "Throw an exception", - "description": "Throw an exception. Capture this exception with OnError trigger.", - "type": "object", - "required": [ - "errorValue", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "errorValue": { - "$ref": "#/definitions/valueExpression", - "title": "Error value", - "description": "Error value to throw." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ThrowException" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TraceActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send a TraceActivity", - "description": "Send a trace activity to the transcript logger and/ or Bot Framework Emulator.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "name": { - "$ref": "#/definitions/stringExpression", - "title": "Name", - "description": "Name of the trace activity" - }, - "label": { - "$ref": "#/definitions/stringExpression", - "title": "Label", - "description": "Label for the trace activity (used to identify it in a list of trace activities.)" - }, - "valueType": { - "$ref": "#/definitions/stringExpression", - "title": "Value type", - "description": "Type of value" - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Property that holds the value to send as trace activity." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TraceActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TrueSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "True trigger selector", - "description": "Selector for all true events", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TrueSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UpdateActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Update an activity", - "description": "Respond with an activity.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "Activity Id", - "description": "An string expression with the activity id to update.", - "examples": [ - "=dialog.lastActivityId" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.UpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UrlEntityRecognizer": { - "$role": [ - "implements(Microsoft.IRecognizer)", - "implements(Microsoft.IEntityRecognizer)" - ], - "title": "Url recognizer", - "description": "Recognizer which recognizes urls.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.11.0" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.UrlEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "arrayExpression": { - "$role": "expression", - "title": "Array or expression", - "description": "Array or expression to evaluate.", - "oneOf": [ - { - "type": "array", - "title": "Array", - "description": "Array constant." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "booleanExpression": { - "$role": "expression", - "title": "Boolean or expression", - "description": "Boolean constant or expression to evaluate.", - "oneOf": [ - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean constant.", - "default": false, - "examples": [ - false - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=user.isVip" - ] - } - ] - }, - "component": { - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "condition": { - "$role": "expression", - "title": "Boolean condition", - "description": "Boolean constant or expression to evaluate.", - "oneOf": [ - { - "$ref": "#/definitions/expression" - }, - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean value.", - "default": true, - "examples": [ - false - ] - } - ] - }, - "equalsExpression": { - "$role": "expression", - "type": "string", - "title": "Expression", - "description": "Expression starting with =.", - "pattern": "^=.*\\S.*", - "examples": [ - "=user.name" - ] - }, - "expression": { - "$role": "expression", - "type": "string", - "title": "Expression", - "description": "Expression to evaluate.", - "pattern": "^.*\\S.*", - "examples": [ - "user.age > 13" - ] - }, - "integerExpression": { - "$role": "expression", - "title": "Integer or expression", - "description": "Integer constant or expression to evaluate.", - "oneOf": [ - { - "type": "integer", - "title": "Integer", - "description": "Integer constant.", - "default": 0, - "examples": [ - 15 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=user.age" - ] - } - ] - }, - "numberExpression": { - "$role": "expression", - "title": "Number or expression", - "description": "Number constant or expression to evaluate.", - "oneOf": [ - { - "type": "number", - "title": "Number", - "description": "Number constant.", - "default": 0, - "examples": [ - 15.5 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=dialog.quantity" - ] - } - ] - }, - "objectExpression": { - "$role": "expression", - "title": "Object or expression", - "description": "Object or expression to evaluate.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Object constant." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "role": { - "title": "$role", - "description": "Defines the role played in the dialog schema from [expression|interface|implements($kind)|extends($kind)].", - "type": "string", - "pattern": "^((expression)|(interface)|(implements\\([a-zA-Z][a-zA-Z0-9.]*\\))|(extends\\([a-zA-Z][a-zA-Z0-9.]*\\)))$" - }, - "stringExpression": { - "$role": "expression", - "title": "String or expression", - "description": "Interpolated string or expression to evaluate.", - "oneOf": [ - { - "type": "string", - "title": "String", - "description": "Interpolated string", - "pattern": "^(?!(=)).*", - "examples": [ - "Hello ${user.name}" - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=concat('x','y','z')" - ] - } - ] - }, - "valueExpression": { - "$role": "expression", - "title": "Any or expression", - "description": "Any constant or expression to evaluate.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Object constant." - }, - { - "type": "array", - "title": "Array", - "description": "Array constant." - }, - { - "type": "string", - "title": "String", - "description": "Interpolated string.", - "pattern": "^(?!(=)).*", - "examples": [ - "Hello ${user.name}" - ] - }, - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean constant", - "examples": [ - false - ] - }, - { - "type": "number", - "title": "Number", - "description": "Number constant.", - "examples": [ - 15.5 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=..." - ] - } - ] - } - } -} +{} \ No newline at end of file diff --git a/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.uischema b/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.uischema index 48d8d8b8f2..9e26dfeeb6 100644 --- a/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.uischema +++ b/generators/generator-bot-adaptive/generators/app/templates/assets/schemas/sdk.uischema @@ -1,781 +1 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", - "Microsoft.AdaptiveDialog": { - "form": { - "description": "This configures a data driven dialog via a collection of events and actions.", - "helpLink": "https://aka.ms/bf-composer-docs-dialog", - "hidden": [ - "triggers", - "generator", - "selector", - "schema" - ], - "label": "Adaptive dialog", - "order": [ - "recognizer", - "*" - ], - "properties": { - "recognizer": { - "description": "To understand what the user says, your dialog needs a \"Recognizer\"; that includes example words and sentences that users may use.", - "label": "Language Understanding" - } - } - } - }, - "Microsoft.BeginDialog": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Begin a new dialog", - "order": [ - "dialog", - "options", - "resultProperty", - "*" - ], - "properties": { - "resultProperty": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Begin Dialog" - } - }, - "Microsoft.BeginSkill": { - "form": { - "helpLink": "https://aka.ms/bf-composer-docs-connect-skill", - "label": "Connect to a skill", - "properties": { - "resultProperty": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Skill Dialog" - } - }, - "Microsoft.BreakLoop": { - "form": { - "label": "Break out of loop", - "subtitle": "Break out of loop" - } - }, - "Microsoft.CancelAllDialogs": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Cancel all active dialogs", - "subtitle": "Cancel All Dialogs" - } - }, - "Microsoft.ContinueLoop": { - "form": { - "label": "Continue loop", - "subtitle": "Continue loop" - } - }, - "Microsoft.DebugBreak": { - "form": { - "label": "Debug Break" - } - }, - "Microsoft.DeleteProperties": { - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete properties", - "properties": { - "properties": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Properties" - } - }, - "Microsoft.DeleteProperty": { - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete a property", - "properties": { - "property": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Property" - } - }, - "Microsoft.EditActions": { - "form": { - "label": "Modify active dialog", - "subtitle": "Edit Actions" - } - }, - "Microsoft.EditArray": { - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Edit an array property", - "properties": { - "itemsProperty": { - "intellisenseScopes": [ - "user-variables" - ] - }, - "resultProperty": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Edit Array" - } - }, - "Microsoft.EmitEvent": { - "form": { - "helpLink": "https://aka.ms/bfc-custom-events", - "label": "Emit a custom event", - "subtitle": "Emit Event" - } - }, - "Microsoft.EndDialog": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "End this dialog", - "subtitle": "End Dialog" - } - }, - "Microsoft.EndTurn": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "End turn", - "subtitle": "End Turn" - } - }, - "Microsoft.Foreach": { - "form": { - "helpLink": "https://aka.ms/bfc-controlling-conversation-flow", - "hidden": [ - "actions" - ], - "label": "Loop: For each item", - "order": [ - "itemsProperty", - "*" - ], - "properties": { - "index": { - "intellisenseScopes": [ - "variable-scopes" - ] - }, - "itemsProperty": { - "intellisenseScopes": [ - "user-variables" - ] - }, - "value": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "For Each" - } - }, - "Microsoft.ForeachPage": { - "form": { - "helpLink": "https://aka.ms/bfc-controlling-conversation-flow", - "hidden": [ - "actions" - ], - "label": "Loop: For each page (multiple items)", - "order": [ - "itemsProperty", - "pageSize", - "*" - ], - "properties": { - "itemsProperty": { - "intellisenseScopes": [ - "user-variables" - ] - }, - "page": { - "intellisenseScopes": [ - "variable-scopes" - ] - }, - "pageIndex": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "For Each Page" - } - }, - "Microsoft.HttpRequest": { - "form": { - "helpLink": "https://aka.ms/bfc-using-http", - "label": "Send an HTTP request", - "order": [ - "method", - "url", - "body", - "headers", - "*" - ], - "properties": { - "resultProperty": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "HTTP Request" - } - }, - "Microsoft.IfCondition": { - "form": { - "helpLink": "https://aka.ms/bfc-controlling-conversation-flow", - "hidden": [ - "actions", - "elseActions" - ], - "label": "Branch: If/Else", - "subtitle": "If Condition" - } - }, - "Microsoft.LogAction": { - "form": { - "helpLink": "https://aka.ms/composer-telemetry", - "label": "Log to console", - "subtitle": "Log Action" - } - }, - "Microsoft.RepeatDialog": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Repeat this dialog", - "order": [ - "options", - "*" - ], - "subtitle": "Repeat Dialog" - } - }, - "Microsoft.ReplaceDialog": { - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Replace this dialog", - "order": [ - "dialog", - "options", - "*" - ], - "subtitle": "Replace Dialog" - } - }, - "Microsoft.SendActivity": { - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response", - "order": [ - "activity", - "*" - ], - "subtitle": "Send Activity" - } - }, - "Microsoft.SetProperties": { - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Set properties", - "properties": { - "assignments": { - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - } - } - }, - "subtitle": "Set Properties" - } - }, - "Microsoft.SetProperty": { - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Set a property", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Set Property" - } - }, - "Microsoft.SignOutUser": { - "form": { - "label": "Sign out user", - "subtitle": "Signout User" - } - }, - "Microsoft.SwitchCondition": { - "form": { - "helpLink": "https://aka.ms/bfc-controlling-conversation-flow", - "hidden": [ - "default" - ], - "label": "Branch: Switch (multiple options)", - "properties": { - "cases": { - "hidden": [ - "actions" - ] - }, - "condition": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Switch Condition" - } - }, - "Microsoft.ThrowException": { - "form": { - "label": "Throw an exception", - "subtitle": "Throw an exception" - } - }, - "Microsoft.TraceActivity": { - "form": { - "helpLink": "https://aka.ms/composer-telemetry", - "label": "Emit a trace event", - "subtitle": "Trace Activity" - } - }, - "Microsoft.Ask": { - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response to ask a question", - "order": [ - "activity", - "*" - ], - "subtitle": "Ask Activity" - } - }, - "Microsoft.AttachmentInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for a file or an attachment", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Attachment Input" - } - }, - "Microsoft.ChoiceInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt with multi-choice", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Choice Input" - } - }, - "Microsoft.ConfirmInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for confirmation", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Confirm Input" - } - }, - "Microsoft.DateTimeInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for a date or a time", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Date Time Input" - } - }, - "Microsoft.NumberInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for a number", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Number Input" - } - }, - "Microsoft.OAuthInput": { - "form": { - "helpLink": "https://aka.ms/bfc-using-oauth", - "label": "OAuth login", - "order": [ - "connectionName", - "*" - ], - "subtitle": "OAuth Input" - } - }, - "Microsoft.TextInput": { - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for text", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Text Input" - } - }, - "Microsoft.RegexRecognizer": { - "form": { - "hidden": [ - "entities" - ] - } - }, - "Microsoft.OnActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Activities", - "order": [ - "condition", - "*" - ], - "subtitle": "Activity received" - } - }, - "Microsoft.OnAssignEntity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handle a condition when an entity is assigned", - "order": [ - "condition", - "*" - ], - "subtitle": "EntityAssigned activity" - } - }, - "Microsoft.OnBeginDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog started", - "order": [ - "condition", - "*" - ], - "subtitle": "Begin dialog event" - } - }, - "Microsoft.OnCancelDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog cancelled", - "order": [ - "condition", - "*" - ], - "subtitle": "Cancel dialog event" - } - }, - "Microsoft.OnChooseIntent": { - "form": { - "hidden": [ - "actions" - ], - "order": [ - "condition", - "*" - ] - } - }, - "Microsoft.OnCondition": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handle a condition", - "order": [ - "condition", - "*" - ], - "subtitle": "Condition" - } - }, - "Microsoft.OnConversationUpdateActivity": { - "form": { - "description": "Handle the events fired when a user begins a new conversation with the bot.", - "helpLink": "https://aka.ms/bf-composer-docs-conversation-update-activity", - "hidden": [ - "actions" - ], - "label": "Greeting", - "order": [ - "condition", - "*" - ], - "subtitle": "ConversationUpdate activity" - } - }, - "Microsoft.OnDialogEvent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog events", - "order": [ - "condition", - "*" - ], - "subtitle": "Dialog event" - } - }, - "Microsoft.OnEndOfActions": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handle a condition when actions have ended", - "order": [ - "condition", - "*" - ], - "subtitle": "EndOfActions activity" - } - }, - "Microsoft.OnEndOfConversationActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Conversation ended", - "order": [ - "condition", - "*" - ], - "subtitle": "EndOfConversation activity" - } - }, - "Microsoft.OnError": { - "form": { - "hidden": [ - "actions" - ], - "label": "Error occurred", - "order": [ - "condition", - "*" - ], - "subtitle": "Error event" - } - }, - "Microsoft.OnEventActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Event received", - "order": [ - "condition", - "*" - ], - "subtitle": "Event activity" - } - }, - "Microsoft.OnHandoffActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handover to human", - "order": [ - "condition", - "*" - ], - "subtitle": "Handoff activity" - } - }, - "Microsoft.OnInstallationUpdateActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Installation updated", - "order": [ - "condition", - "*" - ], - "subtitle": "Installation updated activity" - } - }, - "Microsoft.OnIntent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Intent recognized", - "order": [ - "intent", - "condition", - "entities", - "*" - ], - "subtitle": "Intent recognized" - } - }, - "Microsoft.OnInvokeActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Conversation invoked", - "order": [ - "condition", - "*" - ], - "subtitle": "Invoke activity" - } - }, - "Microsoft.OnMessageActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message received", - "order": [ - "condition", - "*" - ], - "subtitle": "Message received activity" - } - }, - "Microsoft.OnMessageDeleteActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message deleted", - "order": [ - "condition", - "*" - ], - "subtitle": "Message deleted activity" - } - }, - "Microsoft.OnMessageReactionActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message reaction", - "order": [ - "condition", - "*" - ], - "subtitle": "Message reaction activity" - } - }, - "Microsoft.OnMessageUpdateActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message updated", - "order": [ - "condition", - "*" - ], - "subtitle": "Message updated activity" - } - }, - "Microsoft.OnRepromptDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Re-prompt for input", - "order": [ - "condition", - "*" - ], - "subtitle": "Reprompt dialog event" - } - }, - "Microsoft.OnTypingActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "User is typing", - "order": [ - "condition", - "*" - ], - "subtitle": "Typing activity" - } - }, - "Microsoft.OnUnknownIntent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Unknown intent", - "order": [ - "condition", - "*" - ], - "subtitle": "Unknown intent recognized" - } - } -} +{} \ No newline at end of file diff --git a/generators/generator-bot-adaptive/package.json b/generators/generator-bot-adaptive/package.json index 98ca42a60a..2784cd4e9f 100644 --- a/generators/generator-bot-adaptive/package.json +++ b/generators/generator-bot-adaptive/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-adaptive", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating a base bot built on the Azure Bot Framework and the Adaptive stack.", "keywords": [ "microsoft", diff --git a/generators/generator-bot-adaptive/platforms.js b/generators/generator-bot-adaptive/platforms.js index 621dd9b47a..cccd893509 100644 --- a/generators/generator-bot-adaptive/platforms.js +++ b/generators/generator-bot-adaptive/platforms.js @@ -3,12 +3,12 @@ const dotnet = { name: 'dotnet', - defaultSdkVersion: '4.13.2', + defaultSdkVersion: '4.14.1', }; const js = { name: 'js', - defaultSdkVersion: '4.13.4-preview', + defaultSdkVersion: '4.14.0-preview', }; module.exports = { dotnet, js }; diff --git a/generators/generator-bot-adaptive/test/dotnet-functions.test.js b/generators/generator-bot-adaptive/test/dotnet-functions.test.js index 04cb7cd664..dc96e8c34c 100644 --- a/generators/generator-bot-adaptive/test/dotnet-functions.test.js +++ b/generators/generator-bot-adaptive/test/dotnet-functions.test.js @@ -125,7 +125,7 @@ describe(`generator-bot-adaptive --platform ${platform} --integration ${integrat { botName, packageReferences: '', - sdkVersion: '4.13.2', + sdkVersion: '4.14.1', } ); diff --git a/generators/generator-bot-adaptive/test/dotnet-webapp.test.js b/generators/generator-bot-adaptive/test/dotnet-webapp.test.js index b3a99461ab..21c2576efa 100644 --- a/generators/generator-bot-adaptive/test/dotnet-webapp.test.js +++ b/generators/generator-bot-adaptive/test/dotnet-webapp.test.js @@ -106,7 +106,7 @@ describe(`generator-bot-adaptive --platform ${platform} --integration ${integrat { botName, packageReferences: '', - sdkVersion: '4.13.2', + sdkVersion: '4.14.1', } ); diff --git a/generators/generator-bot-adaptive/test/js-functions.test.js b/generators/generator-bot-adaptive/test/js-functions.test.js index c3c990981a..c22b1be238 100644 --- a/generators/generator-bot-adaptive/test/js-functions.test.js +++ b/generators/generator-bot-adaptive/test/js-functions.test.js @@ -107,10 +107,10 @@ describe(`generator-bot-adaptive --platform ${platform} --integration ${integrat }, dependencies: { 'cross-env': 'latest', - 'botbuilder-ai-luis': '4.13.4-preview', - 'botbuilder-ai-qna': '4.13.4-preview', + 'botbuilder-ai-luis': '4.14.0-preview', + 'botbuilder-ai-qna': '4.14.0-preview', 'botbuilder-dialogs-adaptive-runtime-integration-azure-functions': - '4.13.4-preview', + '4.14.0-preview', }, }; diff --git a/generators/generator-bot-adaptive/test/js-webapp.test.js b/generators/generator-bot-adaptive/test/js-webapp.test.js index 2028572509..d76e3995cd 100644 --- a/generators/generator-bot-adaptive/test/js-webapp.test.js +++ b/generators/generator-bot-adaptive/test/js-webapp.test.js @@ -86,10 +86,10 @@ describe(`generator-bot-adaptive --platform ${platform} --integration ${integrat }, dependencies: { 'cross-env': 'latest', - 'botbuilder-ai-luis': '4.13.4-preview', - 'botbuilder-ai-qna': '4.13.4-preview', + 'botbuilder-ai-luis': '4.14.0-preview', + 'botbuilder-ai-qna': '4.14.0-preview', 'botbuilder-dialogs-adaptive-runtime-integration-express': - '4.13.4-preview', + '4.14.0-preview', }, }; diff --git a/generators/generator-bot-core-assistant/README.md b/generators/generator-bot-core-assistant/README.md index c8164eb085..fa9b311d1e 100644 --- a/generators/generator-bot-core-assistant/README.md +++ b/generators/generator-bot-core-assistant/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-core-assistant [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-core-assistant [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-assistant.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-core-assistant) A bot with Azure Language Understanding (LUIS) and common trigger phrases used to direct the conversation flow and help customers accomplish basic tasks. @@ -20,7 +20,7 @@ A bot with Azure Language Understanding (LUIS) and common trigger phrases used t ### Required Azure resources -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice - [Azure QnA Maker](https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview) - A storage solution for persistent state storage like Azure Cosmos DB @@ -31,7 +31,3 @@ A bot with Azure Language Understanding (LUIS) and common trigger phrases used t ### License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-assistant.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-core-assistant \ No newline at end of file diff --git a/generators/generator-bot-core-assistant/generators/app/index.js b/generators/generator-bot-core-assistant/generators/app/index.js index b19b308c8c..ff274836a0 100644 --- a/generators/generator-bot-core-assistant/generators/app/index.js +++ b/generators/generator-bot-core-assistant/generators/app/index.js @@ -12,7 +12,7 @@ const packageReferences = { [platforms.dotnet.name]: [ { name: 'Microsoft.Bot.Components.HelpAndCancel', - version: '1.0.0', + version: '1.1.1', }, ], [platforms.js.name]: [ diff --git a/generators/generator-bot-core-assistant/package.json b/generators/generator-bot-core-assistant/package.json index 22944a9a4b..285a059819 100644 --- a/generators/generator-bot-core-assistant/package.json +++ b/generators/generator-bot-core-assistant/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-core-assistant", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating an assistant-style bot with NLP built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -24,7 +24,7 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-core-language/README.md b/generators/generator-bot-core-language/README.md index ec96ca5fd3..3ab1cba06b 100644 --- a/generators/generator-bot-core-language/README.md +++ b/generators/generator-bot-core-language/README.md @@ -1,10 +1,10 @@ -# @microsoft/generator-bot-core-language [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-core-language [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-language.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-core-language) A simple bot with Azure Language Understanding (LUIS) and common trigger phrases used to direct the conversation flow. ### Recommended use -- Create a simple conversational bot with Azure Language Understanding ([LUIS][luis]) +- Create a simple conversational bot with Azure Language Understanding ([LUIS](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis)) - Customize and extend example dialogs, bot logic, language understanding and bot responses - Extend your bot with [Azure Bot Framework components](https://aka.ms/ComponentTemplateDocumentation) @@ -14,11 +14,11 @@ A simple bot with Azure Language Understanding (LUIS) and common trigger phrases - Asking for help - Responding to unknown language requests (unknown intents) - Cancelling a dialog -- Use Azure Language Understanding Service (LUIS) for natural language processing +- Use Azure Language Understanding Service ([LUIS](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis)) for natural language processing ### Required Azure resources -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice - A storage solution for persistent state storage like Azure Cosmos DB ### Supported languages @@ -28,7 +28,3 @@ A simple bot with Azure Language Understanding (LUIS) and common trigger phrases ### License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-language.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-core-language diff --git a/generators/generator-bot-core-language/generators/app/index.js b/generators/generator-bot-core-language/generators/app/index.js index e831c00de2..e231c8f3d6 100644 --- a/generators/generator-bot-core-language/generators/app/index.js +++ b/generators/generator-bot-core-language/generators/app/index.js @@ -12,11 +12,11 @@ const packageReferences = { [platforms.dotnet.name]: [ { name: 'Microsoft.Bot.Components.HelpAndCancel', - version: '1.0.0', + version: '1.1.1', }, { name: 'Microsoft.Bot.Components.Welcome', - version: '1.0.0', + version: '1.1.1', }, ], [platforms.js.name]: [ diff --git a/generators/generator-bot-core-language/package.json b/generators/generator-bot-core-language/package.json index 5cecb71f13..463947c559 100644 --- a/generators/generator-bot-core-language/package.json +++ b/generators/generator-bot-core-language/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-core-language", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating a simple conversational bot with NLP built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -26,7 +26,7 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-core-qna/README.md b/generators/generator-bot-core-qna/README.md index 5dd28d5854..3af6b3ed55 100644 --- a/generators/generator-bot-core-qna/README.md +++ b/generators/generator-bot-core-qna/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-core-qna [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-core-qna [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-qna.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-core-qna) A simple question-and-answer bot with Azure QnA Maker. @@ -14,7 +14,7 @@ A simple question-and-answer bot with Azure QnA Maker. ### Required Azure resources -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice - [Azure QnA Maker](https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview) ### Supported languages @@ -24,7 +24,3 @@ A simple question-and-answer bot with Azure QnA Maker. ### License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-core-qna.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-core-qna diff --git a/generators/generator-bot-core-qna/package.json b/generators/generator-bot-core-qna/package.json index 9692356e3e..2e0ff125cb 100644 --- a/generators/generator-bot-core-qna/package.json +++ b/generators/generator-bot-core-qna/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-core-qna", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating a bot and connecting to a QnA Maker knowledge base.", "keywords": [ "microsoft", @@ -23,7 +23,7 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-empty/README.md b/generators/generator-bot-empty/README.md index 1d70a2c074..69459c6934 100644 --- a/generators/generator-bot-empty/README.md +++ b/generators/generator-bot-empty/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-empty [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-empty [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-empty.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-empty) A simple bot with a root dialog and greeting dialog. @@ -22,7 +22,3 @@ A simple bot with a root dialog and greeting dialog. ### License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-empty.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-empty diff --git a/generators/generator-bot-empty/package.json b/generators/generator-bot-empty/package.json index a4cdb7f0ff..645fa1f905 100644 --- a/generators/generator-bot-empty/package.json +++ b/generators/generator-bot-empty/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-empty", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating an empty bot built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -26,7 +26,7 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-enterprise-assistant/README.md b/generators/generator-bot-enterprise-assistant/README.md index 4623bca93d..22ef0d379d 100644 --- a/generators/generator-bot-enterprise-assistant/README.md +++ b/generators/generator-bot-enterprise-assistant/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-enterprise-assistant [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-enterprise-assistant [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-assistant.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-assistant) A bot with Azure Language Understanding (LUIS), Enterprise Calendar skill, Enterprise People skill and common trigger phrases used to direct the conversation flow to help customers accomplish common business tasks. [Learn more](https://aka.ms/EnterpriseAssistant) @@ -39,7 +39,7 @@ The Enterprise Assistant Bot uses packages to extend its capabilities. [Learn mo - People.Read.All - User.ReadBasic.All - User.Read.All -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice - [Azure QnA Maker](https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview) - A storage solution for persistent state storage like Azure Cosmos DB @@ -51,6 +51,3 @@ The Enterprise Assistant Bot uses packages to extend its capabilities. [Learn mo [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-assistant.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-assistant diff --git a/generators/generator-bot-enterprise-assistant/generators/app/index.js b/generators/generator-bot-enterprise-assistant/generators/app/index.js index 33ed5d2b6f..2a3d3e28b8 100644 --- a/generators/generator-bot-enterprise-assistant/generators/app/index.js +++ b/generators/generator-bot-enterprise-assistant/generators/app/index.js @@ -36,7 +36,7 @@ module.exports = class extends BaseGenerator { { isPlugin: true, name: 'Microsoft.Bot.Builder.AI.Orchestrator', - version: '4.13.2', + version: '4.14.1', }, ], modifyApplicationSettings: (appSettings) => { diff --git a/generators/generator-bot-enterprise-assistant/package.json b/generators/generator-bot-enterprise-assistant/package.json index c7f51f4dc0..8b538a0e6e 100644 --- a/generators/generator-bot-enterprise-assistant/package.json +++ b/generators/generator-bot-enterprise-assistant/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-enterprise-assistant", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating an enterprise assistant, with a root bot and two skills built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -25,9 +25,9 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", - "@microsoft/generator-bot-enterprise-calendar": "workspace:^1.0.0", - "@microsoft/generator-bot-enterprise-people": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", + "@microsoft/generator-bot-enterprise-calendar": "workspace:^1.1.1", + "@microsoft/generator-bot-enterprise-people": "workspace:^1.1.1", "uuid": "^8.3.2", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" diff --git a/generators/generator-bot-enterprise-calendar/README.md b/generators/generator-bot-enterprise-calendar/README.md index b6b5581863..d87120e963 100644 --- a/generators/generator-bot-enterprise-calendar/README.md +++ b/generators/generator-bot-enterprise-calendar/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-enterprise-calendar [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-enterprise-calendar [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-calendar.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-calendar) This bot project was created using the [Enterprise Calendar Bot](https://aka.ms/EnterpriseCalendarBot) template. You **must complete the configuration steps outlined below for your bot to function.** @@ -24,7 +24,7 @@ The Enterprise Calendar Bot uses packages to extend its capabilities. [Learn mor - Contacts.Read - People.Read - User.ReadBasic.All -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice ### Supported languages @@ -33,7 +33,3 @@ The Enterprise Calendar Bot uses packages to extend its capabilities. [Learn mor ### License [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) - -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-calendar.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-calendar diff --git a/generators/generator-bot-enterprise-calendar/generators/app/index.js b/generators/generator-bot-enterprise-calendar/generators/app/index.js index 64202cef42..c07c0d72da 100644 --- a/generators/generator-bot-enterprise-calendar/generators/app/index.js +++ b/generators/generator-bot-enterprise-calendar/generators/app/index.js @@ -16,7 +16,7 @@ module.exports = class extends BaseGenerator { { isPlugin: true, name: 'Microsoft.Bot.Components.Graph', - version: '1.0.0', + version: '1.1.1', }, ], modifyApplicationSettings: (appSettings) => { diff --git a/generators/generator-bot-enterprise-calendar/package.json b/generators/generator-bot-enterprise-calendar/package.json index 419f85cefa..ccc2b013bf 100644 --- a/generators/generator-bot-enterprise-calendar/package.json +++ b/generators/generator-bot-enterprise-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-enterprise-calendar", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating an Adaptive bot built on the Azure Bot Framework using the Calendar template.", "keywords": [ "microsoft", @@ -24,7 +24,7 @@ "lint": "eslint ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-enterprise-people/README.md b/generators/generator-bot-enterprise-people/README.md index 2f76a38120..ade1381168 100644 --- a/generators/generator-bot-enterprise-people/README.md +++ b/generators/generator-bot-enterprise-people/README.md @@ -1,4 +1,4 @@ -# @microsoft/generator-bot-enterprise-people [![NPM version][npm-image]][npm-url] +# @microsoft/generator-bot-enterprise-people [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-people.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-people) A bot with the ability to interact with Office 365 users in an Azure Active Directory using Microsoft Graph. [Learn more](https://aka.ms/EnterprisePeopleBot) @@ -26,7 +26,7 @@ The Enterprise People Bot uses packages to extend its capabilities. [Learn more] - People.Read.All - User.ReadBasic.All - User.Read.All -- [Azure Language Understanding (LUIS)][luis], or another recognizer of your choice +- [Azure Language Understanding (LUIS)](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis), or another recognizer of your choice ### Supported languages @@ -36,6 +36,3 @@ The Enterprise People Bot uses packages to extend its capabilities. [Learn more] [MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) -[luis]: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-enterprise-people.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-enterprise-people diff --git a/generators/generator-bot-enterprise-people/generators/app/index.js b/generators/generator-bot-enterprise-people/generators/app/index.js index d85abc8a14..afc0f48b0a 100644 --- a/generators/generator-bot-enterprise-people/generators/app/index.js +++ b/generators/generator-bot-enterprise-people/generators/app/index.js @@ -16,7 +16,7 @@ module.exports = class extends BaseGenerator { { isPlugin: true, name: 'Microsoft.Bot.Components.Graph', - version: '1.0.0', + version: '1.1.1', }, ], modifyApplicationSettings: (appSettings) => { diff --git a/generators/generator-bot-enterprise-people/package.json b/generators/generator-bot-enterprise-people/package.json index 7e8b5bb1f8..e8ae667072 100644 --- a/generators/generator-bot-enterprise-people/package.json +++ b/generators/generator-bot-enterprise-people/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/generator-bot-enterprise-people", - "version": "1.0.0", + "version": "1.1.1", "description": "Yeoman generator for creating an Adaptive bot built on the Azure Bot Framework using the People template.", "keywords": [ "microsoft", @@ -24,7 +24,7 @@ "lint": "eslint -c ../../.eslintrc.json ." }, "dependencies": { - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0", + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1", "yeoman-generator": "^2.0.5", "yeoman-test": "^1.9.1" }, diff --git a/generators/generator-bot-template-generator/README.md b/generators/generator-bot-template-generator/README.md index 29dce62c2b..3139342db6 100644 --- a/generators/generator-bot-template-generator/README.md +++ b/generators/generator-bot-template-generator/README.md @@ -1,4 +1,4 @@ -# bot-template-generator [![NPM version][npm-image]][npm-url] +# bot-template-generator [![NPM version](https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive.svg)](https://www.npmjs.com/package/@microsoft/generator-bot-adaptive) Yeoman generator generating a bot template generator for use with the Microsoft Bot Framework. @@ -80,13 +80,5 @@ After making the change, run `yarn build:server` followed by `yarn start:dev`. Y ## License -[MIT License][license] - -[composer]: https://github.com/microsoft/botframework-composer -[yeoman]: https://yeoman.io -[npm]: https://npmjs.com -[nodejs]: https://nodejs.org/ -[license]: https://github.com/microsoft/botframework-components/blob/main/LICENSE -[npm-image]: https://badge.fury.io/js/%40microsoft%2Fgenerator-bot-adaptive.svg -[npm-url]: https://www.npmjs.com/package/@microsoft/generator-bot-adaptive +[MIT License](https://github.com/microsoft/botframework-components/blob/main/LICENSE) diff --git a/package.json b/package.json index 7a69ff9c32..33608161e5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "packages/*", "packages/*/js", "skills/declarative/*", - "testing/*" + "tests/**/js", + "!tests/functional" ], "scripts": { "lint": "yarn workspaces foreach run lint" diff --git a/packages/AdaptiveCards/Microsoft.Bot.Components.AdaptiveCards.csproj b/packages/AdaptiveCards/Microsoft.Bot.Components.AdaptiveCards.csproj index ebcd529718..c9b6c9e0fb 100644 --- a/packages/AdaptiveCards/Microsoft.Bot.Components.AdaptiveCards.csproj +++ b/packages/AdaptiveCards/Microsoft.Bot.Components.AdaptiveCards.csproj @@ -8,7 +8,7 @@ Microsoft.Bot.Components.AdaptiveCards https://github.com/microsoft/botframework-components/tree/main/packages/AdaptiveCards - 1.0.0 + 1.1.1 Composer triggers and actions for working with Adaptive Cards. Composer triggers and actions for working with Adaptive Cards. true @@ -20,7 +20,7 @@ - + diff --git a/packages/Directory.Build.props b/packages/Directory.Build.props index f25047d671..a65ea1de3e 100644 --- a/packages/Directory.Build.props +++ b/packages/Directory.Build.props @@ -12,18 +12,13 @@ - https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png - https://github.com/Microsoft/BotBuilder/blob/master/LICENSE + https://raw.githubusercontent.com/microsoft/botframework-sdk/main/icon.png true - https://github.com/Microsoft/BotBuilder-dotnet/blob/master/LICENSE + MIT en-US https://github.com/Microsoft/botframework-components - - $(NoWarn);NU5125 + $(NoWarn);NU5048 true true snupkg diff --git a/packages/Graph/Microsoft.Bot.Components.Graph.csproj b/packages/Graph/Microsoft.Bot.Components.Graph.csproj index 7e09985822..e8875e0481 100644 --- a/packages/Graph/Microsoft.Bot.Components.Graph.csproj +++ b/packages/Graph/Microsoft.Bot.Components.Graph.csproj @@ -7,7 +7,7 @@ Microsoft.Bot.Components.Graph - 1.0.0 + 1.1.1 Custom actions for the MS Graph API for Bot Framework bots. A set of custom actions for working with the Microsoft Graph API from Bot Framework Composer. https://github.com/Microsoft/botframework-components/tree/main/packages/Graph @@ -20,7 +20,7 @@ - + all diff --git a/packages/HelpAndCancel/Microsoft.Bot.Components.HelpAndCancel.nuspec b/packages/HelpAndCancel/Microsoft.Bot.Components.HelpAndCancel.nuspec index dd564f2118..9855582d85 100644 --- a/packages/HelpAndCancel/Microsoft.Bot.Components.HelpAndCancel.nuspec +++ b/packages/HelpAndCancel/Microsoft.Bot.Components.HelpAndCancel.nuspec @@ -2,18 +2,18 @@ Microsoft.Bot.Components.HelpAndCancel - 1.0.0 + 1.1.1 Microsoft Microsoft © Microsoft Corporation. All rights reserved. - https://github.com/Microsoft/BotBuilder/blob/master/LICENSE + MIT true https://github.com/Microsoft/botframework-components/tree/main/packages/HelpAndCancel First version of HelpAndCancel package Contains Adaptive Dialog assets to support Help and Cancel conversational flows in a bot built on the Azure Bot Framework. msbot-component msbot-content conversationalcore helpintent cancelintent preview - + diff --git a/packages/HelpAndCancel/package.json b/packages/HelpAndCancel/package.json index 72ba223afc..e66581ac6f 100644 --- a/packages/HelpAndCancel/package.json +++ b/packages/HelpAndCancel/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/bot-components-helpandcancel", - "version": "1.0.0", + "version": "1.1.1", "description": "Contains Adaptive Dialog assets to support Help and Cancel conversational flows in a bot built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -21,6 +21,6 @@ "url": "https://github.com/Microsoft/botframework-components.git" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"No test specified for package \\\"@microsoft/bot-components-helpandcancel\\\", skipping.\"" } } diff --git a/packages/Teams/dotnet/Actions/GetMeetingInfo.cs b/packages/Teams/dotnet/Actions/GetMeetingInfo.cs new file mode 100644 index 0000000000..a95eaa52a5 --- /dev/null +++ b/packages/Teams/dotnet/Actions/GetMeetingInfo.cs @@ -0,0 +1,104 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +using System; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using AdaptiveExpressions.Properties; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Teams; +using Microsoft.Bot.Connector; +using Newtonsoft.Json; + +namespace Microsoft.Bot.Components.Teams.Actions +{ + /// + /// Calls TeamsInfo.GetMeetingInfoAsync and sets the result to a memory property. + /// + public class GetMeetingInfo : Dialog + { + /// + /// Class identifier. + /// + [JsonProperty("$kind")] + public const string Kind = "Teams.GetMeetingInfo"; + + /// + /// Initializes a new instance of the class. + /// + /// Optional, source file full path. + /// Optional, line number in source file. + [JsonConstructor] + public GetMeetingInfo([CallerFilePath] string callerPath = "", [CallerLineNumber] int callerLine = 0) + : base() + { + RegisterSourceLocation(callerPath, callerLine); + } + + /// + /// Gets or sets an optional expression which if is true will disable this action. + /// + /// + /// "user.age > 18". + /// + /// + /// A boolean expression. + /// + [JsonProperty("disabled")] + public BoolExpression Disabled { get; set; } + + /// + /// Gets or sets property path to put the value in. + /// + /// + /// Property path to put the value in. + /// + [JsonProperty("property")] + public StringExpression Property { get; set; } + + /// + /// Gets or sets the expression to get the value to use for meeting id. + /// + /// + /// The expression to get the value to use for meeting id. Default value is turn.activity.channelData.meeting.id. + /// + [JsonProperty("meetingId")] + public StringExpression MeetingId { get; set; } = "=turn.activity.channelData.meeting.id"; + + /// + public override async Task BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken)) + { + if (options is CancellationToken) + { + throw new ArgumentException($"{nameof(options)} cannot be a cancellation token"); + } + + if (Disabled != null && Disabled.GetValue(dc.State)) + { + return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false); + } + + if (dc.Context.Activity.ChannelId != Channels.Msteams) + { + throw new InvalidOperationException($"{Kind} works only on the Teams channel."); + } + + string meetingId = MeetingId.GetValueOrNull(dc.State); + var result = await TeamsInfo.GetMeetingInfoAsync(dc.Context, meetingId, cancellationToken: cancellationToken).ConfigureAwait(false); + + if (Property != null) + { + dc.State.SetValue(Property.GetValue(dc.State), result); + } + + return await dc.EndDialogAsync(result, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + /// + protected override string OnComputeId() + { + return $"{GetType().Name}[{MeetingId?.ToString() ?? string.Empty},{Property?.ToString() ?? string.Empty}]"; + } + } +} diff --git a/packages/Teams/dotnet/Actions/SendMessageToTeamsChannel.cs b/packages/Teams/dotnet/Actions/SendMessageToTeamsChannel.cs index 912b8beecf..9f65d59452 100644 --- a/packages/Teams/dotnet/Actions/SendMessageToTeamsChannel.cs +++ b/packages/Teams/dotnet/Actions/SendMessageToTeamsChannel.cs @@ -2,7 +2,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. using System; +using System.Linq; using System.Runtime.CompilerServices; +using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using AdaptiveExpressions.Properties; @@ -118,23 +120,52 @@ public SendMessageToTeamsChannel([CallerFilePath] string callerPath = "", [Calle teamsChannelId = dc.Context.Activity.TeamsGetChannelId(); } - if (!(dc.Context.Adapter is BotFrameworkAdapter)) + Tuple result; + + // Check for legacy adapter + if (dc.Context.Adapter is BotFrameworkAdapter) + { + // TeamsInfo.SendMessageToTeamsChannelAsync requires AppCredentials + var credentials = dc.Context.TurnState.Get()?.Credentials as MicrosoftAppCredentials; + if (credentials == null) + { + throw new InvalidOperationException($"Missing credentials as {nameof(MicrosoftAppCredentials)} in {nameof(IConnectorClient)} from TurnState"); + } + + // The result comes back as a tuple, which is used to set the two properties (if present). + result = await TeamsInfo.SendMessageToTeamsChannelAsync(dc.Context, activity, teamsChannelId, credentials, cancellationToken: cancellationToken).ConfigureAwait(false); + } + else if (dc.Context.Adapter is CloudAdapterBase) { - throw new InvalidOperationException($"{Kind} is not supported by the current adapter."); + // Retrieve the bot appid from TurnState's ClaimsIdentity + string appId; + if (dc.Context.TurnState.Get(BotAdapter.BotIdentityKey) is ClaimsIdentity botIdentity) + { + // Apparently 'version' is sometimes empty, which will result in no id returned from GetAppIdFromClaims + appId = JwtTokenValidation.GetAppIdFromClaims(botIdentity.Claims); + if (string.IsNullOrEmpty(appId)) + { + appId = botIdentity.Claims.FirstOrDefault(claim => claim.Type == AuthenticationConstants.AudienceClaim)?.Value; + } + + if (string.IsNullOrEmpty(appId)) + { + throw new InvalidOperationException($"Missing AppIdClaim in ClaimsIdentity."); + } + } + else + { + throw new InvalidOperationException($"Missing {BotAdapter.BotIdentityKey} in {nameof(ITurnContext)} TurnState."); + } + + // The result comes back as a tuple, which is used to set the two properties (if present). + result = await TeamsInfo.SendMessageToTeamsChannelAsync(dc.Context, activity, teamsChannelId, appId, cancellationToken: cancellationToken).ConfigureAwait(false); } - - // TODO: this will NOT work with certificate app credentials - - // TeamsInfo.SendMessageToTeamsChannelAsync requires AppCredentials - var credentials = dc.Context.TurnState.Get()?.Credentials as MicrosoftAppCredentials; - if (credentials == null) + else { - throw new InvalidOperationException($"Missing credentials as {nameof(MicrosoftAppCredentials)} in {nameof(IConnectorClient)} from TurnState"); + throw new InvalidOperationException($"The adapter does not support {nameof(SendMessageToTeamsChannel)}."); } - // The result comes back as a tuple, which is used to set the two properties (if present). - var result = await TeamsInfo.SendMessageToTeamsChannelAsync(dc.Context, activity, teamsChannelId, credentials, cancellationToken: cancellationToken).ConfigureAwait(false); - if (ConversationReferenceProperty != null) { dc.State.SetValue(ConversationReferenceProperty.GetValue(dc.State), result.Item1); diff --git a/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.csproj b/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.csproj index d333f2f004..9533cc0562 100644 --- a/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.csproj +++ b/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.csproj @@ -3,7 +3,7 @@ netstandard2.0 Microsoft.Bot.Components.Teams - 1.0.0 + 1.1.1 This library implements .NET support for adaptive dialogs with Microsoft Teams This library implements .NET support for adaptive dialogs with Microsoft Teams https://github.com/Microsoft/botframework-components/tree/main/packages/Teams/dotnet @@ -35,7 +35,7 @@ - + diff --git a/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.schema b/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.schema new file mode 100644 index 0000000000..39d3fedb45 --- /dev/null +++ b/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.schema @@ -0,0 +1,38 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": "implements(Microsoft.IDialog)", + "title": "Get meeting information", + "description": "Get teams meeting information.", + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Optional id for the dialog" + }, + "property": { + "$ref": "schema:#/definitions/stringExpression", + "title": "Property", + "description": "Property (named location to store information).", + "examples": [ + "dialog.meetingInfo" + ] + }, + "meetingId": { + "$ref": "schema:#/definitions/stringExpression", + "title": "Meeting id", + "description": "Meeting Id or expression to a meetingId to use to get the meeting information. Default value is the current turn.activity.channelData.meeting.id.", + "examples": [ + "=turn.activity.channelData.meeting.id" + ] + }, + "disabled": { + "$ref": "schema:#/definitions/booleanExpression", + "title": "Disabled", + "description": "Optional condition which if true will disable this action.", + "examples": [ + "=user.age > 3" + ] + } + } +} \ No newline at end of file diff --git a/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.uischema b/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.uischema new file mode 100644 index 0000000000..9f79a1de99 --- /dev/null +++ b/packages/Teams/dotnet/Schemas/Actions/Teams.GetMeetingInfo.uischema @@ -0,0 +1,6 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "menu": { + "submenu": ["Microsoft Teams", "Get Teams Info"] + } +} \ No newline at end of file diff --git a/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.schema b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.schema new file mode 100644 index 0000000000..e339419fb0 --- /dev/null +++ b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.schema @@ -0,0 +1,9 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": [ "implements(Microsoft.ITrigger)", "extends(Microsoft.OnCondition)" ], + "title": "On meeting end", + "description": "Actions triggered when a Teams Meeting is ended", + "type": "object", + "required": [ + ] +} diff --git a/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.uischema b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.uischema new file mode 100644 index 0000000000..98cfcc870a --- /dev/null +++ b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingEnd.uischema @@ -0,0 +1,7 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "trigger": { + "submenu": "Microsoft Teams", + "label": "On meeting end" + } +} diff --git a/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.schema b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.schema new file mode 100644 index 0000000000..e30ddfff41 --- /dev/null +++ b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.schema @@ -0,0 +1,9 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": [ "implements(Microsoft.ITrigger)", "extends(Microsoft.OnCondition)" ], + "title": "On meeting start", + "description": "Actions triggered when a Teams Meeting is started", + "type": "object", + "required": [ + ] +} diff --git a/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.uischema b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.uischema new file mode 100644 index 0000000000..440af4b889 --- /dev/null +++ b/packages/Teams/dotnet/Schemas/TriggerConditions/Teams.OnMeetingStart.uischema @@ -0,0 +1,7 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "trigger": { + "submenu": "Microsoft Teams", + "label": "On meeting start" + } +} diff --git a/packages/Teams/dotnet/TeamsBotComponent.cs b/packages/Teams/dotnet/TeamsBotComponent.cs index cf2cd3cc6e..1eb4cef0aa 100644 --- a/packages/Teams/dotnet/TeamsBotComponent.cs +++ b/packages/Teams/dotnet/TeamsBotComponent.cs @@ -42,6 +42,8 @@ public override void ConfigureServices(IServiceCollection services, IConfigurati services.AddSingleton(sp => new DeclarativeType(OnTeamsChannelRenamed.Kind)); services.AddSingleton(sp => new DeclarativeType(OnTeamsChannelRestored.Kind)); services.AddSingleton(sp => new DeclarativeType(OnTeamsFileConsent.Kind)); + services.AddSingleton(sp => new DeclarativeType(OnTeamsMeetingStart.Kind)); + services.AddSingleton(sp => new DeclarativeType(OnTeamsMeetingEnd.Kind)); services.AddSingleton(sp => new DeclarativeType(OnTeamsMECardButtonClicked.Kind)); services.AddSingleton(sp => new DeclarativeType(OnTeamsMEConfigQuerySettingUrl.Kind)); @@ -68,6 +70,7 @@ public override void ConfigureServices(IServiceCollection services, IConfigurati // Actions + services.AddSingleton(sp => new DeclarativeType(GetMeetingInfo.Kind)); services.AddSingleton(sp => new DeclarativeType(GetMeetingParticipant.Kind)); services.AddSingleton(sp => new DeclarativeType(GetMember.Kind)); services.AddSingleton(sp => new DeclarativeType(GetPagedMembers.Kind)); diff --git a/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingEnd.cs b/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingEnd.cs new file mode 100644 index 0000000000..c99285ab01 --- /dev/null +++ b/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingEnd.cs @@ -0,0 +1,37 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using AdaptiveExpressions; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Adaptive.Conditions; +using Microsoft.Bot.Connector; +using Newtonsoft.Json; + +namespace Microsoft.Bot.Components.Teams.Conditions +{ + /// + /// Actions triggered when a Teams Meeting End event is received. + /// + /// + /// turn.activity.value has meeting data. + /// + public class OnTeamsMeetingEnd : OnEventActivity + { + [JsonProperty("$kind")] + public new const string Kind = "Teams.OnMeetingEnd"; + + [JsonConstructor] + public OnTeamsMeetingEnd(List actions = null, string condition = null, [CallerFilePath] string callerPath = "", [CallerLineNumber] int callerLine = 0) + : base(actions: actions, condition: condition, callerPath: callerPath, callerLine: callerLine) + { + } + + /// + protected override Expression CreateExpression() + { + return Expression.AndExpression(Expression.Parse($"{TurnPath.Activity}.channelId == '{Channels.Msteams}' && {TurnPath.Activity}.name == 'application/vnd.microsoft.meetingEnd'"), base.CreateExpression()); + } + } +} diff --git a/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingStart.cs b/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingStart.cs new file mode 100644 index 0000000000..921f0a58d4 --- /dev/null +++ b/packages/Teams/dotnet/TriggerConditions/OnTeamsMeetingStart.cs @@ -0,0 +1,37 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using AdaptiveExpressions; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Adaptive.Conditions; +using Microsoft.Bot.Connector; +using Newtonsoft.Json; + +namespace Microsoft.Bot.Components.Teams.Conditions +{ + /// + /// Actions triggered when a Teams Meeting Start event is received. + /// + /// + /// turn.activity.value has meeting data. + /// + public class OnTeamsMeetingStart : OnEventActivity + { + [JsonProperty("$kind")] + public new const string Kind = "Teams.OnMeetingStart"; + + [JsonConstructor] + public OnTeamsMeetingStart(List actions = null, string condition = null, [CallerFilePath] string callerPath = "", [CallerLineNumber] int callerLine = 0) + : base(actions: actions, condition: condition, callerPath: callerPath, callerLine: callerLine) + { + } + + /// + protected override Expression CreateExpression() + { + return Expression.AndExpression(Expression.Parse($"{TurnPath.Activity}.channelId == '{Channels.Msteams}' && {TurnPath.Activity}.name == 'application/vnd.microsoft.meetingStart'"), base.CreateExpression()); + } + } +} diff --git a/packages/Teams/js/package.json b/packages/Teams/js/package.json index 3dafdda466..38e4518849 100644 --- a/packages/Teams/js/package.json +++ b/packages/Teams/js/package.json @@ -2,7 +2,7 @@ "name": "@microsoft/bot-components-teams", "author": "Microsoft Corp.", "description": "Rule system for the Microsoft BotBuilder adaptive dialog system, with integration specific to Microsoft Teams.", - "version": "1.0.0", + "version": "1.1.1", "license": "MIT", "keywords": [ "msbot-component", @@ -29,28 +29,31 @@ "main": "lib/index.js", "types": "lib/index.d.ts", "peerDependencies": { - "adaptive-expressions": "~4.13.4", - "botbuilder": "~4.13.4", - "botbuilder-dialogs": "~4.13.4", - "botbuilder-dialogs-adaptive": "~4.13.4-preview", - "botbuilder-dialogs-adaptive-runtime-core": "~4.13.4-preview", - "botbuilder-dialogs-declarative": "~4.13.4-preview", - "botbuilder-stdlib": "~4.13.4-internal", + "adaptive-expressions": "~4.14.0", + "botbuilder": "~4.14.0", + "botbuilder-dialogs": "~4.14.0", + "botbuilder-dialogs-adaptive": "~4.14.0-preview", + "botbuilder-dialogs-adaptive-runtime-core": "~4.14.0-preview", + "botbuilder-dialogs-declarative": "~4.14.0-preview", + "botbuilder-stdlib": "~4.14.0-internal", + "botframework-connector": "~4.14.0", "lodash": "^4.17.21" }, "devDependencies": { "@tsconfig/recommended": "^1.0.1", "@types/lodash": "^4.14.168", - "@typescript-eslint/eslint-plugin": "latest", - "@typescript-eslint/parser": "latest", - "adaptive-expressions": "4.13.4", - "botbuilder": "4.13.4", - "botbuilder-dialogs": "4.13.4", - "botbuilder-dialogs-adaptive": "4.13.4-preview", - "botbuilder-dialogs-adaptive-runtime-core": "4.13.4-preview", - "botbuilder-dialogs-declarative": "4.13.4-preview", - "botbuilder-stdlib": "4.13.4-internal", - "eslint": "latest", + "@typescript-eslint/eslint-plugin": "^4.28.2", + "@typescript-eslint/parser": "^4.28.2", + "adaptive-expressions": "4.14.0", + "botbuilder": "4.14.0", + "botbuilder-dialogs": "4.14.0", + "botbuilder-dialogs-adaptive": "4.14.0-preview", + "botbuilder-dialogs-adaptive-runtime-core": "4.14.0-preview", + "botbuilder-dialogs-declarative": "4.14.0-preview", + "botbuilder-stdlib": "4.14.0-internal", + "botframework-connector": "4.14.0", + "eslint": "^7.30.0", + "eslint-plugin-prettier": "latest", "lodash": "^4.17.21", "rimraf": "^3.0.2", "typescript": "^4.0.5" diff --git a/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.schema b/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.schema new file mode 100644 index 0000000000..39d3fedb45 --- /dev/null +++ b/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.schema @@ -0,0 +1,38 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": "implements(Microsoft.IDialog)", + "title": "Get meeting information", + "description": "Get teams meeting information.", + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Optional id for the dialog" + }, + "property": { + "$ref": "schema:#/definitions/stringExpression", + "title": "Property", + "description": "Property (named location to store information).", + "examples": [ + "dialog.meetingInfo" + ] + }, + "meetingId": { + "$ref": "schema:#/definitions/stringExpression", + "title": "Meeting id", + "description": "Meeting Id or expression to a meetingId to use to get the meeting information. Default value is the current turn.activity.channelData.meeting.id.", + "examples": [ + "=turn.activity.channelData.meeting.id" + ] + }, + "disabled": { + "$ref": "schema:#/definitions/booleanExpression", + "title": "Disabled", + "description": "Optional condition which if true will disable this action.", + "examples": [ + "=user.age > 3" + ] + } + } +} \ No newline at end of file diff --git a/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.uischema b/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.uischema new file mode 100644 index 0000000000..9f79a1de99 --- /dev/null +++ b/packages/Teams/js/schemas/Actions/Teams.GetMeetingInfo.uischema @@ -0,0 +1,6 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "menu": { + "submenu": ["Microsoft Teams", "Get Teams Info"] + } +} \ No newline at end of file diff --git a/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.schema b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.schema new file mode 100644 index 0000000000..e339419fb0 --- /dev/null +++ b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.schema @@ -0,0 +1,9 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": [ "implements(Microsoft.ITrigger)", "extends(Microsoft.OnCondition)" ], + "title": "On meeting end", + "description": "Actions triggered when a Teams Meeting is ended", + "type": "object", + "required": [ + ] +} diff --git a/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.uischema b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.uischema new file mode 100644 index 0000000000..98cfcc870a --- /dev/null +++ b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingEnd.uischema @@ -0,0 +1,7 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "trigger": { + "submenu": "Microsoft Teams", + "label": "On meeting end" + } +} diff --git a/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.schema b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.schema new file mode 100644 index 0000000000..e30ddfff41 --- /dev/null +++ b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.schema @@ -0,0 +1,9 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": [ "implements(Microsoft.ITrigger)", "extends(Microsoft.OnCondition)" ], + "title": "On meeting start", + "description": "Actions triggered when a Teams Meeting is started", + "type": "object", + "required": [ + ] +} diff --git a/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.uischema b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.uischema new file mode 100644 index 0000000000..440af4b889 --- /dev/null +++ b/packages/Teams/js/schemas/TriggerConditions/Teams.OnMeetingStart.uischema @@ -0,0 +1,7 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "trigger": { + "submenu": "Microsoft Teams", + "label": "On meeting start" + } +} diff --git a/packages/Teams/js/src/actions/actionHelpers.ts b/packages/Teams/js/src/actions/actionHelpers.ts index 60e118e449..32dfc8fe38 100644 --- a/packages/Teams/js/src/actions/actionHelpers.ts +++ b/packages/Teams/js/src/actions/actionHelpers.ts @@ -35,10 +35,10 @@ export function getValue( * BotFrameworkAdapter and TestAdapter contain them, so we just need to make sure that dc.context.adapter contains * an adapter with the appropriate auth methods. */ -export interface HasAuthMethods { - getUserToken: typeof BotFrameworkAdapter.prototype.getUserToken; - getSignInLink: typeof BotFrameworkAdapter.prototype.getSignInLink; -} +export type HasAuthMethods = Pick< + BotFrameworkAdapter, + 'getUserToken' | 'getSignInLink' +>; /** * Test to assert val has required auth methods. @@ -55,3 +55,27 @@ export const testAdapterHasAuthMethods: Test = ( tests.isFunc((val as BotFrameworkAdapter).getSignInLink)) ); }; + +/** + * This is similar to HasAuthMethods, but purely for testing since TestAdapter does not have + * createConnectorClient, but BotFrameworkAdapter does. + */ +export type HasCreateConnectorClientMethod = Pick< + BotFrameworkAdapter, + 'createConnectorClient' +>; + +/** + * Test to assert val has required createConnectorClient method. + * + * @param {any} val Usually context.adapter. + * @returns {Assertion} Asserts that val has required createConnectorClient method. + */ +export const testAdapterHasCreateConnectorClientMethod: Test = ( + val: unknown +): val is HasCreateConnectorClientMethod => { + return ( + val instanceof BotFrameworkAdapter || + tests.isFunc((val as BotFrameworkAdapter).createConnectorClient) + ); +}; diff --git a/packages/Teams/js/src/actions/baseAuthResponseDialog.ts b/packages/Teams/js/src/actions/baseAuthResponseDialog.ts index 9d9a5cfa88..e16eed86f4 100644 --- a/packages/Teams/js/src/actions/baseAuthResponseDialog.ts +++ b/packages/Teams/js/src/actions/baseAuthResponseDialog.ts @@ -2,7 +2,13 @@ // Licensed under the MIT License. import isEmpty from 'lodash/isEmpty'; -import { ActionTypes, Activity, CardAction, TokenResponse } from 'botbuilder'; +import { + ActionTypes, + Activity, + CardAction, + CloudAdapterBase, + TokenResponse, +} from 'botbuilder'; import { BoolExpressionConverter, Expression, @@ -22,6 +28,7 @@ import { BaseTeamsCacheInfoResponseDialog, BaseTeamsCacheInfoResponseDialogConfiguration, } from './baseTeamsCacheInfoResponseDialog'; +import { UserTokenClient } from 'botframework-connector'; export interface BaseAuthResponseDialogConfiguration extends BaseTeamsCacheInfoResponseDialogConfiguration { @@ -98,8 +105,8 @@ export abstract class BaseAuthResponseDialog if (tokenResponse) { // We have the token, so the user is already signed in. // Similar to OAuthInput, just return the token in the property. - if (this.property != null) { - dc.state.setValue(this.property?.getValue(dc.state), tokenResponse); + if (this.property) { + dc.state.setValue(this.property.getValue(dc.state), tokenResponse); } // End the dialog and return the token response. @@ -125,19 +132,32 @@ export abstract class BaseAuthResponseDialog * @param {CardAction} _cardAction CardAction with a valid Sign In Link. * @returns {Partial} Promise representing the InvokeResponse Activity specific to this type of auth dialog. */ - protected createOAuthInvokeResponseActivityFromCardAction( + protected abstract createOAuthInvokeResponseActivityFromCardAction( _dc: DialogContext, _cardAction: CardAction - ): Partial { - throw new Error('NotImplemented'); - } + ): Partial; private async createOAuthInvokeResponseActivityFromTitleAndConnectionName( dc: DialogContext, - title?: string, - connectionName?: string + title: string, + connectionName: string ): Promise> { - // TODO: Switch to using Cloud OAuth after this PR gets merged: https://github.com/microsoft/botbuilder-js/pull/3149 + const userTokenClient = dc.context.turnState.get( + (dc.context.adapter as CloudAdapterBase).UserTokenClientKey + ); + if (userTokenClient) { + const signInResource = await userTokenClient.getSignInResource( + connectionName, + dc.context.activity, + '' + ); + return this.createOAuthInvokeResponseActivityFromTitleAndSignInLink( + dc, + title, + signInResource.signInLink as string + ); + } + if (!testAdapterHasAuthMethods(dc.context.adapter)) { throw new Error('Auth is not supported by the current adapter.'); } else if (!title || !connectionName) { @@ -176,13 +196,27 @@ export abstract class BaseAuthResponseDialog dc: DialogContext, connectionName: string ): Promise { - // TODO: Switch to using Cloud OAuth after this PR gets merged: https://github.com/microsoft/botbuilder-js/pull/3149 + // When the Bot Service Auth flow completes, the action.State will contain a magic code used for verification. + const state = dc.context.activity.value?.state; + + const userTokenClient = dc.context.turnState.get( + (dc.context.adapter as CloudAdapterBase).UserTokenClientKey + ); + if (userTokenClient) { + return userTokenClient.getUserToken( + dc.context.activity.from?.id, + connectionName, + dc.context.activity.channelId, + state + ); + } + if (!testAdapterHasAuthMethods(dc.context.adapter)) { throw new Error('Auth is not supported by the current adapter.'); } // When the Bot Service Auth flow completes, the action.State will contain a magic code used for verification. - const magicCode = !isEmpty(dc.context.activity?.value) + const magicCode = !isEmpty(dc.context.activity.value) ? dc.context.activity.value.state : undefined; diff --git a/packages/Teams/js/src/actions/getMeetingInfo.ts b/packages/Teams/js/src/actions/getMeetingInfo.ts new file mode 100644 index 0000000000..dcdd7b77e3 --- /dev/null +++ b/packages/Teams/js/src/actions/getMeetingInfo.ts @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + BoolExpression, + BoolExpressionConverter, + Expression, + StringExpression, + StringExpressionConverter, +} from 'adaptive-expressions'; +import { Channels, TeamsInfo } from 'botbuilder'; +import { + Converter, + ConverterFactory, + Dialog, + DialogConfiguration, + DialogContext, + DialogTurnResult, +} from 'botbuilder-dialogs'; +import { getValue } from './actionHelpers'; + +export interface GetMeetingInfoConfiguration extends DialogConfiguration { + disabled?: boolean | string | BoolExpression; + property?: string | Expression | StringExpression; + meetingId?: string | Expression | StringExpression; +} + +/** + * Calls `TeamsInfo.getMeetingInfo` and sets the result to a memory property. + */ +export class GetMeetingInfo + extends Dialog + implements GetMeetingInfoConfiguration { + /** + * Class identifier. + */ + static $kind = 'Teams.GetMeetingInfo'; + + /** + * Gets or sets an optional expression which if is true will disable this action. + * + * @example + * "user.age > 18". + */ + public disabled?: BoolExpression; + + /** + * Gets or sets property path to put the value in. + */ + public property?: StringExpression; + + /** + * Gets or sets the expression to get the value to use for meeting id. + * + * @default + * =turn.activity.channelData.meeting.id + */ + public meetingId = new StringExpression( + '=turn.activity.channelData.meeting.id' + ); + + public getConverter( + property: keyof GetMeetingInfoConfiguration + ): Converter | ConverterFactory { + switch (property) { + case 'disabled': + return new BoolExpressionConverter(); + case 'property': + case 'meetingId': + return new StringExpressionConverter(); + default: + return super.getConverter(property); + } + } + + /** + * Called when the dialog is started and pushed onto the dialog stack. + * + * @param {DialogContext} dc The [DialogContext](xref:botbuilder-dialogs.DialogContext) for the current turn of conversation. + * @param {object} _options Optional, initial information to pass to the dialog. + * @returns {Promise} A promise representing the asynchronous operation. + */ + public async beginDialog( + dc: DialogContext, + _options?: Record + ): Promise { + if (this.disabled?.getValue(dc.state)) { + return dc.endDialog(); + } + + if (dc.context.activity.channelId !== Channels.Msteams) { + throw new Error( + `${GetMeetingInfo.$kind} works only on the Teams channel.` + ); + } + + const meetingId = getValue(dc, this.meetingId); + + const result = await TeamsInfo.getMeetingInfo(dc.context, meetingId); + + if (this.property != null) { + dc.state.setValue(this.property.getValue(dc.state), result); + } + + return dc.endDialog(result); + } + + /** + * Builds the compute Id for the dialog. + * + * @returns {string} A string representing the compute Id. + */ + protected onComputeId(): string { + return `GetMeetingInfo[\ + ${this.meetingId ?? ''},\ + ${this.property?.toString() ?? ''}\ + ]`; + } +} diff --git a/packages/Teams/js/src/actions/index.ts b/packages/Teams/js/src/actions/index.ts index 30897cccdb..c131adaa4a 100644 --- a/packages/Teams/js/src/actions/index.ts +++ b/packages/Teams/js/src/actions/index.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +export * from './getMeetingInfo'; export * from './getMeetingParticipant'; export * from './getMember'; export * from './getPagedMembers'; diff --git a/packages/Teams/js/src/actions/sendMessageToTeamsChannel.ts b/packages/Teams/js/src/actions/sendMessageToTeamsChannel.ts index 6f0546054b..54d6a17cbc 100644 --- a/packages/Teams/js/src/actions/sendMessageToTeamsChannel.ts +++ b/packages/Teams/js/src/actions/sendMessageToTeamsChannel.ts @@ -8,7 +8,13 @@ import { StringExpression, StringExpressionConverter, } from 'adaptive-expressions'; -import { Activity, Channels, TeamsInfo } from 'botbuilder'; +import { + Activity, + Channels, + CloudAdapterBase, + ConversationReference, + TeamsInfo, +} from 'botbuilder'; import { Converter, ConverterFactory, @@ -19,8 +25,17 @@ import { DialogTurnResult, TemplateInterface, } from 'botbuilder-dialogs'; +import { + AuthenticationConstants, + ClaimsIdentity, + ConnectorClient, + JwtTokenValidation, +} from 'botframework-connector'; import { ActivityTemplateConverter } from 'botbuilder-dialogs-adaptive/lib/converters'; -import { getValue } from './actionHelpers'; +import { + getValue, + testAdapterHasCreateConnectorClientMethod, +} from './actionHelpers'; export interface SendMessageToTeamsChannelConfiguration extends DialogConfiguration { @@ -124,11 +139,58 @@ export class SendMessageToTeamsChannel getValue(dc, this.teamsChannelId) ?? dc.context?.activity.channelData?.channel?.id; - const result = await TeamsInfo.sendMessageToTeamsChannel( - dc.context, - activity, - teamsChannelId - ); + let result: [ConversationReference, string]; + + // Check for legacy adapter + if (testAdapterHasCreateConnectorClientMethod(dc.context.adapter)) { + const credentials = dc.context.turnState.get( + dc.context.adapter.ConnectorClientKey + )?.credentials; + if (!credentials) { + throw new Error( + 'Missing credentials as MicrosoftAppCredentials in ConnectorClient from TurnState' + ); + } + + result = await TeamsInfo.sendMessageToTeamsChannel( + dc.context, + activity, + teamsChannelId + ); + } else if (dc.context.adapter instanceof CloudAdapterBase) { + const botIdentity = dc.context.turnState.get( + dc.context.adapter.BotIdentityKey + ); + + let appId: string | undefined; + if (botIdentity) { + // 'version' is sometimes empty, which will result in no id returned from GetAppIdFromClaims. + appId = JwtTokenValidation.getAppIdFromClaims(botIdentity.claims); + + if (!appId) { + appId = botIdentity.claims.find( + (claim) => claim.type === AuthenticationConstants.AudienceClaim + )?.value; + } + + if (!appId) { + throw new Error('Missing AppIdClaim in ClaimsIdentity'); + } + } else { + throw new Error( + 'Missing dc.context.adapter.BotIdentityKey in TurnContext TurnState' + ); + } + + result = await TeamsInfo.sendMessageToTeamsChannel( + dc.context, + activity, + teamsChannelId, + appId + ); + } else { + throw new Error('The adapter does not support SendMessageToTeamsChannel'); + } if (this.conversationReferenceProperty != null) { dc.state.setValue( diff --git a/packages/Teams/js/src/actions/sendTabCardResponse.ts b/packages/Teams/js/src/actions/sendTabCardResponse.ts index a4f83ba764..641b59365e 100644 --- a/packages/Teams/js/src/actions/sendTabCardResponse.ts +++ b/packages/Teams/js/src/actions/sendTabCardResponse.ts @@ -2,6 +2,7 @@ // Licensed under the MIT License. import { + BoolExpression, BoolExpressionConverter, StringExpressionConverter, } from 'adaptive-expressions'; @@ -16,47 +17,45 @@ import { import { Converter, ConverterFactory, + Dialog, DialogContext, DialogStateManager, DialogTurnResult, TemplateInterface, } from 'botbuilder-dialogs'; import { ActivityTemplateConverter } from 'botbuilder-dialogs-adaptive/lib/converters'; -import { - BaseAuthResponseDialog, - BaseAuthResponseDialogConfiguration, -} from './baseAuthResponseDialog'; -export interface SendTabCardResponseConfiguration - extends BaseAuthResponseDialogConfiguration { +export interface SendTabCardResponseConfiguration extends Dialog { cards?: TemplateInterface; + disabled?: boolean | string | BoolExpression; } /** * Send a Card Tab response to the user. */ -export class SendTabCardResponse - extends BaseAuthResponseDialog - implements BaseAuthResponseDialogConfiguration { +export class SendTabCardResponse extends Dialog { /** * Class identifier. */ public static $kind = 'Teams.SendTabCardResponse'; + /** + * Gets or sets an optional expression which if is true will disable this action. + */ + public disabled?: BoolExpression; + /** * Template for the activity expression containing Adaptive Cards to send. */ public cards?: TemplateInterface; public getConverter( - property: keyof BaseAuthResponseDialogConfiguration | string + property: keyof Dialog | string ): Converter | ConverterFactory { switch (property) { case 'disabled': return new BoolExpressionConverter(); case 'property': - case 'connectionName': - case 'title': return new StringExpressionConverter(); case 'cards': return new ActivityTemplateConverter(); @@ -114,7 +113,7 @@ export class SendTabCardResponse */ protected onComputeId(): string { return `SendTabCardResponse[\ - ${this.title?.toString() ?? ''}\ + ${this.cards?.toString() ?? ''}\ ]`; } diff --git a/packages/Teams/js/src/adaptiveTeamsBotComponent.ts b/packages/Teams/js/src/adaptiveTeamsBotComponent.ts index 5a8ae0ad92..85f800e0ab 100644 --- a/packages/Teams/js/src/adaptiveTeamsBotComponent.ts +++ b/packages/Teams/js/src/adaptiveTeamsBotComponent.ts @@ -9,6 +9,7 @@ import { } from 'botbuilder-dialogs-adaptive-runtime-core'; import { + GetMeetingInfo, GetMeetingParticipant, GetMember, GetPagedMembers, @@ -40,12 +41,13 @@ import { OnTeamsChannelRenamed, OnTeamsChannelRestored, OnTeamsFileConsent, + OnTeamsMeetingStart, + OnTeamsMeetingEnd, OnTeamsMEBotMessagePreviewEdit, OnTeamsMEBotMessagePreviewSend, OnTeamsMECardButtonClicked, OnTeamsMEConfigQuerySettingUrl, OnTeamsMEConfigSetting, - OnTeamsMEConfigurationSetting, OnTeamsMEFetchTask, OnTeamsMEQuery, OnTeamsMESelectItem, @@ -75,6 +77,10 @@ export class AdaptiveTeamsBotComponent extends BotComponent { getDeclarativeTypes() { return [ // Actions + { + kind: GetMeetingInfo.$kind, + type: GetMeetingInfo, + }, { kind: GetMeetingParticipant.$kind, type: GetMeetingParticipant, @@ -153,6 +159,8 @@ export class AdaptiveTeamsBotComponent extends BotComponent { type: OnTeamsChannelRestored, }, { kind: OnTeamsFileConsent.$kind, type: OnTeamsFileConsent }, + { kind: OnTeamsMeetingStart.$kind, type: OnTeamsMeetingStart }, + { kind: OnTeamsMeetingEnd.$kind, type: OnTeamsMeetingEnd }, { kind: OnTeamsMEBotMessagePreviewEdit.$kind, type: OnTeamsMEBotMessagePreviewEdit, @@ -176,10 +184,6 @@ export class AdaptiveTeamsBotComponent extends BotComponent { { kind: OnTeamsMEFetchTask.$kind, type: OnTeamsMEFetchTask }, { kind: OnTeamsMEQuery.$kind, type: OnTeamsMEQuery }, { kind: OnTeamsMESelectItem.$kind, type: OnTeamsMESelectItem }, - { - kind: OnTeamsMEConfigurationSetting.$kind, - type: OnTeamsMEConfigurationSetting, - }, { kind: OnTeamsMESubmitAction.$kind, type: OnTeamsMESubmitAction, diff --git a/packages/Teams/js/src/conditions/index.ts b/packages/Teams/js/src/conditions/index.ts index 47dc788d5a..a2f7036f93 100644 --- a/packages/Teams/js/src/conditions/index.ts +++ b/packages/Teams/js/src/conditions/index.ts @@ -9,12 +9,13 @@ export * from './onTeamsChannelDeleted'; export * from './onTeamsChannelRenamed'; export * from './onTeamsChannelRestored'; export * from './onTeamsFileConsent'; +export * from './onTeamsMeetingStart'; +export * from './onTeamsMeetingEnd'; export * from './onTeamsMEBotMessagePreviewEdit'; export * from './onTeamsMEBotMessagePreviewSend'; export * from './onTeamsMECardButtonClicked'; export * from './onTeamsMEConfigQuerySettingUrl'; export * from './onTeamsMEConfigSetting'; -export * from './onTeamsMEConfigurationSetting'; export * from './onTeamsMEFetchTask'; export * from './onTeamsMEQuery'; export * from './onTeamsMESelectItem'; diff --git a/packages/Teams/js/src/conditions/onTeamsMEBotMessagePreviewSend.ts b/packages/Teams/js/src/conditions/onTeamsMEBotMessagePreviewSend.ts index bc21decd69..1675f3aadd 100644 --- a/packages/Teams/js/src/conditions/onTeamsMEBotMessagePreviewSend.ts +++ b/packages/Teams/js/src/conditions/onTeamsMEBotMessagePreviewSend.ts @@ -11,7 +11,7 @@ import { OnInvokeActivity } from 'botbuilder-dialogs-adaptive'; * and activity.value.botMessagePreviewAction == 'send'. */ export class OnTeamsMEBotMessagePreviewSend extends OnInvokeActivity { - static $kind = 'Teams.OnMEBotMessagePreviewEdit'; + static $kind = 'Teams.OnMEBotMessagePreviewSend'; public commandId?: string; diff --git a/packages/Teams/js/src/conditions/onTeamsMEConfigurationSetting.ts b/packages/Teams/js/src/conditions/onTeamsMeetingEnd.ts similarity index 63% rename from packages/Teams/js/src/conditions/onTeamsMEConfigurationSetting.ts rename to packages/Teams/js/src/conditions/onTeamsMeetingEnd.ts index 5987339a07..55e49c6c51 100644 --- a/packages/Teams/js/src/conditions/onTeamsMEConfigurationSetting.ts +++ b/packages/Teams/js/src/conditions/onTeamsMeetingEnd.ts @@ -4,13 +4,14 @@ import { Expression } from 'adaptive-expressions'; import { Channels } from 'botbuilder'; import { TurnPath } from 'botbuilder-dialogs'; -import { OnInvokeActivity } from 'botbuilder-dialogs-adaptive'; +import { OnEventActivity } from 'botbuilder-dialogs-adaptive'; /** - * Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/setting'. + * Actions triggered when a Teams Meeting End event is received. + * Note: turn.activity.value has meeting data. */ -export class OnTeamsMEConfigurationSetting extends OnInvokeActivity { - static $kind = 'Teams.OnMEConfigurationSetting'; +export class OnTeamsMeetingEnd extends OnEventActivity { + static $kind = 'Teams.OnMeetingEnd'; /** * Create expression for this condition. @@ -20,7 +21,7 @@ export class OnTeamsMEConfigurationSetting extends OnInvokeActivity { protected createExpression(): Expression { return Expression.andExpression( Expression.parse( - `${TurnPath.activity}.channelId == '${Channels.Msteams}' && ${TurnPath.activity}.name == 'composeExtension/setting'` + `${TurnPath.activity}.channelId == '${Channels.Msteams}' && ${TurnPath.activity}.name == 'application/vnd.microsoft.meetingEnd'` ), super.createExpression() ); diff --git a/packages/Teams/js/src/conditions/onTeamsMeetingStart.ts b/packages/Teams/js/src/conditions/onTeamsMeetingStart.ts new file mode 100644 index 0000000000..c940d2d705 --- /dev/null +++ b/packages/Teams/js/src/conditions/onTeamsMeetingStart.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Expression } from 'adaptive-expressions'; +import { Channels } from 'botbuilder'; +import { TurnPath } from 'botbuilder-dialogs'; +import { OnEventActivity } from 'botbuilder-dialogs-adaptive'; + +/** + * Actions triggered when a Teams Meeting Start event is received. + * Note: turn.activity.value has meeting data. + */ +export class OnTeamsMeetingStart extends OnEventActivity { + static $kind = 'Teams.OnMeetingStart'; + + /** + * Create expression for this condition. + * + * @returns {Expression} An [Expression](xref:adaptive-expressions.Expression) used to evaluate this rule. + */ + protected createExpression(): Expression { + return Expression.andExpression( + Expression.parse( + `${TurnPath.activity}.channelId == '${Channels.Msteams}' && ${TurnPath.activity}.name == 'application/vnd.microsoft.meetingStart'` + ), + super.createExpression() + ); + } +} diff --git a/packages/Teams/js/src/index.ts b/packages/Teams/js/src/index.ts index dc1d9d0c69..8018bf5010 100644 --- a/packages/Teams/js/src/index.ts +++ b/packages/Teams/js/src/index.ts @@ -1,10 +1,12 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +import { AdaptiveTeamsBotComponent } from './adaptiveTeamsBotComponent'; /** * @module @microsoft/bot-components-teams */ export * from './actions'; -export * from './adaptiveTeamsBotComponent'; +export { AdaptiveTeamsBotComponent }; export * from './conditions'; +export default AdaptiveTeamsBotComponent; diff --git a/packages/Welcome/Microsoft.Bot.Components.Welcome.nuspec b/packages/Welcome/Microsoft.Bot.Components.Welcome.nuspec index 43d5a1026d..e721b8650f 100644 --- a/packages/Welcome/Microsoft.Bot.Components.Welcome.nuspec +++ b/packages/Welcome/Microsoft.Bot.Components.Welcome.nuspec @@ -2,18 +2,18 @@ Microsoft.Bot.Components.Welcome - 1.0.0 + 1.1.1 Microsoft Microsoft © Microsoft Corporation. All rights reserved. - https://github.com/Microsoft/BotBuilder/blob/master/LICENSE + MIT true https://github.com/Microsoft/botframework-components/tree/main/packages/Welcome First version of welcome package An Adaptive Dialog for greeting new and returning users on first interaction with your bot built on the Azure Bot Framework. msbot-component msbot-content conversationalcore welcome preview - + diff --git a/packages/Welcome/package.json b/packages/Welcome/package.json index 1997adafb9..f7556f2c57 100644 --- a/packages/Welcome/package.json +++ b/packages/Welcome/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/bot-components-welcome", - "version": "1.0.0", + "version": "1.1.1", "description": "An Adaptive Dialog for greeting new and returning users on first interaction with your bot built on the Azure Bot Framework.", "keywords": [ "microsoft", @@ -21,6 +21,6 @@ "url": "https://github.com/Microsoft/botframework-components.git" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"No test specified for package \\\"@microsoft/bot-components-welcome\\\", skipping.\"" } } diff --git a/skills/csharp/Directory.Build.props b/skills/csharp/Directory.Build.props index 61dd1dc0cf..1c0432473e 100644 --- a/skills/csharp/Directory.Build.props +++ b/skills/csharp/Directory.Build.props @@ -24,7 +24,7 @@ https://github.com/microsoft/botframework-skills - https://github.com/microsoft/botframework-skills/blob/master/LICENSE + MIT en-US $(NoWarn);NU5125;NU1701;8002 diff --git a/skills/csharp/calendarskill/CalendarSkill.csproj b/skills/csharp/calendarskill/CalendarSkill.csproj index 58f7186653..04cef3197f 100644 --- a/skills/csharp/calendarskill/CalendarSkill.csproj +++ b/skills/csharp/calendarskill/CalendarSkill.csproj @@ -14,7 +14,7 @@ - + diff --git a/skills/declarative/Calendar/Calendar/Calendar.csproj b/skills/declarative/Calendar/Calendar/Calendar.csproj index 7fe5d77eb9..390eefd437 100644 --- a/skills/declarative/Calendar/Calendar/Calendar.csproj +++ b/skills/declarative/Calendar/Calendar/Calendar.csproj @@ -12,7 +12,7 @@ - + diff --git a/skills/declarative/People/People/People.csproj b/skills/declarative/People/People/People.csproj index 9b4d6229b0..c6f7201baf 100644 --- a/skills/declarative/People/People/People.csproj +++ b/skills/declarative/People/People/People.csproj @@ -12,9 +12,9 @@ - - - - + + + + \ No newline at end of file diff --git a/tests/functional/Bots/JavaScript/Consumers/CodeFirst/SimpleHostBot/package.json b/tests/functional/Bots/JavaScript/Consumers/CodeFirst/SimpleHostBot/package.json index bddc987858..2f072f539a 100644 --- a/tests/functional/Bots/JavaScript/Consumers/CodeFirst/SimpleHostBot/package.json +++ b/tests/functional/Bots/JavaScript/Consumers/CodeFirst/SimpleHostBot/package.json @@ -15,8 +15,8 @@ "url": "https://github.com" }, "dependencies": { - "botbuilder": "~4.13.3", - "botbuilder-dialogs": "~4.13.3", + "botbuilder": "4.14.0", + "botbuilder-dialogs": "~4.14.0", "dotenv": "~8.2.0", "restify": "~8.5.1" }, diff --git a/tests/functional/Bots/JavaScript/Consumers/CodeFirst/WaterfallHostBot/package.json b/tests/functional/Bots/JavaScript/Consumers/CodeFirst/WaterfallHostBot/package.json index 197d3fb53a..333bab7282 100644 --- a/tests/functional/Bots/JavaScript/Consumers/CodeFirst/WaterfallHostBot/package.json +++ b/tests/functional/Bots/JavaScript/Consumers/CodeFirst/WaterfallHostBot/package.json @@ -15,8 +15,8 @@ "url": "https://github.com" }, "dependencies": { - "botbuilder": "~4.13.3", - "botbuilder-dialogs": "~4.13.3", + "botbuilder": "~4.14.0", + "botbuilder-dialogs": "~4.14.0", "dotenv": "~8.2.0", "restify": "~8.5.1" }, diff --git a/tests/functional/Bots/JavaScript/Skills/CodeFirst/EchoSkillBot/package.json b/tests/functional/Bots/JavaScript/Skills/CodeFirst/EchoSkillBot/package.json index ff06ea8e8e..862c06e364 100644 --- a/tests/functional/Bots/JavaScript/Skills/CodeFirst/EchoSkillBot/package.json +++ b/tests/functional/Bots/JavaScript/Skills/CodeFirst/EchoSkillBot/package.json @@ -15,7 +15,7 @@ "url": "https://github.com" }, "dependencies": { - "botbuilder": "~4.13.3", + "botbuilder": "~4.14.0", "dotenv": "^8.2.0", "restify": "~8.5.1" }, diff --git a/tests/functional/Bots/JavaScript/Skills/CodeFirst/WaterfallSkillBot/package.json b/tests/functional/Bots/JavaScript/Skills/CodeFirst/WaterfallSkillBot/package.json index f7990840f7..2ebcff1533 100644 --- a/tests/functional/Bots/JavaScript/Skills/CodeFirst/WaterfallSkillBot/package.json +++ b/tests/functional/Bots/JavaScript/Skills/CodeFirst/WaterfallSkillBot/package.json @@ -15,8 +15,8 @@ "url": "https://github.com" }, "dependencies": { - "botbuilder": "~4.13.3", - "botbuilder-dialogs": "~4.13.3", + "botbuilder": "~4.14.0", + "botbuilder-dialogs": "~4.14.0", "dotenv": "^8.2.0", "node-fetch": "^2.6.1", "restify": "~8.5.1" diff --git a/tests/functional/SkillFunctionalTests.sln b/tests/functional/ComponentsFunctionalTests.sln similarity index 93% rename from tests/functional/SkillFunctionalTests.sln rename to tests/functional/ComponentsFunctionalTests.sln index 5c48eeb48d..c8633abe69 100644 --- a/tests/functional/SkillFunctionalTests.sln +++ b/tests/functional/ComponentsFunctionalTests.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29806.167 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31423.177 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkillFunctionalTests", "Tests\SkillFunctionalTests\SkillFunctionalTests.csproj", "{DE0231D9-A9BE-4D4C-A830-7ADCF28EA5D6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ComponentsFunctionalTests", "Tests\ComponentsFunctionalTests\ComponentsFunctionalTests.csproj", "{DE0231D9-A9BE-4D4C-A830-7ADCF28EA5D6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TranscriptTestRunner", "Libraries\TranscriptTestRunner\TranscriptTestRunner.csproj", "{65C3A2E0-FDC5-4132-9980-3BAE230E9F2E}" EndProject diff --git a/tests/functional/Directory.Build.props b/tests/functional/Directory.Build.props index 3e44d6df83..d869fda3bd 100644 --- a/tests/functional/Directory.Build.props +++ b/tests/functional/Directory.Build.props @@ -25,7 +25,7 @@ https://github.com/microsoft/BotFramework-FunctionalTests - https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE + MIT en-US true diff --git a/tests/functional/Libraries/TranscriptConverter/README.md b/tests/functional/Libraries/TranscriptConverter/README.md new file mode 100644 index 0000000000..6e80bb16b0 --- /dev/null +++ b/tests/functional/Libraries/TranscriptConverter/README.md @@ -0,0 +1,18 @@ +# Transcript Converter + +## User Step-by-step Guide +This step-by-step guide shows how to run the TranscriptConverter project to convert a transcript to a test script to be used in TranscriptTestRunner. + +## Generate a test script +1- Create a transcript file, follow [these steps](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-debug-transcript?view=azure-bot-service-4.0#creatingstoring-a-bot-transcript-file). + +2- Build the TranscriptConverter project and navigate to its executable. + +3- The command to convert a transcript to a new test script can be executed like this: +```PS +btc convert "path-to-source-transcript" +``` +You can convert a transcript to an existing test script like this: +```PS +btc convert "path-to-source-transcript" "path-to-target-test-script" +``` diff --git a/tests/functional/Libraries/TranscriptConverter/TranscriptConverter.csproj b/tests/functional/Libraries/TranscriptConverter/TranscriptConverter.csproj index aa4817caff..9bfe2aa204 100644 --- a/tests/functional/Libraries/TranscriptConverter/TranscriptConverter.csproj +++ b/tests/functional/Libraries/TranscriptConverter/TranscriptConverter.csproj @@ -8,7 +8,7 @@ - + diff --git a/tests/functional/Libraries/TranscriptTestRunner/TranscriptTestRunner.csproj b/tests/functional/Libraries/TranscriptTestRunner/TranscriptTestRunner.csproj index 357cf4ee10..a2714722fb 100644 --- a/tests/functional/Libraries/TranscriptTestRunner/TranscriptTestRunner.csproj +++ b/tests/functional/Libraries/TranscriptTestRunner/TranscriptTestRunner.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/tests/functional/Tests/ComponentsFunctionalTests/Common/HostBot.cs b/tests/functional/Tests/ComponentsFunctionalTests/Common/HostBot.cs new file mode 100644 index 0000000000..9d18a41068 --- /dev/null +++ b/tests/functional/Tests/ComponentsFunctionalTests/Common/HostBot.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace ComponentsFunctionalTests.Common +{ + public enum HostBot + { + /// + /// Empty bot implemented using DotNet and Web App. + /// + EmptyBotDotNetWebApp, + + /// + /// Empty bot implemented using JS and Web App. + /// + EmptyBotJSWebApp + } +} diff --git a/tests/functional/Tests/SkillFunctionalTests/Common/TestCase.cs b/tests/functional/Tests/ComponentsFunctionalTests/Common/TestCase.cs similarity index 83% rename from tests/functional/Tests/SkillFunctionalTests/Common/TestCase.cs rename to tests/functional/Tests/ComponentsFunctionalTests/Common/TestCase.cs index 990135daca..505cbdda8f 100644 --- a/tests/functional/Tests/SkillFunctionalTests/Common/TestCase.cs +++ b/tests/functional/Tests/ComponentsFunctionalTests/Common/TestCase.cs @@ -4,7 +4,7 @@ using Microsoft.Bot.Connector; using TranscriptTestRunner; -namespace SkillFunctionalTests.Common +namespace ComponentsFunctionalTests.Common { public class TestCase { @@ -16,8 +16,6 @@ public class TestCase public HostBot HostBot { get; set; } - public string TargetSkill { get; set; } - public string Script { get; set; } } } diff --git a/tests/functional/Tests/SkillFunctionalTests/Common/TestCaseBuilder.cs b/tests/functional/Tests/ComponentsFunctionalTests/Common/TestCaseBuilder.cs similarity index 53% rename from tests/functional/Tests/SkillFunctionalTests/Common/TestCaseBuilder.cs rename to tests/functional/Tests/ComponentsFunctionalTests/Common/TestCaseBuilder.cs index 16b422d5f7..0eb7f6c8cd 100644 --- a/tests/functional/Tests/SkillFunctionalTests/Common/TestCaseBuilder.cs +++ b/tests/functional/Tests/ComponentsFunctionalTests/Common/TestCaseBuilder.cs @@ -5,11 +5,11 @@ using System.Collections.Generic; using TranscriptTestRunner; -namespace SkillFunctionalTests.Common +namespace ComponentsFunctionalTests.Common { public class TestCaseBuilder { - public IEnumerable BuildTestCases(List channelIds, List deliveryModes, List hostBots, List targetSkills, List scripts, Func shouldExclude = null) + public IEnumerable BuildTestCases(List channelIds, List deliveryModes, List hostBots, List scripts, Func shouldExclude = null) { var testCases = new List(); var count = 1; @@ -21,23 +21,19 @@ public IEnumerable BuildTestCases(List channelIds, List TestCases() { var channelIds = new List { Channels.Directline }; - var deliverModes = new List + var deliveryModes = new List { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies + DeliveryModes.Normal }; var hostBots = new List { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython, - - // TODO: Enable this when the port to composer is ready - //HostBot.ComposerHostBotDotNet - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotJS, - SkillBotNames.WaterfallSkillBotPython, - - // TODO: Enable this when the port to composer is ready - //SkillBotNames.ComposerSkillBotDotNet + HostBot.EmptyBotDotNetWebApp, + HostBot.EmptyBotJSWebApp }; - var scripts = new List - { - "MessageWithAttachment.json", - }; + var scripts = new List { "EmptyBot.json" }; var testCaseBuilder = new TestCaseBuilder(); - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts); + var testCases = testCaseBuilder.BuildTestCases(channelIds, deliveryModes, hostBots, scripts); foreach (var testCase in testCases) { yield return testCase; @@ -77,12 +59,12 @@ public async Task RunTestCases(TestCaseDataObject testData) Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); var options = TestClientOptions[testCase.HostBot]; + var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); var testParams = new Dictionary { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill } + { "DeliveryMode", testCase.DeliveryMode } }; await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParams); diff --git a/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.json b/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.json new file mode 100644 index 0000000000..075dac0f34 --- /dev/null +++ b/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.json @@ -0,0 +1,61 @@ +{ + "items": [ + { + "type": "conversationUpdate", + "role": "user" + }, + { + "type": "message", + "role": "bot", + "text": "Welcome to your bot.", + "assertions": [ + "type == 'message'", + "from.role == 'bot'", + "recipient.role == 'user'", + "text == 'Welcome to your bot.'", + "speak == 'Welcome to your bot.'" + ] + }, + { + "type": "trace", + "role": "bot", + "assertions": [ + "type == 'trace'", + "from.role == 'bot'", + "recipient.role == 'user'", + "label == 'Bot State'", + "valueType == 'https://www.botframework.com/schemas/botState'", + "name == 'BotState'" + ] + }, + { + "type": "message", + "role": "user", + "text": "test" + }, + { + "type": "message", + "role": "bot", + "text": "Sorry, I didn't get that.", + "assertions": [ + "type == 'message'", + "from.role == 'bot'", + "recipient.role == 'user'", + "text == 'Sorry, I didn\\'t get that.'", + "speak == 'Sorry, I didn\\'t get that.'" + ] + }, + { + "type": "trace", + "role": "bot", + "assertions": [ + "type == 'trace'", + "from.role == 'bot'", + "recipient.role == 'user'", + "label == 'Bot State'", + "valueType == 'https://www.botframework.com/schemas/botState'", + "name == 'BotState'" + ] + } + ] +} \ No newline at end of file diff --git a/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.transcript b/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.transcript new file mode 100644 index 0000000000..32bbffd73f --- /dev/null +++ b/tests/functional/Tests/ComponentsFunctionalTests/EmptyBot/TestScripts/EmptyBot.transcript @@ -0,0 +1,185 @@ +[ + { + "type": "conversationUpdate", + "membersAdded": [ + { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot" + }, + { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "name": "User" + } + ], + "membersRemoved": [], + "channelId": "emulator", + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "id": "2810c330-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:10-07:00", + "recipient": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "timestamp": "2021-07-09T18:19:10.434Z", + "from": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "name": "User", + "role": "user" + }, + "locale": "en-us", + "serviceUrl": "https://6e74437635f6.ngrok.io" + }, + { + "type": "message", + "serviceUrl": "https://6e74437635f6.ngrok.io", + "channelId": "emulator", + "from": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "recipient": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "role": "user" + }, + "locale": "en-us", + "text": "Welcome to your bot.", + "speak": "Welcome to your bot.", + "replyToId": "2810c330-e0e2-11eb-8e13-71515b0ea9a4", + "id": "2ace83a0-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:15-07:00", + "timestamp": "2021-07-09T18:19:15.034Z" + }, + { + "type": "trace", + "serviceUrl": "https://6e74437635f6.ngrok.io", + "channelId": "emulator", + "from": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "recipient": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "role": "user" + }, + "locale": "en-us", + "replyToId": "2810c330-e0e2-11eb-8e13-71515b0ea9a4", + "label": "Bot State", + "valueType": "https://www.botframework.com/schemas/botState", + "value": { + "conversation": { + "DialogState": { + "dialogStack": [] + } + }, + "user": {} + }, + "name": "BotState", + "id": "2aed2f30-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:15-07:00", + "timestamp": "2021-07-09T18:19:15.235Z" + }, + { + "channelData": { + "clientActivityID": "1625854763493y3zek13sgka", + "clientTimestamp": "2021-07-09T18:19:23.493Z" + }, + "text": "test", + "textFormat": "plain", + "type": "message", + "channelId": "emulator", + "from": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "name": "User", + "role": "user" + }, + "locale": "en-us", + "timestamp": "2021-07-09T18:19:23.520Z", + "entities": [ + { + "requiresBotState": true, + "supportsListening": true, + "supportsTts": true, + "type": "ClientCapabilities" + } + ], + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "id": "2fdd6000-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:23-07:00", + "recipient": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "serviceUrl": "https://6e74437635f6.ngrok.io" + }, + { + "type": "message", + "serviceUrl": "https://6e74437635f6.ngrok.io", + "channelId": "emulator", + "from": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "recipient": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "role": "user" + }, + "locale": "en-us", + "text": "Sorry, I didn't get that.", + "speak": "Sorry, I didn't get that.", + "replyToId": "2fdd6000-e0e2-11eb-8e13-71515b0ea9a4", + "id": "3025dab0-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:23-07:00", + "timestamp": "2021-07-09T18:19:23.995Z" + }, + { + "type": "trace", + "serviceUrl": "https://6e74437635f6.ngrok.io", + "channelId": "emulator", + "from": { + "id": "272a5ad0-e0e2-11eb-be7b-51b3afea0a16", + "name": "Bot", + "role": "bot" + }, + "conversation": { + "id": "273a6060-e0e2-11eb-8e13-71515b0ea9a4|livechat" + }, + "recipient": { + "id": "59656570-bd23-4940-8d6a-a7e31b382509", + "role": "user" + }, + "locale": "en-us", + "replyToId": "2fdd6000-e0e2-11eb-8e13-71515b0ea9a4", + "label": "Bot State", + "valueType": "https://www.botframework.com/schemas/botState", + "value": { + "conversation": { + "DialogState": { + "dialogStack": [] + } + }, + "user": {} + }, + "name": "BotState", + "id": "303f7d30-e0e2-11eb-8e13-71515b0ea9a4", + "localTimestamp": "2021-07-09T11:19:24-07:00", + "timestamp": "2021-07-09T18:19:24.163Z" + } +] \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/README.md b/tests/functional/Tests/ComponentsFunctionalTests/README.md similarity index 100% rename from tests/functional/Tests/SkillFunctionalTests/README.md rename to tests/functional/Tests/ComponentsFunctionalTests/README.md diff --git a/tests/functional/Tests/SkillFunctionalTests/ScriptTestBase.cs b/tests/functional/Tests/ComponentsFunctionalTests/ScriptTestBase.cs similarity index 95% rename from tests/functional/Tests/SkillFunctionalTests/ScriptTestBase.cs rename to tests/functional/Tests/ComponentsFunctionalTests/ScriptTestBase.cs index 59ae89e379..1af1dac92c 100644 --- a/tests/functional/Tests/SkillFunctionalTests/ScriptTestBase.cs +++ b/tests/functional/Tests/ComponentsFunctionalTests/ScriptTestBase.cs @@ -3,13 +3,13 @@ using System.Collections.Generic; using System.IO; +using ComponentsFunctionalTests.Common; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using SkillFunctionalTests.Common; using TranscriptTestRunner.TestClients; using Xunit.Abstractions; -namespace SkillFunctionalTests +namespace ComponentsFunctionalTests { public class ScriptTestBase { diff --git a/tests/functional/Tests/ComponentsFunctionalTests/appsettings.json b/tests/functional/Tests/ComponentsFunctionalTests/appsettings.json new file mode 100644 index 0000000000..af1a042508 --- /dev/null +++ b/tests/functional/Tests/ComponentsFunctionalTests/appsettings.json @@ -0,0 +1,21 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "Microsoft": "Warning" + } + }, + + "TestRequestTimeout": 180, + + "HostBotClientOptions": { + "EmptyBotDotNetWebApp": { + "BotId": "bfcfnemptybotdotnetwebapp", + "DirectLineSecret": "" + }, + "EmptyBotJSWebApp": { + "BotId": "bfcfnemptybotjswebapp", + "DirectLineSecret": "" + } + } +} diff --git a/tests/functional/Tests/SkillFunctionalTests/xunit.runner.json b/tests/functional/Tests/ComponentsFunctionalTests/xunit.runner.json similarity index 100% rename from tests/functional/Tests/SkillFunctionalTests/xunit.runner.json rename to tests/functional/Tests/ComponentsFunctionalTests/xunit.runner.json diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/CardActionsTests.cs b/tests/functional/Tests/SkillFunctionalTests/CardActions/CardActionsTests.cs deleted file mode 100644 index 25391c6fa0..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/CardActionsTests.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.CardActions -{ - [Trait("TestCategory", "CardActions")] - public class CardActionsTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/CardActions/TestScripts"; - - public CardActionsTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies - }; - - var hostBots = new List - { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython, - - // TODO: Enable this when the port to composer is ready - //HostBot.ComposerHostBotDotNet - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotJS, - SkillBotNames.WaterfallSkillBotPython, - - // TODO: Enable this when the port to composer is ready - //SkillBotNames.ComposerSkillBotDotNet - }; - - var scripts = new List - { - "BotAction.json", - "TaskModule.json", - "SubmitAction.json", - "Hero.json", - "Thumbnail.json", - "Receipt.json", - "SignIn.json", - "Carousel.json", - "List.json", - "O365.json", - "Animation.json", - "Audio.json", - "Video.json" - }; - - var testCaseBuilder = new TestCaseBuilder(); - - // This local function is used to exclude ExpectReplies, O365 and WaterfallSkillBotPython test cases - static bool ShouldExclude(TestCase testCase) - { - if (testCase.Script == "O365.json") - { - // BUG: O365 fails with ExpectReplies for WaterfallSkillBotPython (remove when https://github.com/microsoft/BotFramework-FunctionalTests/issues/328 is fixed). - if (testCase.TargetSkill == SkillBotNames.WaterfallSkillBotPython && testCase.DeliveryMode == DeliveryModes.ExpectReplies) - { - return true; - } - } - - return false; - } - - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts, ShouldExclude); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public async Task RunTestCases(TestCaseDataObject testData) - { - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - var options = TestClientOptions[testCase.HostBot]; - var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); - - var testParams = new Dictionary - { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill } - }; - - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, "WaterfallGreeting.json"), testParams); - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParams); - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.json deleted file mode 100644 index 237082091f..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Animation" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.animation'", - "attachments[0].content.title == 'Animation Card'", - "attachments[0].content.autostart == True" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.transcript deleted file mode 100644 index a2c1586a72..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Animation.transcript +++ /dev/null @@ -1,165 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839814734xukiykq7r6", - "clientTimestamp": "2021-01-28T13:16:54.734Z" - }, - "text": "Animation", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "04e743bc-b422-4dc5-8a8a-6d006bfc6661", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:16:54.799Z", - "conversation": { - "id": "063c4460-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "1776d1f0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:16:54-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "063c4460-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "04e743bc-b422-4dc5-8a8a-6d006bfc6661", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.animation", - "content": { - "title": "Animation Card", - "media": [ - { - "url": "https://media3.giphy.com/media/xT0xeJpnrWC4XWblEk/giphy.gif?cid=ecf05e47mye7k75sup6tcmadoom8p1q8u03a7g2p3f76upp9&rid=giphy.gif" - } - ], - "autostart": true - } - } - ], - "entities": [], - "replyToId": "1776d1f0-616b-11eb-b46e-c3c3213a748e", - "id": "183d0820-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:16:56-03:00", - "timestamp": "2021-01-28T13:16:56.097Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "063c4460-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "04e743bc-b422-4dc5-8a8a-6d006bfc6661", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "1776d1f0-616b-11eb-b46e-c3c3213a748e", - "id": "18699660-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:16:56-03:00", - "timestamp": "2021-01-28T13:16:56.390Z" - }, - { - "channelData": { - "clientActivityID": "16118398192100re8kcctazwj", - "clientTimestamp": "2021-01-28T13:16:59.210Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "04e743bc-b422-4dc5-8a8a-6d006bfc6661", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:16:59.271Z", - "conversation": { - "id": "063c4460-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "1a213170-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:16:59-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "063c4460-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "04e743bc-b422-4dc5-8a8a-6d006bfc6661", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "1a213170-616b-11eb-b46e-c3c3213a748e", - "id": "1adc9230-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:00-03:00", - "timestamp": "2021-01-28T13:17:00.498Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.json deleted file mode 100644 index 2f7f16a576..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Audio" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.audio'", - "attachments[0].content.title == 'Audio Card'", - "attachments[0].content.autoloop == True" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.transcript deleted file mode 100644 index 4b83bab546..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Audio.transcript +++ /dev/null @@ -1,165 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839872412avts1ortbzo", - "clientTimestamp": "2021-01-28T13:17:52.412Z" - }, - "text": "Audio", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "e0681749-455e-4df6-ac1d-cce532da5262", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:17:52.463Z", - "conversation": { - "id": "2f090f90-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "39d5a5f0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:52-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "2f090f90-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "e0681749-455e-4df6-ac1d-cce532da5262", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.audio", - "content": { - "title": "Audio Card", - "media": [ - { - "url": "https://bffnwaterfallskillbotdotnet.azurewebsites.net/api/music" - } - ], - "autoloop": true - } - } - ], - "entities": [], - "replyToId": "39d5a5f0-616b-11eb-b46e-c3c3213a748e", - "id": "3a6c1990-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:53-03:00", - "timestamp": "2021-01-28T13:17:53.449Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "2f090f90-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "e0681749-455e-4df6-ac1d-cce532da5262", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "39d5a5f0-616b-11eb-b46e-c3c3213a748e", - "id": "3a98f5f0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:53-03:00", - "timestamp": "2021-01-28T13:17:53.743Z" - }, - { - "channelData": { - "clientActivityID": "16118398766380tfc3r379ha", - "clientTimestamp": "2021-01-28T13:17:56.638Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "e0681749-455e-4df6-ac1d-cce532da5262", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:17:56.693Z", - "conversation": { - "id": "2f090f90-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "3c5b3f60-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:56-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "2f090f90-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "e0681749-455e-4df6-ac1d-cce532da5262", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "3c5b3f60-616b-11eb-b46e-c3c3213a748e", - "id": "3cfcfda0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:17:57-03:00", - "timestamp": "2021-01-28T13:17:57.754Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.json deleted file mode 100644 index f3b7f58912..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "AdaptiveCardBotAction" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'TextBlock'", - "attachments[0].content.body[0].text == 'Bot Builder actions'", - "attachments[0].content.actions[0].type == 'Action.Submit'", - "attachments[0].content.actions[0].data.msteams.type == 'imBack'", - "attachments[0].content.actions[0].data.msteams.value == 'text'", - "attachments[0].content.actions[0].title == 'imBack'", - "attachments[0].content.actions[1].type == 'Action.Submit'", - "attachments[0].content.actions[1].data.msteams.type == 'messageBack'", - "attachments[0].content.actions[1].data.msteams.value.key == 'value'", - "attachments[0].content.actions[1].title == 'message back'", - "attachments[0].content.actions[2].type == 'Action.Submit'", - "attachments[0].content.actions[2].data.msteams.type == 'messageBack'", - "attachments[0].content.actions[2].data.msteams.text == 'text received by bots'", - "attachments[0].content.actions[2].data.msteams.displayText == 'display text message back'", - "attachments[0].content.actions[2].data.msteams.value.key == 'value'", - "attachments[0].content.actions[2].title == 'message back local echo'", - "attachments[0].content.actions[3].type == 'Action.Submit'", - "attachments[0].content.actions[3].data.msteams.type == 'invoke'", - "attachments[0].content.actions[3].data.msteams.value.key == 'value'", - "attachments[0].content.actions[3].title == 'invoke'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.transcript deleted file mode 100644 index 089ea60de3..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/BotAction.transcript +++ /dev/null @@ -1,216 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611838440775fk6vbo5p5nw", - "clientTimestamp": "2021-01-28T12:54:00.775Z" - }, - "text": "AdaptiveCardBotAction", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:54:00.810Z", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "e480bca0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:54:00-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "type": "AdaptiveCard", - "version": "1.2", - "body": [ - { - "type": "TextBlock", - "text": "Bot Builder actions" - } - ], - "actions": [ - { - "type": "Action.Submit", - "data": { - "msteams": { - "type": "imBack", - "value": "text" - } - }, - "title": "imBack" - }, - { - "type": "Action.Submit", - "data": { - "msteams": { - "type": "messageBack", - "value": { - "key": "value" - } - } - }, - "title": "message back" - }, - { - "type": "Action.Submit", - "data": { - "msteams": { - "type": "messageBack", - "text": "text received by bots", - "displayText": "display text message back", - "value": { - "key": "value" - } - } - }, - "title": "message back local echo" - }, - { - "type": "Action.Submit", - "data": { - "msteams": { - "type": "invoke", - "value": { - "key": "value" - } - } - }, - "title": "invoke" - } - ] - } - } - ], - "entities": [], - "replyToId": "e480bca0-6167-11eb-b46e-c3c3213a748e", - "id": "e59fc130-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:54:02-03:00", - "timestamp": "2021-01-28T12:54:02.691Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "e480bca0-6167-11eb-b46e-c3c3213a748e", - "id": "e5cb3e00-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:54:02-03:00", - "timestamp": "2021-01-28T12:54:02.976Z" - }, - { - "channelData": { - "clientActivityID": "1611838581343cy25vk7jmo9", - "clientTimestamp": "2021-01-28T12:56:21.344Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:56:21.384Z", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "384aa080-6168-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:56:21-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "384aa080-6168-11eb-b46e-c3c3213a748e", - "id": "3948af90-6168-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:56:23-03:00", - "timestamp": "2021-01-28T12:56:23.049Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.json deleted file mode 100644 index 1bf2d60fcd..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Carousel" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'carousel'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[0].content.title == 'BotFramework Hero Card'", - "attachments[0].content.subtitle == 'Microsoft Bot Framework'", - "attachments[0].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[0].content.buttons[0].type == 'openUrl'", - "attachments[0].content.buttons[0].title == 'Get Started'", - "attachments[0].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'", - "attachments[1].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[1].content.title == 'BotFramework Hero Card'", - "attachments[1].content.subtitle == 'Microsoft Bot Framework'", - "attachments[1].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[1].content.buttons[0].type == 'openUrl'", - "attachments[1].content.buttons[0].title == 'Get Started'", - "attachments[1].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'", - "attachments[2].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[2].content.title == 'BotFramework Hero Card'", - "attachments[2].content.subtitle == 'Microsoft Bot Framework'", - "attachments[2].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[2].content.buttons[0].type == 'openUrl'", - "attachments[2].content.buttons[0].title == 'Get Started'", - "attachments[2].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.transcript deleted file mode 100644 index 1a9de47a96..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Carousel.transcript +++ /dev/null @@ -1,213 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839522508zaakfbpcfw", - "clientTimestamp": "2021-01-28T13:12:02.508Z" - }, - "text": "Carousel", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "43ff7934-8228-49a8-9925-6d469752f983", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:12:02.562Z", - "conversation": { - "id": "60a4e8e0-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "6946fe20-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:02-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "60a4e8e0-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "43ff7934-8228-49a8-9925-6d469752f983", - "role": "user" - }, - "attachmentLayout": "carousel", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - }, - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - }, - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - } - ], - "entities": [], - "replyToId": "6946fe20-616a-11eb-b46e-c3c3213a748e", - "id": "69fedc70-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:03-03:00", - "timestamp": "2021-01-28T13:12:03.767Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "60a4e8e0-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "43ff7934-8228-49a8-9925-6d469752f983", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "6946fe20-616a-11eb-b46e-c3c3213a748e", - "id": "6a2af580-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:04-03:00", - "timestamp": "2021-01-28T13:12:04.056Z" - }, - { - "channelData": { - "clientActivityID": "1611839526614stj36f82vy", - "clientTimestamp": "2021-01-28T13:12:06.614Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "43ff7934-8228-49a8-9925-6d469752f983", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:12:06.671Z", - "conversation": { - "id": "60a4e8e0-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "6bb9f9f0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:06-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "60a4e8e0-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "43ff7934-8228-49a8-9925-6d469752f983", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "6bb9f9f0-616a-11eb-b46e-c3c3213a748e", - "id": "6c559db0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:07-03:00", - "timestamp": "2021-01-28T13:12:07.691Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.json deleted file mode 100644 index d913abad6a..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Hero" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[0].content.title == 'BotFramework Hero Card'", - "attachments[0].content.subtitle == 'Microsoft Bot Framework'", - "attachments[0].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[0].content.buttons[0].type == 'openUrl'", - "attachments[0].content.buttons[0].title == 'Get Started'", - "attachments[0].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.transcript deleted file mode 100644 index 9a95ed0474..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Hero.transcript +++ /dev/null @@ -1,173 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839251501nwivvhmw61i", - "clientTimestamp": "2021-01-28T13:07:31.501Z" - }, - "text": "Hero", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "f748dcdb-2d9b-4540-a2dc-341070aaf910", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:07:31.554Z", - "conversation": { - "id": "bd2d1200-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "c7be7420-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:07:31-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "bd2d1200-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "f748dcdb-2d9b-4540-a2dc-341070aaf910", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - } - ], - "entities": [], - "replyToId": "c7be7420-6169-11eb-b46e-c3c3213a748e", - "id": "c87519f0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:07:32-03:00", - "timestamp": "2021-01-28T13:07:32.750Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "bd2d1200-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "f748dcdb-2d9b-4540-a2dc-341070aaf910", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "c7be7420-6169-11eb-b46e-c3c3213a748e", - "id": "c8e67960-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:07:33-03:00", - "timestamp": "2021-01-28T13:07:33.494Z" - }, - { - "channelData": { - "clientActivityID": "1611839255359ffrgmvahfew", - "clientTimestamp": "2021-01-28T13:07:35.359Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "f748dcdb-2d9b-4540-a2dc-341070aaf910", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:07:35.435Z", - "conversation": { - "id": "bd2d1200-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "ca0ea5b0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:07:35-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "bd2d1200-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "f748dcdb-2d9b-4540-a2dc-341070aaf910", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "ca0ea5b0-6169-11eb-b46e-c3c3213a748e", - "id": "cab03ce0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:07:36-03:00", - "timestamp": "2021-01-28T13:07:36.494Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.json deleted file mode 100644 index d34f09b8de..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "List" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[0].content.title == 'BotFramework Hero Card'", - "attachments[0].content.subtitle == 'Microsoft Bot Framework'", - "attachments[0].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[0].content.buttons[0].type == 'openUrl'", - "attachments[0].content.buttons[0].title == 'Get Started'", - "attachments[0].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'", - "attachments[1].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[1].content.title == 'BotFramework Hero Card'", - "attachments[1].content.subtitle == 'Microsoft Bot Framework'", - "attachments[1].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[1].content.buttons[0].type == 'openUrl'", - "attachments[1].content.buttons[0].title == 'Get Started'", - "attachments[1].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'", - "attachments[2].contentType == 'application/vnd.microsoft.card.hero'", - "attachments[2].content.title == 'BotFramework Hero Card'", - "attachments[2].content.subtitle == 'Microsoft Bot Framework'", - "attachments[2].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[2].content.buttons[0].type == 'openUrl'", - "attachments[2].content.buttons[0].title == 'Get Started'", - "attachments[2].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.transcript deleted file mode 100644 index ccad6421be..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/List.transcript +++ /dev/null @@ -1,213 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839575098y19me2gcp5b", - "clientTimestamp": "2021-01-28T13:12:55.098Z" - }, - "text": "List", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "59cdcc89-e282-4417-9822-4d725675243b", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:12:55.143Z", - "conversation": { - "id": "7e64e060-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "889e3770-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:55-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "7e64e060-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "59cdcc89-e282-4417-9822-4d725675243b", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - }, - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - }, - { - "contentType": "application/vnd.microsoft.card.hero", - "content": { - "title": "BotFramework Hero Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - } - ], - "entities": [], - "replyToId": "889e3770-616a-11eb-b46e-c3c3213a748e", - "id": "89448990-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:56-03:00", - "timestamp": "2021-01-28T13:12:56.233Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "7e64e060-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "59cdcc89-e282-4417-9822-4d725675243b", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "889e3770-616a-11eb-b46e-c3c3213a748e", - "id": "8970a2a0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:56-03:00", - "timestamp": "2021-01-28T13:12:56.522Z" - }, - { - "channelData": { - "clientActivityID": "1611839578738d2iy2wsylg", - "clientTimestamp": "2021-01-28T13:12:58.738Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "59cdcc89-e282-4417-9822-4d725675243b", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:12:58.788Z", - "conversation": { - "id": "7e64e060-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "8aca6640-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:58-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "7e64e060-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "59cdcc89-e282-4417-9822-4d725675243b", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "8aca6640-616a-11eb-b46e-c3c3213a748e", - "id": "8b62d5b0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:12:59-03:00", - "timestamp": "2021-01-28T13:12:59.787Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.json deleted file mode 100644 index a36b000dfe..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "o365" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.teams.card.o365connector'", - "attachments[0].content.title == 'card title'", - "attachments[0].content.text == 'card text'", - "attachments[0].content.summary == 'O365 card summary'", - "attachments[0].content.themeColor == '#E67A9E'", - "attachments[0].content.sections[0].title == '**section title**'", - "attachments[0].content.sections[0].text == 'section text'", - "attachments[0].content.sections[0].activityTitle == 'activity title'", - "attachments[0].content.sections[0].activitySubtitle == 'activity subtitle'", - "attachments[0].content.sections[0].activityText == 'activity text'", - "attachments[0].content.sections[0].activityImage == 'http://connectorsdemo.azurewebsites.net/images/MSC12_Oscar_002.jpg'", - "attachments[0].content.sections[0].activityImageType == 'avatar'", - "attachments[0].content.sections[0].markdown == True", - "attachments[0].content.sections[0].facts[0].name == 'Fact name 1'", - "attachments[0].content.sections[0].facts[0].value == 'Fact value 1'", - "attachments[0].content.sections[0].facts[1].name == 'Fact name 2'", - "attachments[0].content.sections[0].facts[1].value == 'Fact value 2'", - "attachments[0].content.sections[0].images[0].image == 'http://connectorsdemo.azurewebsites.net/images/MicrosoftSurface_024_Cafe_OH-06315_VS_R1c.jpg'", - "attachments[0].content.sections[0].images[0].title == 'image 1'", - "attachments[0].content.sections[0].images[1].image == 'http://connectorsdemo.azurewebsites.net/images/WIN12_Scene_01.jpg'", - "attachments[0].content.sections[0].images[1].title == 'image 2'", - "attachments[0].content.sections[0].images[2].image == 'http://connectorsdemo.azurewebsites.net/images/WIN12_Anthony_02.jpg'", - "attachments[0].content.sections[0].images[2].title == 'image 3'", - "attachments[0].content.potentialAction[0].@type == 'ActionCard'", - "attachments[0].content.potentialAction[0].inputs[0].@type == 'MultichoiceInput'", - "attachments[0].content.potentialAction[0].inputs[0].choices[0].display == 'Choice 1'", - "attachments[0].content.potentialAction[0].inputs[0].choices[1].display == 'Choice 2'", - "attachments[0].content.potentialAction[0].inputs[0].choices[2].display == 'Choice 3'", - "attachments[0].content.potentialAction[0].inputs[0].style == 'expanded'", - "attachments[0].content.potentialAction[0].inputs[0].isMultiSelect == True", - "attachments[0].content.potentialAction[0].inputs[0].id == 'list-1'", - "attachments[0].content.potentialAction[0].inputs[0].isRequired == True", - "attachments[0].content.potentialAction[0].inputs[0].title == 'Pick multiple options'", - "attachments[0].content.potentialAction[0].inputs[1].@type == 'MultichoiceInput'", - "attachments[0].content.potentialAction[0].inputs[1].choices[0].display == 'Choice 4'", - "attachments[0].content.potentialAction[0].inputs[1].choices[1].display == 'Choice 5'", - "attachments[0].content.potentialAction[0].inputs[1].choices[2].display == 'Choice 6'", - "attachments[0].content.potentialAction[0].inputs[1].style == 'compact'", - "attachments[0].content.potentialAction[0].inputs[1].isMultiSelect == True", - "attachments[0].content.potentialAction[0].inputs[1].id == 'list-2'", - "attachments[0].content.potentialAction[0].inputs[1].isRequired == True", - "attachments[0].content.potentialAction[0].inputs[1].title == 'Pick multiple options'", - "attachments[0].content.potentialAction[0].inputs[2].@type == 'MultichoiceInput'", - "attachments[0].content.potentialAction[0].inputs[2].choices[0].display == 'Choice a'", - "attachments[0].content.potentialAction[0].inputs[2].choices[0].value == 'a'", - "attachments[0].content.potentialAction[0].inputs[2].choices[1].display == 'Choice b'", - "attachments[0].content.potentialAction[0].inputs[2].choices[1].value == 'b'", - "attachments[0].content.potentialAction[0].inputs[2].choices[2].display == 'Choice c'", - "attachments[0].content.potentialAction[0].inputs[2].choices[2].value == 'c'", - "attachments[0].content.potentialAction[0].inputs[2].style == 'expanded'", - "attachments[0].content.potentialAction[0].inputs[2].isMultiSelect == False", - "attachments[0].content.potentialAction[0].inputs[2].id == 'list-3'", - "attachments[0].content.potentialAction[0].inputs[2].isRequired == False", - "attachments[0].content.potentialAction[0].inputs[2].title == 'Pick an option'", - "attachments[0].content.potentialAction[0].inputs[3].@type == 'MultichoiceInput'", - "attachments[0].content.potentialAction[0].inputs[3].choices[0].display == 'Choice x'", - "attachments[0].content.potentialAction[0].inputs[3].choices[0].value == 'x'", - "attachments[0].content.potentialAction[0].inputs[3].choices[1].display == 'Choice y'", - "attachments[0].content.potentialAction[0].inputs[3].choices[1].value == 'y'", - "attachments[0].content.potentialAction[0].inputs[3].choices[2].display == 'Choice z'", - "attachments[0].content.potentialAction[0].inputs[3].choices[2].value == 'z'", - "attachments[0].content.potentialAction[0].inputs[3].style == 'compact'", - "attachments[0].content.potentialAction[0].inputs[3].isMultiSelect == False", - "attachments[0].content.potentialAction[0].inputs[3].id == 'list-4'", - "attachments[0].content.potentialAction[0].inputs[3].isRequired == False", - "attachments[0].content.potentialAction[0].inputs[3].title == 'Pick an option'", - "attachments[0].content.potentialAction[0].actions[0].@type == 'HttpPOST'", - "attachments[0].content.potentialAction[0].actions[0].name == 'Send'", - "attachments[0].content.potentialAction[0].actions[0].@id == 'card-1-btn-1'", - "attachments[0].content.potentialAction[0].name == 'Multiple Choice'", - "attachments[0].content.potentialAction[0].@id == 'card-1'", - "attachments[0].content.potentialAction[1].@type == 'ActionCard'", - "attachments[0].content.potentialAction[1].inputs[0].@type == 'TextInput'", - "attachments[0].content.potentialAction[1].inputs[0].isMultiline == True", - "attachments[0].content.potentialAction[1].inputs[0].id == 'text-1'", - "attachments[0].content.potentialAction[1].inputs[0].isRequired == False", - "attachments[0].content.potentialAction[1].inputs[0].title == 'multiline, no maxLength'", - "attachments[0].content.potentialAction[1].inputs[1].@type == 'TextInput'", - "attachments[0].content.potentialAction[1].inputs[1].isMultiline == False", - "attachments[0].content.potentialAction[1].inputs[1].id == 'text-2'", - "attachments[0].content.potentialAction[1].inputs[1].isRequired == False", - "attachments[0].content.potentialAction[1].inputs[1].title == 'single line, no maxLength'", - "attachments[0].content.potentialAction[1].inputs[2].@type == 'TextInput'", - "attachments[0].content.potentialAction[1].inputs[2].isMultiline == True", - "attachments[0].content.potentialAction[1].inputs[2].id == 'text-3'", - "attachments[0].content.potentialAction[1].inputs[2].isRequired == True", - "attachments[0].content.potentialAction[1].inputs[2].title == 'multiline, max len = 10, isRequired'", - "attachments[0].content.potentialAction[1].inputs[3].@type == 'TextInput'", - "attachments[0].content.potentialAction[1].inputs[3].isMultiline == False", - "attachments[0].content.potentialAction[1].inputs[3].id == 'text-4'", - "attachments[0].content.potentialAction[1].inputs[3].isRequired == True", - "attachments[0].content.potentialAction[1].inputs[3].title == 'single line, max len = 10, isRequired'", - "attachments[0].content.potentialAction[1].actions[0].@type == 'HttpPOST'", - "attachments[0].content.potentialAction[1].actions[0].name == 'Send'", - "attachments[0].content.potentialAction[1].actions[0].@id == 'card-2-btn-1'", - "attachments[0].content.potentialAction[1].name == 'Text Input'", - "attachments[0].content.potentialAction[1].@id == 'card-2'", - "attachments[0].content.potentialAction[2].@type == 'ActionCard'", - "attachments[0].content.potentialAction[2].inputs[0].@type == 'DateInput'", - "attachments[0].content.potentialAction[2].inputs[0].includeTime == True", - "attachments[0].content.potentialAction[2].inputs[0].id == 'date-1'", - "attachments[0].content.potentialAction[2].inputs[0].isRequired == True", - "attachments[0].content.potentialAction[2].inputs[0].title == 'date with time'", - "attachments[0].content.potentialAction[2].inputs[1].@type == 'DateInput'", - "attachments[0].content.potentialAction[2].inputs[1].includeTime == False", - "attachments[0].content.potentialAction[2].inputs[1].id == 'date-2'", - "attachments[0].content.potentialAction[2].inputs[1].isRequired == False", - "attachments[0].content.potentialAction[2].inputs[1].title == 'date only'", - "attachments[0].content.potentialAction[2].actions[0].@type == 'HttpPOST'", - "attachments[0].content.potentialAction[2].actions[0].name == 'Send'", - "attachments[0].content.potentialAction[2].actions[0].@id == 'card-3-btn-1'", - "attachments[0].content.potentialAction[2].name == 'Date Input'", - "attachments[0].content.potentialAction[2].@id == 'card-3'", - "attachments[0].content.potentialAction[3].@type == 'ViewAction'", - "attachments[0].content.potentialAction[3].name == 'View Action'", - "attachments[0].content.potentialAction[4].@type == 'OpenUri'", - "attachments[0].content.potentialAction[4].targets[0].os == 'default'", - "attachments[0].content.potentialAction[4].targets[0].uri == 'http://microsoft.com'", - "attachments[0].content.potentialAction[4].targets[1].os == 'iOS'", - "attachments[0].content.potentialAction[4].targets[1].uri == 'http://microsoft.com'", - "attachments[0].content.potentialAction[4].targets[2].os == 'android'", - "attachments[0].content.potentialAction[4].targets[2].uri == 'http://microsoft.com'", - "attachments[0].content.potentialAction[4].targets[3].os == 'windows'", - "attachments[0].content.potentialAction[4].targets[3].uri == 'http://microsoft.com'", - "attachments[0].content.potentialAction[4].name == 'Open Uri'", - "attachments[0].content.potentialAction[4].@id == 'open-uri'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.transcript deleted file mode 100644 index 35486a16ed..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/O365.transcript +++ /dev/null @@ -1,407 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "16097853343944p9zoiqzu9d", - "clientTimestamp": "2021-01-04T18:35:34.394Z" - }, - "text": "o365", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "9dbd973e-a896-4b91-9d00-e98bb8dec6a2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-04T18:35:34.423Z", - "conversation": { - "id": "9a3c8340-4ebb-11eb-9fc9-afbd749ec1ea|livechat" - }, - "id": "a1bbea70-4ebb-11eb-8029-87a6e92fcaab", - "localTimestamp": "2021-01-04T15:35:34-03:00", - "recipient": { - "id": "fce93a20-4e9c-11eb-9fc9-afbd749ec1ea", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://0e141a8d6e98.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://0e141a8d6e98.ngrok.io", - "channelId": "emulator", - "from": { - "id": "fce93a20-4e9c-11eb-9fc9-afbd749ec1ea", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "9a3c8340-4ebb-11eb-9fc9-afbd749ec1ea|livechat" - }, - "recipient": { - "id": "9dbd973e-a896-4b91-9d00-e98bb8dec6a2", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.teams.card.o365connector", - "content": { - "title": "card title", - "text": "card text", - "summary": "O365 card summary", - "themeColor": "#E67A9E", - "sections": [ - { - "title": "**section title**", - "text": "section text", - "activityTitle": "activity title", - "activitySubtitle": "activity subtitle", - "activityText": "activity text", - "activityImage": "http://connectorsdemo.azurewebsites.net/images/MSC12_Oscar_002.jpg", - "activityImageType": "avatar", - "markdown": true, - "facts": [ - { - "name": "Fact name 1", - "value": "Fact value 1" - }, - { - "name": "Fact name 2", - "value": "Fact value 2" - } - ], - "images": [ - { - "image": "http://connectorsdemo.azurewebsites.net/images/MicrosoftSurface_024_Cafe_OH-06315_VS_R1c.jpg", - "title": "image 1" - }, - { - "image": "http://connectorsdemo.azurewebsites.net/images/WIN12_Scene_01.jpg", - "title": "image 2" - }, - { - "image": "http://connectorsdemo.azurewebsites.net/images/WIN12_Anthony_02.jpg", - "title": "image 3" - } - ] - } - ], - "potentialAction": [ - { - "@type": "ActionCard", - "inputs": [ - { - "@type": "MultichoiceInput", - "choices": [ - { - "display": "Choice 1", - "value": "1" - }, - { - "display": "Choice 2", - "value": "2" - }, - { - "display": "Choice 3", - "value": "3" - } - ], - "style": "expanded", - "isMultiSelect": true, - "id": "list-1", - "isRequired": true, - "title": "Pick multiple options" - }, - { - "@type": "MultichoiceInput", - "choices": [ - { - "display": "Choice 4", - "value": "4" - }, - { - "display": "Choice 5", - "value": "5" - }, - { - "display": "Choice 6", - "value": "6" - } - ], - "style": "compact", - "isMultiSelect": true, - "id": "list-2", - "isRequired": true, - "title": "Pick multiple options" - }, - { - "@type": "MultichoiceInput", - "choices": [ - { - "display": "Choice a", - "value": "a" - }, - { - "display": "Choice b", - "value": "b" - }, - { - "display": "Choice c", - "value": "c" - } - ], - "style": "expanded", - "isMultiSelect": false, - "id": "list-3", - "isRequired": false, - "title": "Pick an option" - }, - { - "@type": "MultichoiceInput", - "choices": [ - { - "display": "Choice x", - "value": "x" - }, - { - "display": "Choice y", - "value": "y" - }, - { - "display": "Choice z", - "value": "z" - } - ], - "style": "compact", - "isMultiSelect": false, - "id": "list-4", - "isRequired": false, - "title": "Pick an option" - } - ], - "actions": [ - { - "@type": "HttpPOST", - "body": "{\"list1\":\"{{list-1.value}}\", \"list2\":\"{{list-2.value}}\", \"list3\":\"{{list-3.value}}\", \"list4\":\"{{list-4.value}}\"}", - "name": "Send", - "@id": "card-1-btn-1" - } - ], - "name": "Multiple Choice", - "@id": "card-1" - }, - { - "@type": "ActionCard", - "inputs": [ - { - "@type": "TextInput", - "isMultiline": true, - "id": "text-1", - "isRequired": false, - "title": "multiline, no maxLength" - }, - { - "@type": "TextInput", - "isMultiline": false, - "id": "text-2", - "isRequired": false, - "title": "single line, no maxLength" - }, - { - "@type": "TextInput", - "isMultiline": true, - "maxLength": 10, - "id": "text-3", - "isRequired": true, - "title": "multiline, max len = 10, isRequired" - }, - { - "@type": "TextInput", - "isMultiline": false, - "maxLength": 10, - "id": "text-4", - "isRequired": true, - "title": "single line, max len = 10, isRequired" - } - ], - "actions": [ - { - "@type": "HttpPOST", - "body": "{\"text1\":\"{{text-1.value}}\", \"text2\":\"{{text-2.value}}\", \"text3\":\"{{text-3.value}}\", \"text4\":\"{{text-4.value}}\"}", - "name": "Send", - "@id": "card-2-btn-1" - } - ], - "name": "Text Input", - "@id": "card-2" - }, - { - "@type": "ActionCard", - "inputs": [ - { - "@type": "DateInput", - "includeTime": true, - "id": "date-1", - "isRequired": true, - "title": "date with time" - }, - { - "@type": "DateInput", - "includeTime": false, - "id": "date-2", - "isRequired": false, - "title": "date only" - } - ], - "actions": [ - { - "@type": "HttpPOST", - "body": "{\"date1\":\"{{date-1.value}}\", \"date2\":\"{{date-2.value}}\"}", - "name": "Send", - "@id": "card-3-btn-1" - } - ], - "name": "Date Input", - "@id": "card-3" - }, - { - "@type": "ViewAction", - "target": [ - "http://microsoft.com" - ], - "name": "View Action" - }, - { - "@type": "OpenUri", - "targets": [ - { - "os": "default", - "uri": "http://microsoft.com" - }, - { - "os": "iOS", - "uri": "http://microsoft.com" - }, - { - "os": "android", - "uri": "http://microsoft.com" - }, - { - "os": "windows", - "uri": "http://microsoft.com" - } - ], - "name": "Open Uri", - "@id": "open-uri" - } - ] - } - } - ], - "entities": [], - "replyToId": "a1bbea70-4ebb-11eb-8029-87a6e92fcaab", - "id": "a2567cc0-4ebb-11eb-8029-87a6e92fcaab", - "localTimestamp": "2021-01-04T15:35:35-03:00", - "timestamp": "2021-01-04T18:35:35.436Z" - }, - { - "type": "message", - "serviceUrl": "https://a3c0daa166e8.ngrok.io", - "channelId": "emulator", - "from": { - "id": "e6f62e00-5a57-11eb-856d-5fc1719d27ce", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "5cd758c0-5a5c-11eb-856d-5fc1719d27ce|livechat" - }, - "recipient": { - "id": "967d23e5-491c-4039-9edd-923a53617734", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "6511ab80-5a5c-11eb-9f42-afe5fddb4d6c", - "id": "6603aca0-5a5c-11eb-9f42-afe5fddb4d6c", - "localTimestamp": "2021-01-19T10:44:05-03:00", - "timestamp": "2021-01-19T13:44:05.994Z" - }, - { - "channelData": { - "clientActivityID": "1609785433694xe3les8ksd", - "clientTimestamp": "2021-01-04T18:37:13.694Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "9bdd62a5-6bf7-4c0c-a7b6-e954be30f2f0", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-04T18:37:13.730Z", - "conversation": { - "id": "cee77be0-4ebb-11eb-9fc9-afbd749ec1ea|livechat" - }, - "id": "dcecf620-4ebb-11eb-8029-87a6e92fcaab", - "localTimestamp": "2021-01-04T15:37:13-03:00", - "recipient": { - "id": "fce93a20-4e9c-11eb-9fc9-afbd749ec1ea", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://0e141a8d6e98.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://0e141a8d6e98.ngrok.io", - "channelId": "emulator", - "from": { - "id": "fce93a20-4e9c-11eb-9fc9-afbd749ec1ea", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "cee77be0-4ebb-11eb-9fc9-afbd749ec1ea|livechat" - }, - "recipient": { - "id": "9bdd62a5-6bf7-4c0c-a7b6-e954be30f2f0", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "dcecf620-4ebb-11eb-8029-87a6e92fcaab", - "id": "ddb8aa90-4ebb-11eb-8029-87a6e92fcaab", - "localTimestamp": "2021-01-04T15:37:15-03:00", - "timestamp": "2021-01-04T18:37:15.065Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.json deleted file mode 100644 index 1709f44ccd..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Receipt" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.receipt'", - "attachments[0].content.title == 'John Doe'", - "attachments[0].content.facts[0].key == 'Order Number'", - "attachments[0].content.facts[1].key == 'Payment Method'", - "attachments[0].content.facts[1].value == 'VISA 5555-****'", - "attachments[0].content.items[0].title == 'Data Transfer'", - "attachments[0].content.items[0].image.url == 'https://github.com/amido/azure-vector-icons/raw/master/renders/traffic-manager.png'", - "attachments[0].content.items[0].price == '$ 38.45'", - "attachments[0].content.items[1].title == 'App Service'", - "attachments[0].content.items[1].image.url == 'https://github.com/amido/azure-vector-icons/raw/master/renders/cloud-service.png'", - "attachments[0].content.items[1].price == '$ 45.00'", - "attachments[0].content.total == '$ 90.95'", - "attachments[0].content.tax == '$ 7.50'", - "attachments[0].content.buttons[0].type == 'openUrl'", - "attachments[0].content.buttons[0].title == 'More information'", - "attachments[0].content.buttons[0].image == 'https://account.windowsazure.com/content/6.10.1.38-.8225.160809-1618/aux-pre/images/offer-icon-freetrial.png'", - "attachments[0].content.buttons[0].value == 'https://azure.microsoft.com/en-us/pricing/'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.transcript deleted file mode 100644 index e5205b5dc7..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Receipt.transcript +++ /dev/null @@ -1,197 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839371599wsbxze20iv", - "clientTimestamp": "2021-01-28T13:09:31.599Z" - }, - "text": "Receipt", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "3eb35847-111c-4ec7-86de-a54438c4a976", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:09:31.650Z", - "conversation": { - "id": "06cce110-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "0f53a620-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:09:31-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "06cce110-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "3eb35847-111c-4ec7-86de-a54438c4a976", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.receipt", - "content": { - "title": "John Doe", - "facts": [ - { - "key": "Order Number", - "value": "1234" - }, - { - "key": "Payment Method", - "value": "VISA 5555-****" - } - ], - "items": [ - { - "title": "Data Transfer", - "image": { - "url": "https://github.com/amido/azure-vector-icons/raw/master/renders/traffic-manager.png" - }, - "price": "$ 38.45", - "quantity": "368" - }, - { - "title": "App Service", - "image": { - "url": "https://github.com/amido/azure-vector-icons/raw/master/renders/cloud-service.png" - }, - "price": "$ 45.00", - "quantity": "720" - } - ], - "total": "$ 90.95", - "tax": "$ 7.50", - "buttons": [ - { - "type": "openUrl", - "title": "More information", - "image": "https://account.windowsazure.com/content/6.10.1.38-.8225.160809-1618/aux-pre/images/offer-icon-freetrial.png", - "value": "https://azure.microsoft.com/en-us/pricing/" - } - ] - } - } - ], - "entities": [], - "replyToId": "0f53a620-616a-11eb-b46e-c3c3213a748e", - "id": "0ff42be0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:09:32-03:00", - "timestamp": "2021-01-28T13:09:32.702Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "06cce110-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "3eb35847-111c-4ec7-86de-a54438c4a976", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "0f53a620-616a-11eb-b46e-c3c3213a748e", - "id": "101fcfc0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:09:32-03:00", - "timestamp": "2021-01-28T13:09:32.988Z" - }, - { - "channelData": { - "clientActivityID": "1611839374573ek608u3396m", - "clientTimestamp": "2021-01-28T13:09:34.573Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "3eb35847-111c-4ec7-86de-a54438c4a976", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:09:34.793Z", - "conversation": { - "id": "06cce110-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "11333b90-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:09:34-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "06cce110-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "3eb35847-111c-4ec7-86de-a54438c4a976", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "11333b90-616a-11eb-b46e-c3c3213a748e", - "id": "11ca2460-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:09:35-03:00", - "timestamp": "2021-01-28T13:09:35.782Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.json deleted file mode 100644 index 74415aeb59..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Signin" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.signin'", - "attachments[0].content.text == 'BotFramework Sign-in Card'", - "attachments[0].content.buttons[0].type == 'signin'", - "attachments[0].content.buttons[0].title == 'Sign-in'", - "attachments[0].content.buttons[0].value == 'https://login.microsoftonline.com/'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.transcript deleted file mode 100644 index 93337e2ddc..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SignIn.transcript +++ /dev/null @@ -1,166 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839446716rvo7eet9ri", - "clientTimestamp": "2021-01-28T13:10:46.716Z" - }, - "text": "Signin", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "1eb07a8c-c293-47ab-aecf-0bf4201e7f43", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:10:46.812Z", - "conversation": { - "id": "32bac261-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "3c209cd0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:10:46-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "32bac261-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "1eb07a8c-c293-47ab-aecf-0bf4201e7f43", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.signin", - "content": { - "text": "BotFramework Sign-in Card", - "buttons": [ - { - "type": "signin", - "title": "Sign-in", - "value": "https://login.microsoftonline.com/" - } - ] - } - } - ], - "entities": [], - "replyToId": "3c209cd0-616a-11eb-b46e-c3c3213a748e", - "id": "3cc47df0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:10:47-03:00", - "timestamp": "2021-01-28T13:10:47.887Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "32bac261-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "1eb07a8c-c293-47ab-aecf-0bf4201e7f43", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "3c209cd0-616a-11eb-b46e-c3c3213a748e", - "id": "3cf0be10-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:10:48-03:00", - "timestamp": "2021-01-28T13:10:48.177Z" - }, - { - "channelData": { - "clientActivityID": "16118394507003s21693ifj8", - "clientTimestamp": "2021-01-28T13:10:50.700Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "1eb07a8c-c293-47ab-aecf-0bf4201e7f43", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:10:50.748Z", - "conversation": { - "id": "32bac261-616a-11eb-881a-afe376da3863|livechat" - }, - "id": "3e790bc0-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:10:50-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "32bac261-616a-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "1eb07a8c-c293-47ab-aecf-0bf4201e7f43", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "3e790bc0-616a-11eb-b46e-c3c3213a748e", - "id": "3f13c520-616a-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:10:51-03:00", - "timestamp": "2021-01-28T13:10:51.762Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.json deleted file mode 100644 index 8509242e40..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "AdaptiveCardSubmitAction" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'TextBlock'", - "attachments[0].content.body[0].text == 'Bot Builder actions'", - "attachments[0].content.body[1].type == 'Input.Text'", - "attachments[0].content.body[1].id == 'x'", - "attachments[0].content.actions[0].type == 'Action.Submit'", - "attachments[0].content.actions[0].data.key == 'value'", - "attachments[0].content.actions[0].title == 'Action.Submit'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.transcript deleted file mode 100644 index 35ffbdf33c..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/SubmitAction.transcript +++ /dev/null @@ -1,179 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839977312o3qfq3addts", - "clientTimestamp": "2021-01-28T13:19:37.312Z" - }, - "text": "AdaptiveCardSumbitAction", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "4ea03367-4ce0-46a8-901f-efcdb37418d3", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:19:37.385Z", - "conversation": { - "id": "6bc8f8a0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "785f7990-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:19:37-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "6bc8f8a0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "4ea03367-4ce0-46a8-901f-efcdb37418d3", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "type": "AdaptiveCard", - "version": "1.2", - "body": [ - { - "type": "TextBlock", - "text": "Bot Builder actions" - }, - { - "type": "Input.Text", - "id": "x" - } - ], - "actions": [ - { - "type": "Action.Submit", - "data": { - "key": "value" - }, - "title": "Action.Submit" - } - ] - } - } - ], - "entities": [], - "replyToId": "785f7990-616b-11eb-b46e-c3c3213a748e", - "id": "78f5ed30-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:19:38-03:00", - "timestamp": "2021-01-28T13:19:38.371Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "6bc8f8a0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "4ea03367-4ce0-46a8-901f-efcdb37418d3", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "785f7990-616b-11eb-b46e-c3c3213a748e", - "id": "79227b70-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:19:38-03:00", - "timestamp": "2021-01-28T13:19:38.663Z" - }, - { - "channelData": { - "clientActivityID": "1611839981867xrs9cyi53o9", - "clientTimestamp": "2021-01-28T13:19:41.867Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "4ea03367-4ce0-46a8-901f-efcdb37418d3", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:19:41.920Z", - "conversation": { - "id": "6bc8f8a0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "7b137600-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:19:41-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "6bc8f8a0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "4ea03367-4ce0-46a8-901f-efcdb37418d3", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "7b137600-616b-11eb-b46e-c3c3213a748e", - "id": "7bbb27b0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:19:43-03:00", - "timestamp": "2021-01-28T13:19:43.019Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.json deleted file mode 100644 index d821b94cfd..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "AdaptiveCardTeamsTaskModule" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'TextBlock'", - "attachments[0].content.body[0].text == 'Task Module Adaptive Card'", - "attachments[0].content.actions[0].type == 'Action.Submit'", - "attachments[0].content.actions[0].data.msteams.type == 'invoke'", - "attachments[0].content.actions[0].title == 'Launch Task Module'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.transcript deleted file mode 100644 index 21df36d5ed..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/TaskModule.transcript +++ /dev/null @@ -1,178 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "16118391929936yytoz4eh0g", - "clientTimestamp": "2021-01-28T13:06:32.993Z" - }, - "text": "AdaptiveCardTaskModule", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "8402a6ae-fe88-4f1b-91cf-6026ed39d32a", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:06:33.044Z", - "conversation": { - "id": "9a706690-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "a4de8940-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:06:33-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "9a706690-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "8402a6ae-fe88-4f1b-91cf-6026ed39d32a", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "type": "AdaptiveCard", - "version": "1.2", - "body": [ - { - "type": "TextBlock", - "text": "Task Module Adaptive Card" - } - ], - "actions": [ - { - "type": "Action.Submit", - "data": { - "msteams": { - "type": "invoke", - "value": "{\r\n \"hiddenKey\": \"hidden value from task module launcher\",\r\n \"type\": \"task/fetch\"\r\n}" - } - }, - "title": "Launch Task Module" - } - ] - } - } - ], - "entities": [], - "replyToId": "a4de8940-6169-11eb-b46e-c3c3213a748e", - "id": "a5a115f0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:06:34-03:00", - "timestamp": "2021-01-28T13:06:34.319Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "9a706690-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "8402a6ae-fe88-4f1b-91cf-6026ed39d32a", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "a4de8940-6169-11eb-b46e-c3c3213a748e", - "id": "a5cd07f0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:06:34-03:00", - "timestamp": "2021-01-28T13:06:34.607Z" - }, - { - "channelData": { - "clientActivityID": "1611839197644k7d79gt7vgr", - "clientTimestamp": "2021-01-28T13:06:37.644Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "8402a6ae-fe88-4f1b-91cf-6026ed39d32a", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:06:37.717Z", - "conversation": { - "id": "9a706690-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "a7a79450-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:06:37-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "9a706690-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "8402a6ae-fe88-4f1b-91cf-6026ed39d32a", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "a7a79450-6169-11eb-b46e-c3c3213a748e", - "id": "a84e0d80-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:06:38-03:00", - "timestamp": "2021-01-28T13:06:38.808Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.json deleted file mode 100644 index abf37c0aff..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Thumbnail" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.thumbnail'", - "attachments[0].content.title == 'BotFramework Thumbnail Card'", - "attachments[0].content.subtitle == 'Microsoft Bot Framework'", - "attachments[0].content.text == 'Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.'", - "attachments[0].content.buttons[0].type == 'openUrl'", - "attachments[0].content.buttons[0].title == 'Get Started'", - "attachments[0].content.buttons[0].value == 'https://docs.microsoft.com/bot-framework'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.transcript deleted file mode 100644 index dbae756d1d..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Thumbnail.transcript +++ /dev/null @@ -1,173 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839317022nw5evtm02lt", - "clientTimestamp": "2021-01-28T13:08:37.022Z" - }, - "text": "Thumbnail", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "341b7ecf-7777-43c0-83a2-2882c6dc6a78", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:08:37.084Z", - "conversation": { - "id": "e57bac80-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "eecd89c0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:08:37-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "e57bac80-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "341b7ecf-7777-43c0-83a2-2882c6dc6a78", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.thumbnail", - "content": { - "title": "BotFramework Thumbnail Card", - "subtitle": "Microsoft Bot Framework", - "text": "Build and connect intelligent bots to interact with your users naturally wherever they are, from text/sms to Skype, Slack, Office 365 mail and other popular services.", - "images": [ - { - "url": "https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg" - } - ], - "buttons": [ - { - "type": "openUrl", - "title": "Get Started", - "value": "https://docs.microsoft.com/bot-framework" - } - ] - } - } - ], - "entities": [], - "replyToId": "eecd89c0-6169-11eb-b46e-c3c3213a748e", - "id": "ef633a10-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:08:38-03:00", - "timestamp": "2021-01-28T13:08:38.064Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "e57bac80-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "341b7ecf-7777-43c0-83a2-2882c6dc6a78", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "eecd89c0-6169-11eb-b46e-c3c3213a748e", - "id": "ef8eb6e0-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:08:38-03:00", - "timestamp": "2021-01-28T13:08:38.350Z" - }, - { - "channelData": { - "clientActivityID": "1611839320481tz2ppzyepo9", - "clientTimestamp": "2021-01-28T13:08:40.481Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "341b7ecf-7777-43c0-83a2-2882c6dc6a78", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:08:40.529Z", - "conversation": { - "id": "e57bac80-6169-11eb-881a-afe376da3863|livechat" - }, - "id": "f0db3410-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:08:40-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "e57bac80-6169-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "341b7ecf-7777-43c0-83a2-2882c6dc6a78", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "f0db3410-6169-11eb-b46e-c3c3213a748e", - "id": "f18e5770-6169-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:08:41-03:00", - "timestamp": "2021-01-28T13:08:41.703Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.json deleted file mode 100644 index 2e96bb8001..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "user", - "text": "Video" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.video'", - "attachments[0].content.title == 'Video Card'", - "attachments[0].content.media[0].url == 'https://www.youtube.com/watch?v=LvqzubPZjHE'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.transcript deleted file mode 100644 index 884aa68788..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/Video.transcript +++ /dev/null @@ -1,164 +0,0 @@ -[ - { - "channelData": { - "clientActivityID": "1611839916459etjxoqosqtr", - "clientTimestamp": "2021-01-28T13:18:36.459Z" - }, - "text": "Video", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7563d50d-a9b1-48fd-aaf9-e0d4d59fc0e2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:18:36.513Z", - "conversation": { - "id": "4b43edb0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "54172510-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:18:36-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "4b43edb0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7563d50d-a9b1-48fd-aaf9-e0d4d59fc0e2", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.video", - "content": { - "title": "Video Card", - "media": [ - { - "url": "https://www.youtube.com/watch?v=LvqzubPZjHE" - } - ] - } - } - ], - "entities": [], - "replyToId": "54172510-616b-11eb-b46e-c3c3213a748e", - "id": "54b86e20-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:18:37-03:00", - "timestamp": "2021-01-28T13:18:37.570Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "4b43edb0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7563d50d-a9b1-48fd-aaf9-e0d4d59fc0e2", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "54172510-616b-11eb-b46e-c3c3213a748e", - "id": "54e4d550-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:18:37-03:00", - "timestamp": "2021-01-28T13:18:37.861Z" - }, - { - "channelData": { - "clientActivityID": "1611839921730zsw4gsfltfm", - "clientTimestamp": "2021-01-28T13:18:41.731Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7563d50d-a9b1-48fd-aaf9-e0d4d59fc0e2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:18:41.787Z", - "conversation": { - "id": "4b43edb0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "573be4b0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:18:41-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "4b43edb0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7563d50d-a9b1-48fd-aaf9-e0d4d59fc0e2", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "573be4b0-616b-11eb-b46e-c3c3213a748e", - "id": "57d31ba0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:18:42-03:00", - "timestamp": "2021-01-28T13:18:42.778Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.json b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.json deleted file mode 100644 index af4438a1de..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "speak == 'Welcome to the waterfall host bot'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'Image'", - "attachments[0].content.body[0].size == 'stretch'", - "attachments[0].content.body[1].type == 'TextBlock'", - "attachments[0].content.body[1].spacing == 'Medium'", - "attachments[0].content.body[1].size == 'Medium'", - "attachments[0].content.body[1].weight == 'Bolder'", - "attachments[0].content.body[1].text == 'Welcome to the Skill Dialog Sample!'", - "attachments[0].content.body[1].wrap == True", - "attachments[0].content.body[1].color == 'Accent'", - "attachments[0].content.body[2].type == 'TextBlock'", - "attachments[0].content.body[2].text == 'This sample allows you to connect to a skill using a SkillDialog and invoke several actions.'", - "attachments[0].content.body[2].wrap == True" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What group of skills would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What group of skills would you like to use?'", - "speak == 'What group of skills would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'", - "suggestedActions.actions[0].value == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Waterfall" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?\n\n 1. WaterfallSkillBotDotNet\n 2. WaterfallSkillBotJS\n 3. WaterfallSkillBotPython", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'What skill would you like to call?')", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "text": "Select an action # to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Select an action to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update'", - "speak == 'Select an action to send to **${TargetSkill}**.'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Cards" - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Got ActivityType: event'", - "name == 'ActivityRouterDialog.ProcessActivityAsync()'" - ] - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Name: Cards. Value: '", - "name == 'ActivityRouterDialog.OnEventActivityAsync()'" - ] - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'What card do you want?'", - "inputHint == 'expectingInput'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.transcript b/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.transcript deleted file mode 100644 index aae2fbe486..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/CardActions/TestScripts/WaterfallGreeting.transcript +++ /dev/null @@ -1,435 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot" - }, - { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "d6088360-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:36-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-28T12:53:36.534Z", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "speak": "Welcome to the waterfall host bot", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] - } - } - ], - "entities": [], - "replyToId": "d6088360-6167-11eb-b46e-c3c3213a748e", - "id": "d71ba110-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:38-03:00", - "timestamp": "2021-01-28T12:53:38.337Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "d6088360-6167-11eb-b46e-c3c3213a748e", - "id": "d75f60d0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:38-03:00", - "timestamp": "2021-01-28T12:53:38.781Z" - }, - { - "channelData": { - "clientActivityID": "1611838423833wj35v7pu64g", - "clientTimestamp": "2021-01-28T12:53:43.833Z" - }, - "text": "normal", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:53:43.851Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "da64ffb0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:43-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "What type of skill would you like to use?", - "speak": "What type of skill would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkill", - "value": "EchoSkill" - }, - { - "type": "imBack", - "title": "WaterfallSkill", - "value": "WaterfallSkill" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "da64ffb0-6167-11eb-b46e-c3c3213a748e", - "id": "db167560-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:45-03:00", - "timestamp": "2021-01-28T12:53:45.014Z" - }, - { - "channelData": { - "clientActivityID": "1611838427337752w1bylwms", - "clientTimestamp": "2021-01-28T12:53:47.337Z" - }, - "text": "WaterfallSkill", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:53:47.402Z", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "dc82d6a0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:47-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "WaterfallSkillBotDotNet", - "value": "WaterfallSkillBotDotNet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "dc82d6a0-6167-11eb-b46e-c3c3213a748e", - "id": "dd207630-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:48-03:00", - "timestamp": "2021-01-28T12:53:48.435Z" - }, - { - "channelData": { - "clientActivityID": "1611838429939ntmad398ck7", - "clientTimestamp": "2021-01-28T12:53:49.939Z" - }, - "text": "WaterfallSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:53:49.965Z", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "de0a12e0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:49-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo", - "speak": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "de0a12e0-6167-11eb-b46e-c3c3213a748e", - "id": "dea31e90-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:50-03:00", - "timestamp": "2021-01-28T12:53:50.969Z" - }, - { - "channelData": { - "clientActivityID": "16118384346899i989qque7t", - "clientTimestamp": "2021-01-28T12:53:54.689Z" - }, - "text": "Cards", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T12:53:54.717Z", - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "id": "e0df04d0-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:54-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "trace", - "timestamp": "2021-01-28T12:53:55.817Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "replyToId": "e0df04d0-6167-11eb-b46e-c3c3213a748e", - "label": "Got ActivityType: event", - "name": "ActivityRouterDialog.ProcessActivityAsync()", - "id": "e186dd90-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:55-03:00" - }, - { - "type": "trace", - "timestamp": "2021-01-28T12:53:56.114Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "replyToId": "e0df04d0-6167-11eb-b46e-c3c3213a748e", - "label": "Name: Cards. Value: ", - "name": "ActivityRouterDialog.OnEventActivityAsync()", - "id": "e1b42f20-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:56-03:00" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "d5f4ad40-6167-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "7da4d5a3-9aaf-4a03-bd62-1495536c852e", - "role": "user" - }, - "locale": "", - "text": "What card do you want?\n\n 1. AdaptiveCardBotAction\n 2. AdaptiveCardTaskModule\n 3. AdaptiveCardSumbitAction\n 4. Hero\n 5. Thumbnail\n 6. Receipt\n 7. Signin\n 8. Carousel\n 9. List\n 10. O365\n 11. TeamsFileConsent\n 12. Animation\n 13. Audio\n 14. Video\n 15. End", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "e0df04d0-6167-11eb-b46e-c3c3213a748e", - "id": "e1e26b10-6167-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T09:53:56-03:00", - "timestamp": "2021-01-28T12:53:56.417Z" - }, -] diff --git a/tests/functional/Tests/SkillFunctionalTests/Common/HostBot.cs b/tests/functional/Tests/SkillFunctionalTests/Common/HostBot.cs deleted file mode 100644 index d2aff8acd7..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/Common/HostBot.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace SkillFunctionalTests.Common -{ - public enum HostBot - { - /// - /// Simple host implemented using Composer and the dotnet runtime. - /// - SimpleHostBotComposerDotNet, - - /// - /// Simple host implemented using dotnet 3.1. - /// - SimpleHostBotDotNet, - - /// - /// Simple host implemented using dotnet 2.1. - /// - SimpleHostBotDotNet21, - - /// - /// Simple host implemented using JS. - /// - SimpleHostBotJS, - - /// - /// Simple host implemented using Python. - /// - SimpleHostBotPython, - - /// - /// Host implemented using dotnet and waterfall dialogs. - /// - WaterfallHostBotDotNet, - - /// - /// Host implemented using JS and waterfall dialogs. - /// - WaterfallHostBotJS, - - /// - /// Host implemented using Python and waterfall dialogs. - /// - WaterfallHostBotPython, - - /// - /// Host implemented for LegacyTests. - /// - EchoHostBot - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/Common/SkillBotNames.cs b/tests/functional/Tests/SkillFunctionalTests/Common/SkillBotNames.cs deleted file mode 100644 index 2b1422ca76..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/Common/SkillBotNames.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace SkillFunctionalTests.Common -{ - public static class SkillBotNames - { - public const string EchoSkillBotComposerDotNet = "EchoSkillBotComposerDotNet"; - public const string EchoSkillBotDotNet = "EchoSkillBotDotNet"; - public const string EchoSkillBotDotNet21 = "EchoSkillBotDotNet21"; - public const string EchoSkillBotDotNetV3 = "EchoSkillBotDotNetV3"; - public const string EchoSkillBotJS = "EchoSkillBotJS"; - public const string EchoSkillBotJSV3 = "EchoSkillBotJSV3"; - public const string EchoSkillBotPython = "EchoSkillBotPython"; - - public const string WaterfallSkillBotDotNet = "WaterfallSkillBotDotNet"; - public const string WaterfallSkillBotJS = "WaterfallSkillBotJS"; - public const string WaterfallSkillBotPython = "WaterfallSkillBotPython"; - - public const string EchoSkillBot = "EchoSkillBot"; - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/FileUploadTests.cs b/tests/functional/Tests/SkillFunctionalTests/FileUpload/FileUploadTests.cs deleted file mode 100644 index 084da720be..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/FileUploadTests.cs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.FileUpload -{ - [Trait("TestCategory", "FileUpload")] - public class FileUploadTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/FileUpload/TestScripts"; - - public FileUploadTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies - }; - - var hostBots = new List - { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython - - // TODO: Enable these when the port to composer is ready - //HostBotNames.ComposerHostBotDotNet - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotJS, - SkillBotNames.WaterfallSkillBotPython - - // TODO: Enable these when the port to composer is ready - //SkillBotNames.ComposerSkillBotDotNet - }; - - var scripts = new List - { - "FileUpload1.json" - }; - - var testCaseBuilder = new TestCaseBuilder(); - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public async Task RunTestCases(TestCaseDataObject testData) - { - const string fileName = "TestFile.txt"; - var testGuid = Guid.NewGuid().ToString(); - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - var options = TestClientOptions[testCase.HostBot]; - var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); - - // Execute the first part of the conversation. - var testParams = new Dictionary - { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill }, - { "FileName", fileName }, - { "TestGuid", testGuid } - }; - - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParams); - - // Create or Update testFile. - await using var stream = File.OpenWrite(Directory.GetCurrentDirectory() + $"/FileUpload/Media/{fileName}"); - await using var writer = new StreamWriter(stream); - await writer.WriteLineAsync($"GUID:{testGuid}"); - writer.Close(); - - // Upload file. - await using var file = File.OpenRead(Directory.GetCurrentDirectory() + $"/FileUpload/Media/{fileName}"); - await runner.UploadAsync(file); - - // Execute the rest of the conversation. - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, "FileUpload2.json"), testParams); - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/Media/TestFile.txt b/tests/functional/Tests/SkillFunctionalTests/FileUpload/Media/TestFile.txt deleted file mode 100644 index af27ff4986..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/Media/TestFile.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file. \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.json b/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.json deleted file mode 100644 index 45098d7133..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "speak == 'Welcome to the waterfall host bot'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'Image'", - "attachments[0].content.body[0].size == 'stretch'", - "attachments[0].content.body[1].type == 'TextBlock'", - "attachments[0].content.body[1].spacing == 'Medium'", - "attachments[0].content.body[1].size == 'Medium'", - "attachments[0].content.body[1].weight == 'Bolder'", - "attachments[0].content.body[1].text == 'Welcome to the Skill Dialog Sample!'", - "attachments[0].content.body[1].wrap == true", - "attachments[0].content.body[1].color == 'Accent'", - "attachments[0].content.body[2].type == 'TextBlock'", - "attachments[0].content.body[2].text == 'This sample allows you to connect to a skill using a SkillDialog and invoke several actions.'", - "attachments[0].content.body[2].wrap == true" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What group of skills would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What group of skills would you like to use?'", - "speak == 'What group of skills would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'", - "suggestedActions.actions[0].value == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Waterfall" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?\n\n 1. WaterfallSkillBotDotNet\n 2. WaterfallSkillBotJS\n 3. WaterfallSkillBotPython", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'What skill would you like to call?')", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "text": "Select an action to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Select an action to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update'", - "speak == 'Select an action to send to **${TargetSkill}**.'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "FileUpload" - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Got ActivityType: event'", - "name == 'ActivityRouterDialog.ProcessActivityAsync()'" - ] - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Name: FileUpload. Value: '", - "name == 'ActivityRouterDialog.OnEventActivityAsync()'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Please upload a file to continue.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Please upload a file to continue.'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.transcript b/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.transcript deleted file mode 100644 index cc5270a21e..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload1.transcript +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot" - }, - { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "id": "cd00e2e0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:14-03:00", - "recipient": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-27T19:28:14.862Z", - "from": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User", - "role": "user" - }, - "locale": "en-US", - "serviceUrl": "https://506512dd91f3.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "en-US", - "speak": "Welcome to the waterfall host bot", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] - } - } - ], - "entities": [], - "replyToId": "cd00e2e0-60d5-11eb-9a74-bb9adba325d2", - "id": "cdb9f9b0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:16-03:00", - "timestamp": "2021-01-27T19:28:16.075Z" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "cd00e2e0-60d5-11eb-9a74-bb9adba325d2", - "id": "cde04660-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:16-03:00", - "timestamp": "2021-01-27T19:28:16.326Z" - }, - { - "channelData": { - "clientActivityID": "16117756974587xlkqssva0r", - "clientTimestamp": "2021-01-27T19:28:17.458Z" - }, - "text": "normal", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User", - "role": "user" - }, - "locale": "en-US", - "timestamp": "2021-01-27T19:28:17.472Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "id": "ce8f2400-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:17-03:00", - "recipient": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://506512dd91f3.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "text": "What type of skill would you like to use?", - "speak": "What type of skill would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkill", - "value": "EchoSkill" - }, - { - "type": "imBack", - "title": "WaterfallSkill", - "value": "WaterfallSkill" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "ce8f2400-60d5-11eb-9a74-bb9adba325d2", - "id": "cf180310-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:18-03:00", - "timestamp": "2021-01-27T19:28:18.369Z" - }, - { - "channelData": { - "clientActivityID": "1611775699426cx57468bwb6", - "clientTimestamp": "2021-01-27T19:28:19.427Z" - }, - "text": "WaterfallSkill", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User", - "role": "user" - }, - "locale": "en-US", - "timestamp": "2021-01-27T19:28:19.441Z", - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "id": "cfbb9610-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:19-03:00", - "recipient": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://506512dd91f3.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "WaterfallSkillBotDotNet", - "value": "WaterfallSkillBotDotNet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "cfbb9610-60d5-11eb-9a74-bb9adba325d2", - "id": "d04363b0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:20-03:00", - "timestamp": "2021-01-27T19:28:20.331Z" - }, - { - "channelData": { - "clientActivityID": "1611775701238btqor6clvrg", - "clientTimestamp": "2021-01-27T19:28:21.238Z" - }, - "text": "WaterfallSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User", - "role": "user" - }, - "locale": "en-US", - "timestamp": "2021-01-27T19:28:21.255Z", - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "id": "d0d06170-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:21-03:00", - "recipient": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://506512dd91f3.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "text": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo", - "speak": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "d0d06170-60d5-11eb-9a74-bb9adba325d2", - "id": "d15a7900-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:22-03:00", - "timestamp": "2021-01-27T19:28:22.159Z" - }, - { - "channelData": { - "clientActivityID": "1611775705642g7ss96aqemf", - "clientTimestamp": "2021-01-27T19:28:25.642Z" - }, - "text": "FileUpload", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "name": "User", - "role": "user" - }, - "locale": "en-US", - "timestamp": "2021-01-27T19:28:25.677Z", - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "id": "d3731fd0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:25-03:00", - "recipient": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://506512dd91f3.ngrok.io" - }, - { - "type": "trace", - "timestamp": "2021-01-27T19:28:26.806Z", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "replyToId": "d3731fd0-60d5-11eb-9a74-bb9adba325d2", - "label": "Got ActivityType: event", - "name": "ActivityRouterDialog.ProcessActivityAsync()", - "id": "d41f6560-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:26-03:00" - }, - { - "type": "trace", - "timestamp": "2021-01-27T19:28:27.070Z", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "replyToId": "d3731fd0-60d5-11eb-9a74-bb9adba325d2", - "label": "Name: FileUpload. Value: ", - "name": "ActivityRouterDialog.OnEventActivityAsync()", - "id": "d447ade0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:27-03:00" - }, - { - "type": "message", - "serviceUrl": "https://506512dd91f3.ngrok.io", - "channelId": "emulator", - "from": { - "id": "cc657090-60b1-11eb-8abe-e3b86321e5ec", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "ccf941c0-60d5-11eb-8abe-e3b86321e5ec|livechat" - }, - "recipient": { - "id": "ff961b1d-815c-4e98-87fd-ac1db5ea78a3", - "role": "user" - }, - "locale": "en-US", - "text": "Please upload a file to continue.", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "d3731fd0-60d5-11eb-9a74-bb9adba325d2", - "id": "d46e6fc0-60d5-11eb-9a74-bb9adba325d2", - "localTimestamp": "2021-01-27T16:28:27-03:00", - "timestamp": "2021-01-27T19:28:27.324Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.json b/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.json deleted file mode 100644 index 49696744d4..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "bot", - "text": "Attachment \"${FileName}\" has been received.\r\nFile content: GUID:${TestGuid}\r\n\r\n", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'Attachment \"${FileName}\" has been received.\r\nFile content: GUID:${TestGuid}')", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Do you want to upload another file?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Do you want to upload another file?'", - "speak == 'Do you want to upload another file?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Yes'", - "suggestedActions.actions[0].value == 'Yes'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'No'", - "suggestedActions.actions[1].value == 'No'" - ] - }, - { - "type": "message", - "role": "user", - "text": "No" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.transcript b/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.transcript deleted file mode 100644 index d785b4b3ff..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/FileUpload/TestScripts/FileUpload2.transcript +++ /dev/null @@ -1,138 +0,0 @@ -[ - { - "type": "message", - "serviceUrl": "https://7e981c20ff5a.ngrok.io", - "channelId": "emulator", - "from": { - "id": "19b99450-a209-11eb-9135-ffc715768685", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "19c30a30-a209-11eb-8b44-53ccf8d65f4d|livechat" - }, - "recipient": { - "id": "0c3116ae-0d26-4a5f-8483-1082c9ab6c7f", - "role": "user" - }, - "locale": "", - "text": "Attachment \"test2.txt\" has been received.\r\nFile content: GUID:1234\r\n", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "2df8af51-a209-11eb-8b44-53ccf8d65f4d", - "id": "2ed3cd10-a209-11eb-8b44-53ccf8d65f4d", - "localTimestamp": "2021-04-20T15:49:48-03:00", - "timestamp": "2021-04-20T18:49:48.897Z" - }, - { - "type": "message", - "serviceUrl": "https://7e981c20ff5a.ngrok.io", - "channelId": "emulator", - "from": { - "id": "19b99450-a209-11eb-9135-ffc715768685", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "19c30a30-a209-11eb-8b44-53ccf8d65f4d|livechat" - }, - "recipient": { - "id": "0c3116ae-0d26-4a5f-8483-1082c9ab6c7f", - "role": "user" - }, - "locale": "", - "text": "Do you want to upload another file?", - "speak": "Do you want to upload another file?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "Yes", - "value": "Yes" - }, - { - "type": "imBack", - "title": "No", - "value": "No" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "2df8af51-a209-11eb-8b44-53ccf8d65f4d", - "id": "2f160630-a209-11eb-8b44-53ccf8d65f4d", - "localTimestamp": "2021-04-20T15:49:49-03:00", - "timestamp": "2021-04-20T18:49:49.331Z" - }, - { - "channelData": { - "clientActivityID": "1618944597322y3mgzbre63", - "clientTimestamp": "2021-04-20T18:49:57.322Z" - }, - "text": "No", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0c3116ae-0d26-4a5f-8483-1082c9ab6c7f", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-04-20T18:49:57.359Z", - "conversation": { - "id": "19c30a30-a209-11eb-8b44-53ccf8d65f4d|livechat" - }, - "id": "33defff0-a209-11eb-8b44-53ccf8d65f4d", - "localTimestamp": "2021-04-20T15:49:57-03:00", - "recipient": { - "id": "19b99450-a209-11eb-9135-ffc715768685", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://7e981c20ff5a.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://7e981c20ff5a.ngrok.io", - "channelId": "emulator", - "from": { - "id": "19b99450-a209-11eb-9135-ffc715768685", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "19c30a30-a209-11eb-8b44-53ccf8d65f4d|livechat" - }, - "recipient": { - "id": "0c3116ae-0d26-4a5f-8483-1082c9ab6c7f", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "33defff0-a209-11eb-8b44-53ccf8d65f4d", - "id": "34157940-a209-11eb-8b44-53ccf8d65f4d", - "localTimestamp": "2021-04-20T15:49:57-03:00", - "timestamp": "2021-04-20T18:49:57.716Z" - } -] \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.json b/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.json deleted file mode 100644 index 3efa3c468d..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.json +++ /dev/null @@ -1,281 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "speak == 'Welcome to the waterfall host bot'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'Image'", - "attachments[0].content.body[0].size == 'stretch'", - "attachments[0].content.body[1].type == 'TextBlock'", - "attachments[0].content.body[1].spacing == 'Medium'", - "attachments[0].content.body[1].size == 'Medium'", - "attachments[0].content.body[1].weight == 'Bolder'", - "attachments[0].content.body[1].text == 'Welcome to the Skill Dialog Sample!'", - "attachments[0].content.body[1].wrap == True", - "attachments[0].content.body[1].color == 'Accent'", - "attachments[0].content.body[2].type == 'TextBlock'", - "attachments[0].content.body[2].text == 'This sample allows you to connect to a skill using a SkillDialog and invoke several actions.'", - "attachments[0].content.body[2].wrap == True" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What group of skills would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What group of skills would you like to use?'", - "speak == 'What group of skills would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'", - "suggestedActions.actions[0].value == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Waterfall" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?\n\n 1. WaterfallSkillBotDotNet\n 2. WaterfallSkillBotJS\n 3. WaterfallSkillBotPython", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'What skill would you like to call?')", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "text": "Select an action # to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Select an action to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update'", - "speak == 'Select an action to send to **${TargetSkill}**.'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "MessageWithAttachment" - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Got ActivityType: event'", - "name == 'ActivityRouterDialog.ProcessActivityAsync()'" - ] - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Name: Attachment. Value: '", - "name == 'ActivityRouterDialog.OnEventActivityAsync()'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What attachment type do you want?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What attachment type do you want?'", - "speak == 'What attachment type do you want?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Inline'", - "suggestedActions.actions[0].value == 'Inline'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'Internet'", - "suggestedActions.actions[1].value == 'Internet'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Inline" - }, - { - "type": "message", - "role": "bot", - "text": "This is an inline attachment.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'This is an inline attachment.'", - "inputHint == 'ignoringInput'", - "attachments[0].contentType == 'image/png'", - "attachments[0].name == 'Files/architecture-resize.png'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Do you want another type of attachment?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Do you want another type of attachment?'", - "speak == 'Do you want another type of attachment?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Yes'", - "suggestedActions.actions[0].value == 'Yes'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'No'", - "suggestedActions.actions[1].value == 'No'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Yes" - }, - { - "type": "message", - "role": "bot", - "text": "What attachment type do you want?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What attachment type do you want?'", - "speak == 'What attachment type do you want?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Inline'", - "suggestedActions.actions[0].value == 'Inline'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'Internet'", - "suggestedActions.actions[1].value == 'Internet'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Internet" - }, - { - "type": "message", - "role": "bot", - "text": "This is an attachment from a HTTP URL.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'This is an attachment from a HTTP URL.'", - "inputHint == 'ignoringInput'", - "attachments[0].contentType == 'image/png'", - "endsWith(attachments[0].contentUrl, 'images/architecture-resize.png')", - "attachments[0].name == 'Files/architecture-resize.png'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Do you want another type of attachment?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Do you want another type of attachment?'", - "speak == 'Do you want another type of attachment?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Yes'", - "suggestedActions.actions[0].value == 'Yes'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'No'", - "suggestedActions.actions[1].value == 'No'" - ] - }, - { - "type": "message", - "role": "user", - "text": "No" - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.transcript b/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.transcript deleted file mode 100644 index 112a5cde62..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/MessageWithAttachment/TestScripts/MessageWithAttachment.transcript +++ /dev/null @@ -1,789 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot" - }, - { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "9496dfd0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:34-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-28T13:27:34.221Z", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "speak": "Welcome to the waterfall host bot", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] - } - } - ], - "entities": [], - "replyToId": "9496dfd0-616c-11eb-b46e-c3c3213a748e", - "id": "9544fa20-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:35-03:00", - "timestamp": "2021-01-28T13:27:35.362Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "9496dfd0-616c-11eb-b46e-c3c3213a748e", - "id": "956e2d00-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:35-03:00", - "timestamp": "2021-01-28T13:27:35.632Z" - }, - { - "channelData": { - "clientActivityID": "1611840456587v84hgz17ny8", - "clientTimestamp": "2021-01-28T13:27:36.587Z" - }, - "text": "normal", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:27:36.608Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "96031a00-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:36-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "What type of skill would you like to use?", - "speak": "What type of skill would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkill", - "value": "EchoSkill" - }, - { - "type": "imBack", - "title": "WaterfallSkill", - "value": "WaterfallSkill" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "96031a00-616c-11eb-b46e-c3c3213a748e", - "id": "96980700-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:37-03:00", - "timestamp": "2021-01-28T13:27:37.584Z" - }, - { - "channelData": { - "clientActivityID": "16118404585657p5vbek9bxa", - "clientTimestamp": "2021-01-28T13:27:38.565Z" - }, - "text": "WaterfallSkill", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:27:38.588Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "973139c0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:38-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "WaterfallSkillBotDotNet", - "value": "WaterfallSkillBotDotNet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "973139c0-616c-11eb-b46e-c3c3213a748e", - "id": "97cf2770-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:39-03:00", - "timestamp": "2021-01-28T13:27:39.623Z" - }, - { - "channelData": { - "clientActivityID": "1611840461032eejmg7hkwgc", - "clientTimestamp": "2021-01-28T13:27:41.032Z" - }, - "text": "WaterfallSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:27:41.053Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "98a95ad0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:41-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo", - "speak": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "98a95ad0-616c-11eb-b46e-c3c3213a748e", - "id": "993e6ee0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:42-03:00", - "timestamp": "2021-01-28T13:27:42.029Z" - }, - { - "channelData": { - "clientActivityID": "1611840465174eu3jly2odgv", - "clientTimestamp": "2021-01-28T13:27:45.174Z" - }, - "text": "4", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:27:45.203Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "9b229830-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:45-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "trace", - "timestamp": "2021-01-28T13:27:46.200Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "replyToId": "9b229830-616c-11eb-b46e-c3c3213a748e", - "label": "Got ActivityType: event", - "name": "ActivityRouterDialog.ProcessActivityAsync()", - "id": "9bbab980-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:46-03:00" - }, - { - "type": "trace", - "timestamp": "2021-01-28T13:27:46.485Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "replyToId": "9b229830-616c-11eb-b46e-c3c3213a748e", - "label": "Name: MessageWithAttachment. Value: ", - "name": "ActivityRouterDialog.OnEventActivityAsync()", - "id": "9be63650-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:46-03:00" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "What card do you want?", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "Inline", - "value": "Inline" - }, - { - "type": "imBack", - "title": "Internet", - "value": "Internet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "9b229830-616c-11eb-b46e-c3c3213a748e", - "id": "9c10efd0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:27:46-03:00", - "timestamp": "2021-01-28T13:27:46.765Z" - }, - { - "channelData": { - "clientActivityID": "16118405051429uurdklppdu", - "clientTimestamp": "2021-01-28T13:28:25.142Z" - }, - "text": "Inline", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:28:25.198Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "b2f958e0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:28:25-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "This is an inline attachment.", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "image/png", - "contentUrl": "data:image/png;base64,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", - "name": "Files\\architecture-resize.png" - } - ], - "entities": [], - "replyToId": "b2f958e0-616c-11eb-b46e-c3c3213a748e", - "id": "b57b96f0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:28:29-03:00", - "timestamp": "2021-01-28T13:28:29.407Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "Do you want another type of attachment?", - "speak": "Do you want another type of attachment?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "Yes", - "value": "Yes" - }, - { - "type": "imBack", - "title": "No", - "value": "No" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "b2f958e0-616c-11eb-b46e-c3c3213a748e", - "id": "b5a82530-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:28:29-03:00", - "timestamp": "2021-01-28T13:28:29.699Z" - }, - { - "channelData": { - "clientActivityID": "16118405370383nul2pf807g", - "clientTimestamp": "2021-01-28T13:28:57.038Z" - }, - "text": "Yes", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:28:57.116Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "c5ffa5c0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:28:57-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "What card do you want?", - "speak": "What card do you want?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "Inline", - "value": "Inline" - }, - { - "type": "imBack", - "title": "Internet", - "value": "Internet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "c5ffa5c0-616c-11eb-b46e-c3c3213a748e", - "id": "c6c4f190-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:28:58-03:00", - "timestamp": "2021-01-28T13:28:58.409Z" - }, - { - "channelData": { - "clientActivityID": "16118405437189fvw0nchfd", - "clientTimestamp": "2021-01-28T13:29:03.718Z" - }, - "text": "Internet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:29:03.775Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "c9f7baf0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:29:03-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "This is an attachment from a HTTP URL.", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "image/png", - "contentUrl": "https://docs.microsoft.com/en-us/bot-framework/media/how-it-works/architecture-resize.png", - "name": "Files\\architecture-resize.png" - } - ], - "entities": [], - "replyToId": "c9f7baf0-616c-11eb-b46e-c3c3213a748e", - "id": "caae87d0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:29:04-03:00", - "timestamp": "2021-01-28T13:29:04.973Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "Do you want another type of attachment?", - "speak": "Do you want another type of attachment?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "Yes", - "value": "Yes" - }, - { - "type": "imBack", - "title": "No", - "value": "No" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "c9f7baf0-616c-11eb-b46e-c3c3213a748e", - "id": "cad9dd90-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:29:05-03:00", - "timestamp": "2021-01-28T13:29:05.257Z" - }, - { - "channelData": { - "clientActivityID": "1611840562624thw0ki5mdtf", - "clientTimestamp": "2021-01-28T13:29:22.624Z" - }, - "text": "No", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:29:22.702Z", - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "id": "d53fc2e0-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:29:22-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "94732b31-616c-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "0db3a1e0-bca8-4e54-af83-13efe060d8dd", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "d53fc2e0-616c-11eb-b46e-c3c3213a748e", - "id": "d5dffa80-616c-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:29:23-03:00", - "timestamp": "2021-01-28T13:29:23.752Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/ProactiveTests.cs b/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/ProactiveTests.cs deleted file mode 100644 index cf5fb00613..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/ProactiveTests.cs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.ProactiveMessages -{ - [Trait("TestCategory", "ProactiveMessages")] - public class ProactiveTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/ProactiveMessages/TestScripts"; - - public ProactiveTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies - }; - - var hostBots = new List - { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython, - - // TODO: Enable this when the port to composer is ready - //HostBot.ComposerHostBotDotNet - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotPython, - - // TODO: Enable these when the ports to JS, and composer are ready - //SkillBotNames.WaterfallSkillBotJS, - //SkillBotNames.ComposerSkillBotDotNet - }; - - var scripts = new List - { - "ProactiveStart.json", - }; - - var testCaseBuilder = new TestCaseBuilder(); - - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public async Task RunTestCases(TestCaseDataObject testData) - { - var userId = string.Empty; - var url = string.Empty; - - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - var options = TestClientOptions[testCase.HostBot]; - var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); - - var testParamsStart = new Dictionary - { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill } - }; - - // Execute the first part of the conversation. - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParamsStart); - - await runner.AssertReplyAsync(activity => - { - Assert.Equal(ActivityTypes.Message, activity.Type); - Assert.Contains("Navigate to http", activity.Text); - - var message = activity.Text.Split(" "); - url = message[2]; - userId = url.Split("user=")[1]; - }); - - // Send a get request to the message's url to continue the conversation. - using (var client = new HttpClient()) - { - await client.GetAsync(url).ConfigureAwait(false); - } - - var testParamsEnd = new Dictionary - { - { "UserId", userId }, - { "TargetSkill", testCase.TargetSkill } - }; - - // Execute the rest of the conversation passing the messageId. - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, "ProactiveEnd.json"), testParamsEnd); - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.json b/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.json deleted file mode 100644 index 9e6671b8d0..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "bot", - "text": "Got proactive message for user: ${UserId}", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Got proactive message for user: ${UserId}'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "We received a proactive message, ending the dialog", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'We received a proactive message, ending the dialog'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.transcript b/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.transcript deleted file mode 100644 index 0ee0498b53..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveEnd.transcript +++ /dev/null @@ -1,91 +0,0 @@ -[ - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "Got proactive message for user: ${UserId}", - "inputHint": "acceptingInput", - "replyToId": "5dfebb53-9851-449a-a86f-dff9a9155816", - "id": "f44c7b20-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:23:05-03:00", - "timestamp": "2021-01-28T13:23:05.298Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "We received a proactive message, ending the dialog", - "inputHint": "acceptingInput", - "replyToId": "5dfebb53-9851-449a-a86f-dff9a9155816", - "id": "f4789430-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:23:05-03:00", - "timestamp": "2021-01-28T13:23:05.587Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "5dfebb53-9851-449a-a86f-dff9a9155816", - "id": "f4a4fb60-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:23:05-03:00", - "timestamp": "2021-01-28T13:23:05.878Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.json b/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.json deleted file mode 100644 index 1f1b1108d8..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "speak == 'Welcome to the waterfall host bot'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'Image'", - "attachments[0].content.body[0].size == 'stretch'", - "attachments[0].content.body[1].type == 'TextBlock'", - "attachments[0].content.body[1].spacing == 'Medium'", - "attachments[0].content.body[1].size == 'Medium'", - "attachments[0].content.body[1].weight == 'Bolder'", - "attachments[0].content.body[1].text == 'Welcome to the Skill Dialog Sample!'", - "attachments[0].content.body[1].wrap == True", - "attachments[0].content.body[1].color == 'Accent'", - "attachments[0].content.body[2].type == 'TextBlock'", - "attachments[0].content.body[2].text == 'This sample allows you to connect to a skill using a SkillDialog and invoke several actions.'", - "attachments[0].content.body[2].wrap == True" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What group of skills would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What group of skills would you like to use?'", - "speak == 'What group of skills would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'", - "suggestedActions.actions[0].value == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Waterfall" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?\n\n 1. WaterfallSkillBotDotNet\n 2. WaterfallSkillBotJS\n 3. WaterfallSkillBotPython", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'What skill would you like to call?')", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "text": "Select an action # to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Select an action to send to **${TargetSkill}**.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo\n 8. Delete\n 9. Update'", - "speak == 'Select an action to send to **${TargetSkill}**.'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Proactive" - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Got ActivityType: event'", - "name == 'ActivityRouterDialog.ProcessActivityAsync()'" - ] - }, - { - "type": "trace", - "role": "bot", - "assertions": [ - "type == 'trace'", - "from.role == 'bot'", - "recipient.role == 'user'", - "label == 'Name: Proactive. Value: '", - "name == 'ActivityRouterDialog.OnEventActivityAsync()'" - ] - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.transcript b/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.transcript deleted file mode 100644 index ef34517760..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/ProactiveMessages/TestScripts/ProactiveStart.transcript +++ /dev/null @@ -1,408 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot" - }, - { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "981e0030-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:30-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-28T13:20:30.643Z", - "from": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User", - "role": "user" - }, - "locale": "", - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "speak": "Welcome to the waterfall host bot", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] - } - } - ], - "entities": [], - "replyToId": "981e0030-616b-11eb-b46e-c3c3213a748e", - "id": "98f26730-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:32-03:00", - "timestamp": "2021-01-28T13:20:32.035Z" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "981e0030-616b-11eb-b46e-c3c3213a748e", - "id": "991c0f40-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:32-03:00", - "timestamp": "2021-01-28T13:20:32.308Z" - }, - { - "channelData": { - "clientActivityID": "1611840033447rjp2jvkf9jk", - "clientTimestamp": "2021-01-28T13:20:33.447Z" - }, - "text": "normal", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:20:33.472Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "99cdac00-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:33-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "What type of skill would you like to use?", - "speak": "What type of skill would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkill", - "value": "EchoSkill" - }, - { - "type": "imBack", - "title": "WaterfallSkill", - "value": "WaterfallSkill" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "99cdac00-616b-11eb-b46e-c3c3213a748e", - "id": "9a618790-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:34-03:00", - "timestamp": "2021-01-28T13:20:34.441Z" - }, - { - "channelData": { - "clientActivityID": "1611840035554f72iioqm5u6", - "clientTimestamp": "2021-01-28T13:20:35.554Z" - }, - "text": "WaterfallSkill", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:20:35.584Z", - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "9b0ff000-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:35-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "WaterfallSkillBotDotNet", - "value": "WaterfallSkillBotDotNet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "9b0ff000-616b-11eb-b46e-c3c3213a748e", - "id": "9babe1e0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:36-03:00", - "timestamp": "2021-01-28T13:20:36.606Z" - }, - { - "channelData": { - "clientActivityID": "1611840037630e91nk7asij4", - "clientTimestamp": "2021-01-28T13:20:37.630Z" - }, - "text": "WaterfallSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:20:37.663Z", - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "9c4d2af0-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:37-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "text": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo", - "speak": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "9c4d2af0-616b-11eb-b46e-c3c3213a748e", - "id": "9ce30250-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:38-03:00", - "timestamp": "2021-01-28T13:20:38.645Z" - }, - { - "channelData": { - "clientActivityID": "16118400442741u2eexpiomv", - "clientTimestamp": "2021-01-28T13:20:44.274Z" - }, - "text": "Proactive", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-28T13:20:44.313Z", - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "id": "a043e090-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:44-03:00", - "recipient": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://9ed82cccfc76.ngrok.io" - }, - { - "type": "trace", - "timestamp": "2021-01-28T13:20:45.553Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "replyToId": "a043e090-616b-11eb-b46e-c3c3213a748e", - "label": "Got ActivityType: event", - "name": "ActivityRouterDialog.ProcessActivityAsync()", - "id": "a1011610-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:45-03:00" - }, - { - "type": "trace", - "timestamp": "2021-01-28T13:20:45.845Z", - "serviceUrl": "https://9ed82cccfc76.ngrok.io", - "channelId": "emulator", - "from": { - "id": "48224d50-60a5-11eb-881a-afe376da3863", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "980966c0-616b-11eb-881a-afe376da3863|livechat" - }, - "recipient": { - "id": "bc95d182-9d74-4d9d-82ec-d650cb5e83d8", - "role": "user" - }, - "locale": "", - "replyToId": "a043e090-616b-11eb-b46e-c3c3213a748e", - "label": "Name: Proactive. Value: ", - "name": "ActivityRouterDialog.OnEventActivityAsync()", - "id": "a12da450-616b-11eb-b46e-c3c3213a748e", - "localTimestamp": "2021-01-28T10:20:45-03:00" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/SignIn/SignInTests.cs b/tests/functional/Tests/SkillFunctionalTests/SignIn/SignInTests.cs deleted file mode 100644 index abbb3582c7..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SignIn/SignInTests.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.SignIn -{ - [Trait("TestCategory", "SignIn")] - public class SignInTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/SignIn/TestScripts"; - - public SignInTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies, - }; - - var hostBots = new List - { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython, - - // TODO: Enable this when the port to composer is ready - //HostBot.ComposerHostBotDotNet - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotJS, - SkillBotNames.WaterfallSkillBotPython, - - // TODO: Enable this when the port to composer is ready - //SkillBotNames.ComposerSkillBotDotNet - }; - - var scripts = new List - { - "SignIn1.json" - }; - - var testCaseBuilder = new TestCaseBuilder(); - - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public async Task RunTestCases(TestCaseDataObject testData) - { - var signInUrl = string.Empty; - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - var options = TestClientOptions[testCase.HostBot]; - var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); - - var testParams = new Dictionary - { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill } - }; - - // Execute the first part of the conversation. - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParams); - - await runner.AssertReplyAsync(activity => - { - Assert.Equal(ActivityTypes.Message, activity.Type); - Assert.True(activity.Attachments.Count > 0); - - var card = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(activity.Attachments.FirstOrDefault().Content)); - signInUrl = card.Buttons[0].Value?.ToString(); - - Assert.False(string.IsNullOrEmpty(signInUrl)); - }); - - // Execute the SignIn. - await runner.ClientSignInAsync(signInUrl); - - // Execute the rest of the conversation passing the messageId. - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, "SignIn2.json"), testParams); - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.json b/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.json deleted file mode 100644 index 75f761289a..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "attachmentLayout == 'list'", - "speak == 'Welcome to the waterfall host bot'", - "inputHint == 'acceptingInput'", - "attachments[0].contentType == 'application/vnd.microsoft.card.adaptive'", - "attachments[0].content.type == 'AdaptiveCard'", - "attachments[0].content.body[0].type == 'Image'", - "attachments[0].content.body[0].size == 'stretch'", - "attachments[0].content.body[1].type == 'TextBlock'", - "attachments[0].content.body[1].spacing == 'Medium'", - "attachments[0].content.body[1].size == 'Medium'", - "attachments[0].content.body[1].weight == 'Bolder'", - "attachments[0].content.body[1].text == 'Welcome to the Skill Dialog Sample!'", - "attachments[0].content.body[1].wrap == True", - "attachments[0].content.body[1].color == 'Accent'", - "attachments[0].content.body[2].type == 'TextBlock'", - "attachments[0].content.body[2].text == 'This sample allows you to connect to a skill using a SkillDialog and invoke several actions.'", - "attachments[0].content.body[2].wrap == True" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What group of skills would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What group of skills would you like to use?'", - "speak == 'What group of skills would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'", - "suggestedActions.actions[0].value == 'Echo' || suggestedActions.actions[0].title == 'Waterfall' || suggestedActions.actions[0].title == 'Teams'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Waterfall" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?\n\n 1. WaterfallSkillBotDotNet\n 2. WaterfallSkillBotJS\n 3. WaterfallSkillBotPython", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "startsWith(text, 'What skill would you like to call?')", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Auth" - } - ] -} diff --git a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.transcript b/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.transcript deleted file mode 100644 index 71181719c3..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn1.transcript +++ /dev/null @@ -1,360 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot" - }, - { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "id": "da5e8130-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T15:59:59-03:00", - "recipient": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-27T18:59:59.299Z", - "from": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User", - "role": "user" - }, - "locale": "", - "serviceUrl": "https://259039676c61.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "attachmentLayout": "list", - "locale": "", - "speak": "Welcome to the waterfall host bot", - "inputHint": "acceptingInput", - "attachments": [ - { - "contentType": "application/vnd.microsoft.card.adaptive", - "content": { - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] - } - } - ], - "entities": [], - "replyToId": "da5e8130-60d1-11eb-8b98-b971494822a6", - "id": "db473380-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:00-03:00", - "timestamp": "2021-01-27T19:00:00.824Z" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "da5e8130-60d1-11eb-8b98-b971494822a6", - "id": "db7129b0-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:01-03:00", - "timestamp": "2021-01-27T19:00:01.099Z" - }, - { - "channelData": { - "clientActivityID": "16117740025163t1zr5cif", - "clientTimestamp": "2021-01-27T19:00:02.516Z" - }, - "text": "normal", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-27T19:00:02.528Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "id": "dc4b3600-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:02-03:00", - "recipient": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://259039676c61.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "What type of skill would you like to use?", - "speak": "What type of skill would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkill", - "value": "EchoSkill" - }, - { - "type": "imBack", - "title": "WaterfallSkill", - "value": "WaterfallSkill" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "dc4b3600-60d1-11eb-8b98-b971494822a6", - "id": "dcd65f00-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:03-03:00", - "timestamp": "2021-01-27T19:00:03.440Z" - }, - { - "channelData": { - "clientActivityID": "1611774004677b31ih46f32l", - "clientTimestamp": "2021-01-27T19:00:04.677Z" - }, - "text": "WaterfallSkill", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-27T19:00:04.692Z", - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "id": "dd956940-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:04-03:00", - "recipient": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://259039676c61.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "WaterfallSkillBotDotNet", - "value": "WaterfallSkillBotDotNet" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "dd956940-60d1-11eb-8b98-b971494822a6", - "id": "de24d800-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:05-03:00", - "timestamp": "2021-01-27T19:00:05.632Z" - }, - { - "channelData": { - "clientActivityID": "1611774006749prlvxjdfr2b", - "clientTimestamp": "2021-01-27T19:00:06.749Z" - }, - "text": "WaterfallSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-27T19:00:06.776Z", - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "id": "ded36780-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:06-03:00", - "recipient": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://259039676c61.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.\n\n 1. Cards\n 2. Proactive\n 3. Auth\n 4. MessageWithAttachment\n 5. Sso\n 6. FileUpload\n 7. Echo", - "speak": "Select an action # to send to **WaterfallSkillBotDotNet**.\n\nOr just type in a message and it will be forwarded to the skill as a message activity.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "ded36780-60d1-11eb-8b98-b971494822a6", - "id": "df60da70-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:07-03:00", - "timestamp": "2021-01-27T19:00:07.703Z" - }, - { - "channelData": { - "clientActivityID": "1611774010842ks0wa2td8kl", - "clientTimestamp": "2021-01-27T19:00:10.842Z" - }, - "text": "Auth", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-27T19:00:10.866Z", - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "id": "e1437d20-60d1-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:00:10-03:00", - "recipient": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://259039676c61.ngrok.io" - } -] \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn2.json b/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn2.json deleted file mode 100644 index 6382f436e7..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/SignIn2.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "items": [ - { - "type": "message", - "role": "bot", - "text": "You are now logged in.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'You are now logged in.'", - "speak == 'You are now logged in.'", - "inputHint == 'ignoringInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Would you like to view your token?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Would you like to view your token?'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "yes" - }, - { - "type": "message", - "role": "bot", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "speak == 'Here is your token:'", - "inputHint == 'ignoringInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "I have signed you out.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'I have signed you out.'", - "speak == 'I have signed you out.'", - "inputHint == 'ignoringInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "speak == 'Done with \"${TargetSkill}\". \n\n What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/signin2.transcript b/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/signin2.transcript deleted file mode 100644 index 2d8cf8ee19..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SignIn/TestScripts/signin2.transcript +++ /dev/null @@ -1,124 +0,0 @@ -[ - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "You are now logged in.", - "speak": "You are now logged in.", - "inputHint": "ignoringInput", - "attachments": [], - "entities": [], - "replyToId": "05fa4ae0-60d2-11eb-8b98-b971494822a6", - "id": "07013390-60d2-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:01:14-03:00", - "timestamp": "2021-01-27T19:01:14.185Z" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "Here is your token: 37f0ba3c-24bd-485c-9a11-7151fe604b95", - "speak": "Here is your token:", - "inputHint": "ignoringInput", - "attachments": [], - "entities": [], - "replyToId": "05fa4ae0-60d2-11eb-8b98-b971494822a6", - "id": "072c6240-60d2-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:01:14-03:00", - "timestamp": "2021-01-27T19:01:14.468Z" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "I have signed you out.", - "speak": "I have signed you out.", - "inputHint": "ignoringInput", - "attachments": [], - "entities": [], - "replyToId": "05fa4ae0-60d2-11eb-8b98-b971494822a6", - "id": "077e2bc0-60d2-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:01:15-03:00", - "timestamp": "2021-01-27T19:01:15.004Z" - }, - { - "type": "message", - "serviceUrl": "https://259039676c61.ngrok.io", - "channelId": "emulator", - "from": { - "id": "73573150-60c5-11eb-b881-018622be8a2a", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "da522520-60d1-11eb-b881-018622be8a2a|livechat" - }, - "recipient": { - "id": "b5d6e07f-f8f9-491d-b767-10a0817f89f2", - "role": "user" - }, - "locale": "", - "text": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "speak": "Done with \"WaterfallSkillBotDotNet\". \n\n What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "05fa4ae0-60d2-11eb-8b98-b971494822a6", - "id": "07aa92f0-60d2-11eb-8b98-b971494822a6", - "localTimestamp": "2021-01-27T16:01:15-03:00", - "timestamp": "2021-01-27T19:01:15.295Z" - } -] \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/EchoTests.cs b/tests/functional/Tests/SkillFunctionalTests/SingleTurn/EchoTests.cs deleted file mode 100644 index 8ba52a0f71..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/EchoTests.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.SingleTurn -{ - [Trait("TestCategory", "SingleTurn")] - public class EchoTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/SingleTurn/TestScripts"; - - public EchoTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies - }; - - var hostBots = new List - { - HostBot.SimpleHostBotComposerDotNet, - HostBot.SimpleHostBotDotNet, - HostBot.SimpleHostBotDotNet21, - HostBot.SimpleHostBotJS, - HostBot.SimpleHostBotPython, - }; - - var targetSkills = new List - { - SkillBotNames.EchoSkillBotComposerDotNet, - SkillBotNames.EchoSkillBotDotNet, - SkillBotNames.EchoSkillBotDotNet21, - SkillBotNames.EchoSkillBotDotNetV3, - SkillBotNames.EchoSkillBotJS, - SkillBotNames.EchoSkillBotJSV3, - SkillBotNames.EchoSkillBotPython - }; - - var scripts = new List { "EchoMultiSkill.json" }; - - var testCaseBuilder = new TestCaseBuilder(); - - // This local function is used to exclude ExpectReplies test cases for v3 bots - static bool ShouldExclude(TestCase testCase) - { - if (testCase.DeliveryMode == DeliveryModes.ExpectReplies) - { - // Note: ExpectReplies is not supported by DotNetV3 and JSV3 skills. - if (testCase.TargetSkill == SkillBotNames.EchoSkillBotDotNetV3 || testCase.TargetSkill == SkillBotNames.EchoSkillBotJSV3) - { - return true; - } - } - - return false; - } - - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts, ShouldExclude); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public async Task RunTestCases(TestCaseDataObject testData) - { - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - var options = TestClientOptions[testCase.HostBot]; - - var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId, options, Logger).GetTestClient(), TestRequestTimeout, Logger); - - var testParams = new Dictionary - { - { "DeliveryMode", testCase.DeliveryMode }, - { "TargetSkill", testCase.TargetSkill } - }; - - await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script), testParams); - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.json b/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.json deleted file mode 100644 index 1b3c06348e..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "items": [ - { - "type": "conversationUpdate", - "role": "user" - }, - { - "type": "message", - "role": "bot", - "text": "Hello and welcome!", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Hello and welcome!'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${DeliveryMode}" - }, - { - "type": "message", - "role": "bot", - "text": "What skill would you like to call?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What skill would you like to call?'", - "speak == 'What skill would you like to call?'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "${TargetSkill}" - }, - { - "type": "message", - "role": "bot", - "text": "Type anything to send to the skill.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Type anything to send to the skill.'", - "inputHint == 'expectingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "Hello" - }, - { - "type": "message", - "role": "bot", - "text": "Echo: Hello", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Echo: Hello'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Say \"end\" or \"stop\" and I'll end the conversation and back to the parent.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Say \"end\" or \"stop\" and I\\'ll end the conversation and back to the parent.'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "user", - "text": "end" - }, - { - "type": "message", - "role": "bot", - "text": "Ending conversation from the skill...", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Ending conversation from the skill...'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Received endOfConversation.\n\nCode: completedSuccessfully.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Received endOfConversation.\n\nCode: completedSuccessfully.'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "Back in the host bot.", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'Back in the host bot.'", - "inputHint == 'acceptingInput'" - ] - }, - { - "type": "message", - "role": "bot", - "text": "What delivery mode would you like to use?", - "assertions": [ - "type == 'message'", - "from.role == 'bot'", - "recipient.role == 'user'", - "text == 'What delivery mode would you like to use?'", - "speak == 'What delivery mode would you like to use?'", - "inputHint == 'expectingInput'", - "suggestedActions.actions[0].type == 'imBack'", - "suggestedActions.actions[0].title == 'normal'", - "suggestedActions.actions[0].value == 'normal'", - "suggestedActions.actions[1].type == 'imBack'", - "suggestedActions.actions[1].title == 'expectReplies'", - "suggestedActions.actions[1].value == 'expectReplies'" - ] - } - ] -} \ No newline at end of file diff --git a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.transcript b/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.transcript deleted file mode 100644 index f5569cf169..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/SingleTurn/TestScripts/EchoMultiSkill.transcript +++ /dev/null @@ -1,480 +0,0 @@ -[ - { - "type": "conversationUpdate", - "membersAdded": [ - { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot" - }, - { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User" - } - ], - "membersRemoved": [], - "channelId": "emulator", - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "id": "67d08fd0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:48-03:00", - "recipient": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "timestamp": "2021-01-05T13:17:48.237Z", - "from": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User", - "role": "user" - }, - "locale": "", - "serviceUrl": "https://60ecb8345374.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Hello and welcome!", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "67d08fd0-4f58-11eb-80df-41840e87027c", - "id": "68722700-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:49-03:00", - "timestamp": "2021-01-05T13:17:49.296Z" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "67d08fd0-4f58-11eb-80df-41840e87027c", - "id": "689ae4b0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:49-03:00", - "timestamp": "2021-01-05T13:17:49.563Z" - }, - { - "channelData": { - "clientActivityID": "1609852670737zdf39h87ze9", - "clientTimestamp": "2021-01-05T13:17:50.737Z" - }, - "text": "expectReplies", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-05T13:17:50.760Z", - "entities": [ - { - "requiresBotState": true, - "supportsListening": true, - "supportsTts": true, - "type": "ClientCapabilities" - } - ], - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "id": "69518a80-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:50-03:00", - "recipient": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://60ecb8345374.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "What skill would you like to call?", - "speak": "What skill would you like to call?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "EchoSkillBotDotNet", - "value": "EchoSkillBotDotNet" - }, - { - "type": "imBack", - "title": "EchoSkillBotDotNet21", - "value": "EchoSkillBotDotNet21" - }, - { - "type": "imBack", - "title": "EchoSkillBotDotNetV3", - "value": "EchoSkillBotDotNetV3" - }, - { - "type": "imBack", - "title": "EchoSkillBotJS", - "value": "EchoSkillBotJS" - }, - { - "type": "imBack", - "title": "EchoSkillBotJSV3", - "value": "EchoSkillBotJSV3" - }, - { - "type": "imBack", - "title": "EchoSkillBotPython", - "value": "EchoSkillBotPython" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "69518a80-4f58-11eb-80df-41840e87027c", - "id": "69f93c30-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:51-03:00", - "timestamp": "2021-01-05T13:17:51.859Z" - }, - { - "channelData": { - "clientActivityID": "16098526780751zl7loernbj", - "clientTimestamp": "2021-01-05T13:17:58.075Z" - }, - "text": "EchoSkillBotDotNet", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-05T13:17:58.102Z", - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "id": "6db1d760-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:58-03:00", - "recipient": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://60ecb8345374.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Type anything to send to the skill.", - "inputHint": "expectingInput", - "attachments": [], - "entities": [], - "replyToId": "6db1d760-4f58-11eb-80df-41840e87027c", - "id": "6e4ae310-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:17:59-03:00", - "timestamp": "2021-01-05T13:17:59.105Z" - }, - { - "channelData": { - "clientActivityID": "1609852686824zhcy1hqt9dd", - "clientTimestamp": "2021-01-05T13:18:06.824Z" - }, - "text": "Hello", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-05T13:18:06.848Z", - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "id": "72e86000-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:06-03:00", - "recipient": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://60ecb8345374.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Echo: Hello", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "72e86000-4f58-11eb-80df-41840e87027c", - "id": "740cbbc0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:08-03:00", - "timestamp": "2021-01-05T13:18:08.764Z" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Say \"end\" or \"stop\" and I'll end the conversation and back to the parent.", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "72e86000-4f58-11eb-80df-41840e87027c", - "id": "74411230-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:09-03:00", - "timestamp": "2021-01-05T13:18:09.107Z" - }, - { - "channelData": { - "clientActivityID": "16098526945962f14ibp83pt", - "clientTimestamp": "2021-01-05T13:18:14.596Z" - }, - "text": "end", - "textFormat": "plain", - "type": "message", - "channelId": "emulator", - "from": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "name": "User", - "role": "user" - }, - "locale": "", - "timestamp": "2021-01-05T13:18:14.627Z", - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "id": "778b5b30-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:14-03:00", - "recipient": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "serviceUrl": "https://60ecb8345374.ngrok.io" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Ending conversation from the skill...", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "778b5b30-4f58-11eb-80df-41840e87027c", - "id": "7839c3a0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:15-03:00", - "timestamp": "2021-01-05T13:18:15.770Z" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Received endOfConversation.\n\nCode: completedSuccessfully", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "778b5b30-4f58-11eb-80df-41840e87027c", - "id": "78684db0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:16-03:00", - "timestamp": "2021-01-05T13:18:16.075Z" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "Back in the host bot.", - "inputHint": "acceptingInput", - "attachments": [], - "entities": [], - "replyToId": "778b5b30-4f58-11eb-80df-41840e87027c", - "id": "7898faa0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:16-03:00", - "timestamp": "2021-01-05T13:18:16.394Z" - }, - { - "type": "message", - "serviceUrl": "https://60ecb8345374.ngrok.io", - "channelId": "emulator", - "from": { - "id": "56b5e650-4f58-11eb-aad9-1dbdd1591611", - "name": "Bot", - "role": "bot" - }, - "conversation": { - "id": "67c4f710-4f58-11eb-aad9-1dbdd1591611|livechat" - }, - "recipient": { - "id": "c13a9ba2-8ba2-4364-85eb-5dd06d9c9331", - "role": "user" - }, - "locale": "", - "text": "What delivery mode would you like to use?", - "speak": "What delivery mode would you like to use?", - "inputHint": "expectingInput", - "suggestedActions": { - "actions": [ - { - "type": "imBack", - "title": "normal", - "value": "normal" - }, - { - "type": "imBack", - "title": "expectReplies", - "value": "expectReplies" - } - ] - }, - "attachments": [], - "entities": [], - "replyToId": "778b5b30-4f58-11eb-80df-41840e87027c", - "id": "78c317e0-4f58-11eb-80df-41840e87027c", - "localTimestamp": "2021-01-05T10:18:16-03:00", - "timestamp": "2021-01-05T13:18:16.670Z" - } -] diff --git a/tests/functional/Tests/SkillFunctionalTests/Sso/SsoTests.cs b/tests/functional/Tests/SkillFunctionalTests/Sso/SsoTests.cs deleted file mode 100644 index 151306b8b4..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/Sso/SsoTests.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SkillFunctionalTests.Common; -using TranscriptTestRunner; -using TranscriptTestRunner.XUnit; -using Xunit; -using Xunit.Abstractions; - -namespace SkillFunctionalTests.Sso -{ - public class SsoTests : ScriptTestBase - { - private readonly string _testScriptsFolder = Directory.GetCurrentDirectory() + @"/Sso/TestScripts"; - - public SsoTests(ITestOutputHelper output) - : base(output) - { - } - - public static IEnumerable TestCases() - { - var channelIds = new List { Channels.Directline }; - var deliverModes = new List - { - DeliveryModes.Normal, - DeliveryModes.ExpectReplies, - }; - - var hostBots = new List - { - HostBot.WaterfallHostBotDotNet, - HostBot.WaterfallHostBotJS, - HostBot.WaterfallHostBotPython - }; - - var targetSkills = new List - { - SkillBotNames.WaterfallSkillBotDotNet, - SkillBotNames.WaterfallSkillBotJS, - SkillBotNames.WaterfallSkillBotPython - }; - - var scripts = new List - { - "Sso.json", - }; - - var testCaseBuilder = new TestCaseBuilder(); - - var testCases = testCaseBuilder.BuildTestCases(channelIds, deliverModes, hostBots, targetSkills, scripts); - foreach (var testCase in testCases) - { - yield return testCase; - } - } - - [Theory] - [MemberData(nameof(TestCases))] - public Task RunTestCases(TestCaseDataObject testData) - { - var testCase = testData.GetObject(); - Logger.LogInformation(JsonConvert.SerializeObject(testCase, Formatting.Indented)); - - // TODO: Implement tests and scripts - //var runner = new XUnitTestRunner(new TestClientFactory(testCase.ChannelId).GetTestClient(), Logger); - //await runner.RunTestAsync(Path.Combine(_testScriptsFolder, testCase.Script)); - - // TODO: remove this line once we implement the test and we change the method to public async task - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Tests/SkillFunctionalTests/appsettings.json b/tests/functional/Tests/SkillFunctionalTests/appsettings.json deleted file mode 100644 index 447bc08b9a..0000000000 --- a/tests/functional/Tests/SkillFunctionalTests/appsettings.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Debug", - "Microsoft": "Warning" - } - }, - - "TestRequestTimeout": 180, - - "HostBotClientOptions": { - "SimpleHostBotComposerDotNet": { - "BotId": "bffnsimplehostbotcomposerdotnet", - "DirectLineSecret": "" - }, - "SimpleHostBotDotNet": { - "BotId": "bffnsimplehostbotdotnet", - "DirectLineSecret": "" - }, - "SimpleHostBotDotNet21": { - "BotId": "bffnsimplehostbotdotnet21", - "DirectLineSecret": "" - }, - "SimpleHostBotJS": { - "BotId": "bffnsimplehostbotjs", - "DirectLineSecret": "" - }, - "SimpleHostBotPython": { - "BotId": "bffnsimplehostbotpython", - "DirectLineSecret": "" - }, - "WaterfallHostBotDotNet": { - "BotId": "bffnwaterfallhostbotdotnet", - "DirectLineSecret": "" - }, - "WaterfallHostBotJS": { - "BotId": "bffnwaterfallhostbotjs", - "DirectLineSecret": "" - }, - "WaterfallHostBotPython": { - "BotId": "bffnwaterfallhostbotpython", - "DirectLineSecret": "" - } - } -} diff --git a/tests/functional/Tests/TranscriptTestRunnerTests/TranscriptTestRunnerTests.csproj b/tests/functional/Tests/TranscriptTestRunnerTests/TranscriptTestRunnerTests.csproj index 14d32b4f57..f9f90104c6 100644 --- a/tests/functional/Tests/TranscriptTestRunnerTests/TranscriptTestRunnerTests.csproj +++ b/tests/functional/Tests/TranscriptTestRunnerTests/TranscriptTestRunnerTests.csproj @@ -7,10 +7,13 @@ - + - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/tests/functional/build/yaml/functionalTestsBuild-CI.yml b/tests/functional/build/yaml/functionalTestsBuild-CI.yml index 89bff9a0cd..9f76a12f9e 100644 --- a/tests/functional/build/yaml/functionalTestsBuild-CI.yml +++ b/tests/functional/build/yaml/functionalTestsBuild-CI.yml @@ -24,12 +24,12 @@ steps: - task: NuGetCommand@2 displayName: "NuGet restore" inputs: - restoreSolution: SkillFunctionalTests.sln + restoreSolution: ComponentsFunctionalTests.sln - task: MSBuild@1 displayName: "Build" inputs: - solution: "SkillFunctionalTests.sln" + solution: "ComponentsFunctionalTests.sln" vsVersion: 16.0 platform: "${{ parameters.buildPlatform }}" configuration: "${{ parameters.buildConfiguration }}" diff --git a/tests/functional/build/yaml/testScenarios/configureConsumers.yml b/tests/functional/build/yaml/testScenarios/configureConsumers.yml index 0cf5eadbee..c6100be4fe 100644 --- a/tests/functional/build/yaml/testScenarios/configureConsumers.yml +++ b/tests/functional/build/yaml/testScenarios/configureConsumers.yml @@ -3,16 +3,8 @@ parameters: displayName: Bot's App Registration Ids type: object default: - EchoSkillBotComposerDotNet: "" - EchoSkillBotDotNet: "" - EchoSkillBotDotNet21: "" - EchoSkillBotDotNetV3: "" - EchoSkillBotJS: "" - EchoSkillBotJSV3: "" - EchoSkillBotPython: "" - WaterfallSkillBotDotNet: "" - WaterfallSkillBotJS: "" - WaterfallSkillBotPython: "" + EmptyBotDotNetWebApp: "" + EmptyBotJSWebApp: "" - name: azureSubscription displayName: Azure Service Connection @@ -399,176 +391,31 @@ steps: $groups = @{ DotNet = "$resourceGroup-DotNet" JS = "$resourceGroup-JS" - Python = "$resourceGroup-Python" } # Bots Settings $consumers = @( @{ - key = "SimpleHostBotDotNet" - botName = "bffnsimplehostbotdotnet" + key = "EmptyBotDotNetWebApp" + botName = "bfcfnemptybotdotnetwebapp" resourceGroup = $groups.DotNet configType = $types.Appsettings } @{ - key = "SimpleHostBotDotNet21" - botName = "bffnsimplehostbotdotnet21" - resourceGroup = $groups.DotNet - configType = $types.Appsettings - } - @{ - key = "SimpleHostBotComposerDotNet" - botName = "bffnsimplehostbotcomposerdotnet" - resourceGroup = $groups.DotNet - configType = $types.Composer - } - @{ - key = "WaterfallHostBotDotNet" - botName = "bffnwaterfallhostbotdotnet" - resourceGroup = $groups.DotNet - configType = $types.Appsettings - } - @{ - key = "SimpleHostBotJS" - botName = "bffnsimplehostbotjs" - resourceGroup = $groups.JS - configType = $types.Env - } - @{ - key = "WaterfallHostBotJS" - botName = "bffnwaterfallhostbotjs" - resourceGroup = $groups.JS - configType = $types.Env - } - @{ - key = "SimpleHostBotPython" - botName = "bffnsimplehostbotpython" - resourceGroup = $groups.Python - configType = $types.Env - } - @{ - key = "WaterfallHostBotPython" - botName = "bffnwaterfallhostbotpython" - resourceGroup = $groups.Python - configType = $types.Env - } - ) - - $skills = @( - @{ - key = "EchoSkillBotDotNet" - keyComposer = "echoSkillBotDotNet" - botName = "bffnechoskillbotdotnet" - appId = "${{ parameters.appIds.EchoSkillBotDotNet }}" - resourceGroup = $groups.DotNet - group = "Echo" - } - @{ - key = "EchoSkillBotDotNet21" - keyComposer = "echoSkillBotDotNet21" - botName = "bffnechoskillbotdotnet21" - appId = "${{ parameters.appIds.EchoSkillBotDotNet21 }}" - resourceGroup = $groups.DotNet - group = "Echo" - } - @{ - key = "EchoSkillBotDotNetV3" - keyComposer = "echoSkillBotDotNetV3" - botName = "bffnechoskillbotdotnetv3" - appId = "${{ parameters.appIds.EchoSkillBotDotNetV3 }}" - resourceGroup = $groups.DotNet - group = "Echo" - } - @{ - key = "EchoSkillBotComposerDotNet" - keyComposer = "echoSkillBotComposerDotNet" - botName = "bffnechoskillbotcomposerdotnet" - appId = "${{ parameters.appIds.EchoSkillBotComposerDotNet }}" - resourceGroup = $groups.DotNet - group = "Echo" - } - @{ - key = "WaterfallSkillBotDotNet" - keyComposer = "waterfallSkillBotDotNet" - botName = "bffnwaterfallskillbotdotnet" - appId = "${{ parameters.appIds.WaterfallSkillBotDotNet }}" - resourceGroup = $groups.DotNet - group = "Waterfall" - } - @{ - key = "EchoSkillBotJS" - keyComposer = "echoSkillBotJs" - botName = "bffnechoskillbotjs" - appId = "${{ parameters.appIds.EchoSkillBotJS }}" + key = "EmptyBotJSWebApp" + botName = "bfcfnemptybotjswebapp" resourceGroup = $groups.JS - group = "Echo" - } - @{ - key = "EchoSkillBotJSV3" - keyComposer = "echoSkillBotJsV3" - botName = "bffnechoskillbotjsv3" - appId = "${{ parameters.appIds.EchoSkillBotJSV3 }}" - resourceGroup = $groups.JS - group = "Echo" - } - @{ - key = "WaterfallSkillBotJS" - keyComposer = "waterfallSkillBotJS" - botName = "bffnwaterfallskillbotjs" - appId = "${{ parameters.appIds.WaterfallSkillBotJS }}" - resourceGroup = $groups.JS - group = "Waterfall" - } - @{ - key = "EchoSkillBotPython" - keyComposer = "echoSkillBotPython" - botName = "bffnechoskillbotpython" - appId = "${{ parameters.appIds.EchoSkillBotPython }}" - resourceGroup = $groups.Python - group = "Echo" - } - @{ - key = "WaterfallSkillBotPython" - keyComposer = "waterfallSkillBotPython" - botName = "bffnwaterfallskillbotpython" - appId = "${{ parameters.appIds.WaterfallSkillBotPython }}" - resourceGroup = $groups.Python - group = "Waterfall" + configType = $types.Appsettings } ) # Bots Test Scenarios $scenarios = @( @{ - name = "SingleTurn"; + name = "EmptyBot"; consumers = @( - "SimpleHostBotComposerDotNet", - "SimpleHostBotDotNet", - "SimpleHostBotDotNet21", - "SimpleHostBotJS", - "SimpleHostBotPython" - ); - skills = @( - "EchoSkillBotComposerDotNet", - "EchoSkillBotDotNet", - "EchoSkillBotDotNet21", - "EchoSkillBotDotNetV3", - "EchoSkillBotJS", - "EchoSkillBotJSV3", - "EchoSkillBotPython" - ); - } - @{ - name = "Waterfall"; - consumers = @( - "WaterfallHostBotDotNet", - "WaterfallHostBotJS", - "WaterfallHostBotPython" - ); - skills = @( - "WaterfallSkillBotDotNet", - "WaterfallSkillBotJS", - "WaterfallSkillBotPython" + "EmptyBotDotNetWebApp", + "EmptyBotJSWebApp" ); } ) @@ -576,43 +423,29 @@ steps: # Pre-configure and filter bots. Write-Host $(AddTimeStamp -text "Filtering bots by '$scenario' scenario ..."); $consumersToConfigure = FilterBotsByScenario -bots $consumers -scenarios $scenarios -scenario $scenario; - $skillsToConfigure = FilterBotsByScenario -bots $skills -scenarios $scenarios -scenario $scenario; - - Write-Host $(AddTimeStamp -text "Loading the Skills AppIds from the KeyVault '$keyVault' when no Pipeline Variable is provided."); - $skillsToConfigure = AddBotsAppIdFromKeyVault -bots $skillsToConfigure -keyVault $keyVault - - Write-Host $(AddTimeStamp -text "Filtering bots that have an AppId assigned ..."); - $skillsToConfigure = FilterBotsWithAppId -bots $skillsToConfigure Write-Host $(AddTimeStamp -text "Adding the suffix '$suffix' to the bot resources ..."); $consumersToConfigure = AddBotsSuffix -bots $consumersToConfigure -suffix $suffix - $skillsToConfigure = AddBotsSuffix -bots $skillsToConfigure -suffix $suffix Write-Host $(AddTimeStamp -text "Filtering existing Resource Groups ..."); $resourceGroups = FilterResourceGroupsByExistence -groups $groups Write-Host $(AddTimeStamp -text "Filtering deployed bots in Azure ..."); $consumersToConfigure = FilterBotsByResourceExistence -groups $resourceGroups -bots $consumersToConfigure - $skillsToConfigure = FilterBotsByResourceExistence -groups $resourceGroups -bots $skillsToConfigure Write-Host $(AddTimeStamp -text "Adding Azure AppSettings to Consumers' configuration."); - $consumersToConfigure = AddAzureAppSettings -consumers $consumersToConfigure -skills $skillsToConfigure + $consumersToConfigure = AddAzureAppSettings -consumers $consumersToConfigure if (-not $consumersToConfigure) { Write-Error $(AddTimeStamp -text "No Consumers were found to configure. Cancelling the configuration ..."); return; } - if (-not $skillsToConfigure) { - Write-Error $(AddTimeStamp -text "No Skills were found to configure each Consumer. Cancelling the configuration ..."); - return; - } - # Configure steps. Write-Host $(AddTimeStamp -text "Configuring the Test Project."); - ConfigureTestProjectAppSettings -bots $consumersToConfigure -appSettingsPath "tests/SkillFunctionalTests/appsettings.json"; + ConfigureTestProjectAppSettings -bots $consumersToConfigure -appSettingsPath "tests/functional/Tests/ComponentsFunctionalTests/appsettings.json"; Write-Host $(AddTimeStamp -text "Configuring the Consumer bots App Settings in Azure."); - ConfigureConsumers -consumers $consumersToConfigure -skills $skillsToConfigure + ConfigureConsumers -consumers $consumersToConfigure Write-Host $(AddTimeStamp -text "Process Finished!"); diff --git a/tests/functional/build/yaml/testScenarios/runScenario.yml b/tests/functional/build/yaml/testScenarios/runScenario.yml index bfa72bd232..6d230a4dfc 100644 --- a/tests/functional/build/yaml/testScenarios/runScenario.yml +++ b/tests/functional/build/yaml/testScenarios/runScenario.yml @@ -71,13 +71,13 @@ stages: inputs: command: build publishWebProjects: false - projects: "Tests/SkillFunctionalTests/SkillFunctionalTests.csproj" + projects: "tests/functional/Tests/ComponentsFunctionalTests/ComponentsFunctionalTests.csproj" arguments: "-v n --configuration ${{ parameters.buildConfiguration }}" - task: DotNetCoreCLI@2 displayName: "DotNet Test" inputs: command: test - testRunTitle: "SkillFunctionalTests-${{ scenario.name }}-$(BUILD.BUILDNUMBER)" - projects: "Tests/SkillFunctionalTests/SkillFunctionalTests.csproj" - arguments: "-v n --configuration ${{ parameters.buildConfiguration }} --no-build --no-restore --logger trx;LogFileName=SkillFunctionalTests-${{ scenario.name }}-$(BUILD.BUILDNUMBER).trx --filter TestCategory!=IgnoreInAutomatedBuild&TestCategory=${{ join('|TestCategory=', scenario.testCategories) }}" + testRunTitle: "ComponentsFunctionalTests-${{ scenario.name }}-$(BUILD.BUILDNUMBER)" + projects: "tests/functional/Tests/ComponentsFunctionalTests/ComponentsFunctionalTests.csproj" + arguments: "-v n --configuration ${{ parameters.buildConfiguration }} --no-build --no-restore --logger trx;LogFileName=ComponentsFunctionalTests-${{ scenario.name }}-$(BUILD.BUILDNUMBER).trx --filter TestCategory!=IgnoreInAutomatedBuild&TestCategory=${{ join('|TestCategory=', scenario.testCategories) }}" diff --git a/tests/functional/build/yaml/testScenarios/runTestScenarios.yml b/tests/functional/build/yaml/testScenarios/runTestScenarios.yml index 6fac3d47ca..9f947008bd 100644 --- a/tests/functional/build/yaml/testScenarios/runTestScenarios.yml +++ b/tests/functional/build/yaml/testScenarios/runTestScenarios.yml @@ -16,20 +16,13 @@ variables: # ResourceSuffix: (optional) Suffix to add to the resources' name to avoid collitions. ## Bots Configuration (Define these variables in Azure) - # BfcfnEchoSkillBotComposerDotNetAppId: (optional) App Id for BfcfnEchoSkillBotComposerDotNet bot. - # BfcfnEchoSkillBotDotNet21AppId: (optional) App Id for BfcfnEchoSkillBotDotNet21 bot. - # BfcfnEchoSkillBotDotNetAppId: (optional) App Id for BfcfnEchoSkillBotDotNet bot. - # BfcfnEchoSkillBotDotNetV3AppId: (optional) App Id for BfcfnEchoSkillBotDotNetV3 bot. - # BfcfnEchoSkillBotJSAppId: (optional) App Id for BfcfnEchoSkillBotJS bot. - # BfcfnEchoSkillBotJSV3AppId: (optional) App Id for BfcfnEchoSkillBotJSV3 bot. - # BfcfnEchoSkillBotPythonAppId: (optional) App Id for BfcfnEchoSkillBotPython bot. - # BfcfnWaterfallSkillBotDotNetAppId: (optional) App Id for BfcfnWaterfallSkillBotDotNet bot. - # BfcfnWaterfallSkillBotJSAppId: (optional) App Id for BfcfnWaterfallSkillBotJS bot. - # BfcfnWaterfallSkillBotPythonAppId: (optional) App Id for BfcfnWaterfallSkillBotPython bot. + # BfcfnEmptyBotDotNetWebAppId: (optional) App Id for BfcfnEmptyBotDotNetWebApp bot. + # BfcfnEmptyBotJSWebAppAppId: (optional) App Id for BfcfnEmptyBotJSWebApp bot. + # DeployBotResourcesGuid: (optional) Deploy Bot Resources pipeline GUID. ## Internal variables - InternalKeyVaultName: "bfcfnbotkeyvault$(INTERNALRESOURCESUFFIX)" + InternalKeyVaultName: "ComponentsBotsKeyVault$(INTERNALRESOURCESUFFIX)" InternalResourceGroupName: $[coalesce(variables['RESOURCEGROUP'], 'bfcfnbots')] InternalResourceSuffix: $[coalesce(variables['RESOURCESUFFIX'], '')] @@ -70,16 +63,8 @@ stages: - template: runScenario.yml parameters: appIds: - EchoSkillBotComposerDotNet: "$(BFFNECHOSKILLBOTCOMPOSERDOTNETAPPID)" - EchoSkillBotDotNet: "$(BFFNECHOSKILLBOTDOTNETAPPID)" - EchoSkillBotDotNet21: "$(BFFNECHOSKILLBOTDOTNET21APPID)" - EchoSkillBotDotNetV3: "$(BFFNECHOSKILLBOTDOTNETV3APPID)" - EchoSkillBotJS: "$(BFFNECHOSKILLBOTJSAPPID)" - EchoSkillBotJSV3: "$(BFFNECHOSKILLBOTJSV3APPID)" - EchoSkillBotPython: "$(BFFNECHOSKILLBOTPYTHONAPPID)" - WaterfallSkillBotDotNet: "$(BFFNWATERFALLSKILLBOTDOTNETAPPID)" - WaterfallSkillBotJS: "$(BFFNWATERFALLSKILLBOTJSAPPID)" - WaterfallSkillBotPython: "$(BFFNWATERFALLSKILLBOTPYTHONAPPID)" + EmptyBotDotNetWebApp: "$(BFCFNEMPTYBOTDOTNETWEBAPPID)" + EmptyBotJSWebApp: "$(BFCFNEMPTYBOTJSWEBAPPID)" azureSubscription: "$(AZURESUBSCRIPTION)" buildConfiguration: "$(BUILDCONFIGURATION)" buildIdSuffix: $[stageDependencies.Download_Variables.Download_Variables.outputs['Set_Variables.DeploymentBuildSuffix']] @@ -87,16 +72,7 @@ stages: resourceGroup: "$(INTERNALRESOURCEGROUPNAME)" resourceSuffix: "$(INTERNALRESOURCESUFFIX)" scenarios: - - name: Waterfall - dependsOn: [Download_Variables] - testCategories: - - Attachments - - CardActions - - ProactiveMessages - - FileUpload - - SignIn - - - name: SingleTurn + - name: EmptyBot dependsOn: [Download_Variables] testCategories: - - SingleTurn + - EmptyBot diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/CallTransferTests.cs b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/CallTransferTests.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/CallTransferTests.cs rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/CallTransferTests.cs diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_BaseScenario.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_BaseScenario.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_BaseScenario.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_BaseScenario.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_HappyPath.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_HappyPath.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_HappyPath.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/CallTransferTests/CallTransfer_HappyPath.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_BaseScenario.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_BaseScenario.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_BaseScenario.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_BaseScenario.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_HappyPath.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_HappyPath.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_HappyPath.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_HappyPath.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_IgnoredInNonTelephonyChannel.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_IgnoredInNonTelephonyChannel.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_IgnoredInNonTelephonyChannel.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/Recording_IgnoredInNonTelephonyChannel.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_CommandResultWrongName.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_CommandResultWrongName.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_CommandResultWrongName.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_CommandResultWrongName.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionDisabled.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionDisabled.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionDisabled.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionDisabled.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionEnabled.test.dialog b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionEnabled.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionEnabled.test.dialog rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Integration/RecordingTests/StartRecording_WithTangent_InterruptionEnabled.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/IntegrationTestsBase.cs b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/IntegrationTestsBase.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/IntegrationTestsBase.cs rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/IntegrationTestsBase.cs diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj similarity index 96% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj index ef176417e9..99493d43ed 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj +++ b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/Microsoft.Bot.Components.Telephony.Tests.csproj @@ -23,7 +23,7 @@ - + diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/NuGet.Config b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/NuGet.Config similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/NuGet.Config rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/NuGet.Config diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/RecordingTests.cs b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/RecordingTests.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/RecordingTests.cs rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/RecordingTests.cs diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/ResourceExplorerFixture.cs b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/ResourceExplorerFixture.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/ResourceExplorerFixture.cs rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/ResourceExplorerFixture.cs diff --git a/tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/TestUtils.cs b/tests/packages/Microsoft.Bot.Components.Telephony.Tests/TestUtils.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Telephony.Tests/TestUtils.cs rename to tests/packages/Microsoft.Bot.Components.Telephony.Tests/TestUtils.cs diff --git a/tests/unit/Microsoft.Bot.Components.Tests.sln b/tests/unit/Microsoft.Bot.Components.Tests.sln index 8c31969598..e5dae090ef 100644 --- a/tests/unit/Microsoft.Bot.Components.Tests.sln +++ b/tests/unit/Microsoft.Bot.Components.Tests.sln @@ -17,13 +17,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "packages", "packages", "{73 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "teams", "teams", "{61708441-52A4-48F6-819A-B8D4C279C4C8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Teams.Tests", "packages\Microsoft.Bot.Components.Teams.Tests\Microsoft.Bot.Components.Teams.Tests.csproj", "{F6E872DE-52B7-4372-B546-B18B5A495C73}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Graph", "..\..\packages\Graph\Microsoft.Bot.Components.Graph.csproj", "{9561BF32-D0EE-464F-981B-7E4298ACDDFB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Teams.Tests", "packages\Teams\dotnet\Microsoft.Bot.Components.Teams.Tests.csproj", "{4005C95D-BECC-450B-927D-54C8CCF178BB}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "telephony", "telephony", "{47F3E043-D5E7-42E3-8B18-DF64A9F2FC1C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Telephony.Tests", "packages\Microsoft.Bot.Components.Telephony.Tests\Microsoft.Bot.Components.Telephony.Tests.csproj", "{485E9D0F-6534-475D-8400-31BFF633EDE0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Telephony.Tests", "..\packages\Microsoft.Bot.Components.Telephony.Tests\Microsoft.Bot.Components.Telephony.Tests.csproj", "{485E9D0F-6534-475D-8400-31BFF633EDE0}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Telephony", "..\..\packages\Telephony\Microsoft.Bot.Components.Telephony.csproj", "{BDA3A62A-8762-44EA-A417-5DC01D26AAF9}" EndProject @@ -49,14 +49,14 @@ Global {F0E73465-DB1D-4F8A-B527-88F1E2515A5C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0E73465-DB1D-4F8A-B527-88F1E2515A5C}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0E73465-DB1D-4F8A-B527-88F1E2515A5C}.Release|Any CPU.Build.0 = Release|Any CPU - {F6E872DE-52B7-4372-B546-B18B5A495C73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6E872DE-52B7-4372-B546-B18B5A495C73}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6E872DE-52B7-4372-B546-B18B5A495C73}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6E872DE-52B7-4372-B546-B18B5A495C73}.Release|Any CPU.Build.0 = Release|Any CPU {9561BF32-D0EE-464F-981B-7E4298ACDDFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9561BF32-D0EE-464F-981B-7E4298ACDDFB}.Debug|Any CPU.Build.0 = Debug|Any CPU {9561BF32-D0EE-464F-981B-7E4298ACDDFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {9561BF32-D0EE-464F-981B-7E4298ACDDFB}.Release|Any CPU.Build.0 = Release|Any CPU + {4005C95D-BECC-450B-927D-54C8CCF178BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4005C95D-BECC-450B-927D-54C8CCF178BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4005C95D-BECC-450B-927D-54C8CCF178BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4005C95D-BECC-450B-927D-54C8CCF178BB}.Release|Any CPU.Build.0 = Release|Any CPU {485E9D0F-6534-475D-8400-31BFF633EDE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {485E9D0F-6534-475D-8400-31BFF633EDE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {485E9D0F-6534-475D-8400-31BFF633EDE0}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -74,7 +74,7 @@ Global {6876407A-F34E-479F-9F3C-6E6ED81EB600} = {31CBAEDA-E319-49AE-A662-AA0739205C82} {F0E73465-DB1D-4F8A-B527-88F1E2515A5C} = {31CBAEDA-E319-49AE-A662-AA0739205C82} {61708441-52A4-48F6-819A-B8D4C279C4C8} = {73825711-6685-48E2-BFA2-3FCDECE1A0FD} - {F6E872DE-52B7-4372-B546-B18B5A495C73} = {61708441-52A4-48F6-819A-B8D4C279C4C8} + {4005C95D-BECC-450B-927D-54C8CCF178BB} = {61708441-52A4-48F6-819A-B8D4C279C4C8} {47F3E043-D5E7-42E3-8B18-DF64A9F2FC1C} = {73825711-6685-48E2-BFA2-3FCDECE1A0FD} {485E9D0F-6534-475D-8400-31BFF633EDE0} = {47F3E043-D5E7-42E3-8B18-DF64A9F2FC1C} {BDA3A62A-8762-44EA-A417-5DC01D26AAF9} = {47F3E043-D5E7-42E3-8B18-DF64A9F2FC1C} diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipant.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipant.test.dialog similarity index 89% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipant.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipant.test.dialog index a770c1cc0c..85fe1ad023 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipant.test.dialog +++ b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipant.test.dialog @@ -20,6 +20,15 @@ "tenantId": "customTenantId" } ] + }, + { + "$kind": "Microsoft.OnError", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "${turn.dialogEvent.value.message}" + } + ] } ] }, @@ -27,7 +36,7 @@ { "$kind": "Microsoft.Test.UserActivity", "activity": { - "type": "message", + "type": "message", "text": "hi", "from": { "id": "participant-id", diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipantError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipantError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipantError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipantError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipantErrorWithAdapter.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipantErrorWithAdapter.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMeetingParticipantErrorWithAdapter.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMeetingParticipantErrorWithAdapter.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMember.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMember.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMember.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMember.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMemberError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMemberError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMemberError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMemberError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMemberErrorWithAdapter.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMemberErrorWithAdapter.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetMemberErrorWithAdapter.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetMemberErrorWithAdapter.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedMembers.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedMembers.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedMembers.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedMembers.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedMembersError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedMembersError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedMembersError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedMembersError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedTeamMembers.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedTeamMembers.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedTeamMembers.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedTeamMembers.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedTeamMembersError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedTeamMembersError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetPagedTeamMembersError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetPagedTeamMembersError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamChannels.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamChannels.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamChannels.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamChannels.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamChannelsError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamChannelsError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamChannelsError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamChannelsError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamDetails.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamDetails.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamDetails.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamDetails.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamDetailsError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamDetailsError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamDetailsError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamDetailsError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMember.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMember.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMember.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMember.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMemberError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMemberError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMemberError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMemberError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMemberErrorWithAdapter.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMemberErrorWithAdapter.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_GetTeamMemberErrorWithAdapter.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_GetTeamMemberErrorWithAdapter.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendAppBasedLinkQueryResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendAppBasedLinkQueryResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendAppBasedLinkQueryResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendAppBasedLinkQueryResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendAppBasedLinkQueryResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendAppBasedLinkQueryResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendAppBasedLinkQueryResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendAppBasedLinkQueryResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEActionResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEActionResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEActionResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEActionResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEActionResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEActionResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEActionResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEActionResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAttachmentsResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAttachmentsResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAttachmentsResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAttachmentsResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAttachmentsResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAttachmentsResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAttachmentsResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAttachmentsResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponseErrorWithAdapter.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponseErrorWithAdapter.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEAuthResponseErrorWithAdapter.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEAuthResponseErrorWithAdapter.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEBotMessagePreviewResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEBotMessagePreviewResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEBotMessagePreviewResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEBotMessagePreviewResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEBotMessagePreviewResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEBotMessagePreviewResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEBotMessagePreviewResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEBotMessagePreviewResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEConfigQuerySettingUrlResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEMessageResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEMessageResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEMessageResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEMessageResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEMessageResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEMessageResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMEMessageResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMEMessageResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMESelectItemResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMESelectItemResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMESelectItemResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMESelectItemResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMESelectItemResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMESelectItemResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMESelectItemResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMESelectItemResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMessageToTeamsChannel.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMessageToTeamsChannel.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMessageToTeamsChannel.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMessageToTeamsChannel.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMessageToTeamsChannelError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMessageToTeamsChannelError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendMessageToTeamsChannelError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendMessageToTeamsChannelError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabAuthResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabAuthResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabAuthResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabAuthResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabAuthResponseErrorWithAdapter.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabAuthResponseErrorWithAdapter.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabAuthResponseErrorWithAdapter.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabAuthResponseErrorWithAdapter.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabCardResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabCardResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabCardResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabCardResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabCardResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabCardResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTabCardResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTabCardResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleCardResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleCardResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleCardResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleCardResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleCardResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleCardResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleCardResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleCardResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleMessageResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleMessageResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleMessageResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleMessageResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleUrlResponse.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleUrlResponse.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleUrlResponse.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleUrlResponse.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleUrlResponseError.test.dialog b/tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleUrlResponseError.test.dialog similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ActionTests/Action_SendTaskModuleUrlResponseError.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ActionTests/Action_SendTaskModuleUrlResponseError.test.dialog diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog b/tests/unit/packages/Teams/Shared Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog similarity index 91% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog rename to tests/unit/packages/Teams/Shared Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog index ef348c61ac..a4b7225a61 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog +++ b/tests/unit/packages/Teams/Shared Tests/ConditionalTests/ConditionalsTests_OnTeamsActivityTypes.test.dialog @@ -93,6 +93,26 @@ } ] }, + { + "$kind": "Teams.OnMEBotMessagePreviewEdit", + "condition": "turn.activity.text == 'OnMEBotMessagePreviewEdit'", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "OnMEBotMessagePreviewEdit" + } + ] + }, + { + "$kind": "Teams.OnMEBotMessagePreviewSend", + "condition": "turn.activity.text == 'OnMEBotMessagePreviewSend'", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "activity": "OnMEBotMessagePreviewSend" + } + ] + }, { "$kind": "Teams.OnMECardButtonClicked", "condition": "turn.activity.text == 'OnCardButtonClicked'", @@ -372,6 +392,36 @@ "$kind": "Microsoft.Test.AssertReply", "text": "OnFileConsent" }, + { + "$kind": "Microsoft.Test.UserActivity", + "activity": { + "type": "invoke", + "text": "OnMEBotMessagePreviewEdit", + "value": { + "botMessagePreviewAction": "edit" + }, + "name": "composeExtension/submitAction" + } + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "OnMEBotMessagePreviewEdit" + }, + { + "$kind": "Microsoft.Test.UserActivity", + "activity": { + "type": "invoke", + "text": "OnMEBotMessagePreviewSend", + "value": { + "botMessagePreviewAction": "send" + }, + "name": "composeExtension/submitAction" + } + }, + { + "$kind": "Microsoft.Test.AssertReply", + "text": "OnMEBotMessagePreviewSend" + }, { "$kind": "Microsoft.Test.UserActivity", "activity": { diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ActionTests.cs b/tests/unit/packages/Teams/dotnet/ActionTests.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ActionTests.cs rename to tests/unit/packages/Teams/dotnet/ActionTests.cs diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ConditionalTests.cs b/tests/unit/packages/Teams/dotnet/ConditionalTests.cs similarity index 95% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ConditionalTests.cs rename to tests/unit/packages/Teams/dotnet/ConditionalTests.cs index 8c744a42d9..d9a73bdc63 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ConditionalTests.cs +++ b/tests/unit/packages/Teams/dotnet/ConditionalTests.cs @@ -26,7 +26,7 @@ public ConditionalTests() ComponentRegistration.Add(new DeclarativeComponentRegistrationBridge()); ResourceExplorer = new ResourceExplorer() - .AddFolder(Path.Combine(TestUtils.GetProjectPath(), "Tests", nameof(ConditionalTests)), monitorChanges: false); + .AddFolder(Path.Combine(TestUtils.GetProjectPath(), "..", "Shared Tests", nameof(ConditionalTests)), monitorChanges: false); } public static ResourceExplorer ResourceExplorer { get; set; } diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Microsoft.Bot.Components.Teams.Tests.csproj b/tests/unit/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.Tests.csproj similarity index 88% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Microsoft.Bot.Components.Teams.Tests.csproj rename to tests/unit/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.Tests.csproj index 112c033e7f..dd88645a9c 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/Microsoft.Bot.Components.Teams.Tests.csproj +++ b/tests/unit/packages/Teams/dotnet/Microsoft.Bot.Components.Teams.Tests.csproj @@ -10,8 +10,8 @@ - - + + @@ -23,7 +23,7 @@ - + diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ResourceExplorerFixture.cs b/tests/unit/packages/Teams/dotnet/ResourceExplorerFixture.cs similarity index 95% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ResourceExplorerFixture.cs rename to tests/unit/packages/Teams/dotnet/ResourceExplorerFixture.cs index 7b2b192b71..1da40ac30a 100644 --- a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/ResourceExplorerFixture.cs +++ b/tests/unit/packages/Teams/dotnet/ResourceExplorerFixture.cs @@ -22,7 +22,7 @@ public ResourceExplorerFixture Initialize(string resourceFolder) { if (_folderPath.Length == 0) { - _folderPath = Path.Combine(TestUtils.GetProjectPath(), "Tests", resourceFolder); + _folderPath = Path.Combine(TestUtils.GetProjectPath(), "..", "Shared Tests", resourceFolder); ResourceExplorer = ResourceExplorer.AddFolder(_folderPath, monitorChanges: false); } diff --git a/tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/TestUtils.cs b/tests/unit/packages/Teams/dotnet/TestUtils.cs similarity index 100% rename from tests/unit/packages/Microsoft.Bot.Components.Teams.Tests/TestUtils.cs rename to tests/unit/packages/Teams/dotnet/TestUtils.cs diff --git a/tests/unit/packages/Teams/js/package.json b/tests/unit/packages/Teams/js/package.json new file mode 100644 index 0000000000..894e3f6a0f --- /dev/null +++ b/tests/unit/packages/Teams/js/package.json @@ -0,0 +1,23 @@ +{ + "name": "@microsoft/bot-components-teams-tests", + "private": true, + "scripts": { + "build:package": "yarn workspace @microsoft/bot-components-teams build", + "test": "yarn run build:package && mocha --require ts-node/register tests/*.test.ts", + "lint": "eslint . --ext .js,.ts --config ../../../../../packages/Teams/js/.eslintrc.json" + }, + "dependencies": { + "@microsoft/bot-components-teams": "workspace:packages/Teams/js", + "@types/mocha": "^8.2.2", + "botbuilder": "4.14.0", + "botbuilder-dialogs-adaptive": "4.14.0-preview", + "botbuilder-dialogs-adaptive-testing": "4.14.0-preview", + "botframework-connector": "4.14.0", + "mocha": "^9.0.2", + "nock": "^13.1.1", + "ts-node": "^10.0.0" + }, + "devDependencies": { + "eslint": "^7.30.0" + } +} diff --git a/tests/unit/packages/Teams/js/tests/actionTests.test.ts b/tests/unit/packages/Teams/js/tests/actionTests.test.ts new file mode 100644 index 0000000000..1492fde260 --- /dev/null +++ b/tests/unit/packages/Teams/js/tests/actionTests.test.ts @@ -0,0 +1,508 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +import { + ConversationState, + useBotState, + MemoryStorage, + UserState, + Channels, + ConversationReference, + ChannelAccount, + ConversationAccount, + BotAdapter, + TestAdapter, + TurnContext, + Middleware, +} from 'botbuilder'; +import { AdaptiveTeamsBotComponent } from '@microsoft/bot-components-teams'; +import { TestUtils } from 'botbuilder-dialogs-adaptive-testing'; +import { + ConnectorClient, + MicrosoftAppCredentials, +} from 'botframework-connector'; +import { ok } from 'assert'; +import nock = require('nock'); +import { makeResourceExplorer } from './utils'; + +const getTeamsTestAdapter = ( + convo?: Partial +): TestAdapter => { + const adapter = new TestAdapter(convo as ConversationReference); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore: This is required because TeamsInfo checks that the adapter has a createConnectorClient method + // and TestAdapter doesn't have one, natively. + adapter.createConnectorClient = () => { + return new ConnectorClient(new MicrosoftAppCredentials('', '')); + }; + + // DialogManager requires conversationState + const storage = new MemoryStorage(); + const userState = new UserState(storage); + const conversationState = new ConversationState(storage); + useBotState((adapter as unknown) as BotAdapter, userState, conversationState); + + return adapter; +}; + +const getTeamsUser = (): ChannelAccount => { + return { + id: '29:User-Id', + name: 'User Name', + aadObjectId: 'participant-aad-id', + }; +}; + +const getPersonalConversation = (): ConversationAccount => { + return { + id: 'a:oneOnOneConversationId', + name: 'oneOnOne', + tenantId: 'tenantId-Guid', + conversationType: 'personal', + isGroup: false, + }; +}; + +const getGroupConversation = (): ConversationAccount => { + return { + id: '19:groupChatId@thread.v2', + name: 'group', + tenantId: 'tenantId-Guid', + conversationType: 'groupChat', + isGroup: true, + }; +}; + +const getBaseConversationReference = (): ConversationReference => { + return { + user: getTeamsUser(), + channelId: Channels.Msteams, + conversation: getPersonalConversation(), + bot: { + id: 'botId', + name: 'Bot', + }, + serviceUrl: 'https://api.botframework.com', + }; +}; + +const getPersonalConversationReference = (): ConversationReference => { + return { + ...getBaseConversationReference(), + conversation: getPersonalConversation(), + }; +}; + +const getGroupConversationReference = (): ConversationReference => { + return { + ...getBaseConversationReference(), + conversation: getGroupConversation(), + }; +}; + +const generateTeamMembers = (amount: number): Record[] => { + const members = []; + const baseUser = getTeamsUser(); + for (let i = 0; i < amount; i++) { + members.push({ + id: `${baseUser.id}-${i}`, + name: `${baseUser.name}-${i}`, + objectId: `User-${i}-Object-Id`, + givenName: 'User', + surname: `Surname-${i}`, + email: `User.${i}@microsoft.com`, + userPrincipalName: `user${i}@microsoft.com`, + tenantId: 'tenant-id-1', + }); + } + + return members; +}; + +// This is only used for SendMessageToTeamsChannel test since it has a check in turnState for +// credentials and they never get saved is the adapter is TestAdapter. +class AddConnectorClientMiddleware implements Middleware { + async onTurn(context: TurnContext, next: () => Promise): Promise { + context.turnState.set( + context.adapter.ConnectorClientKey, + new ConnectorClient(new MicrosoftAppCredentials('', '')) + ); + await next(); + } +} + +describe('Actions', function () { + before(() => nock.disableNetConnect()); + beforeEach(() => nock.cleanAll()); + after(() => nock.enableNetConnect()); + afterEach(() => nock.cleanAll()); + + const resourceExplorer = makeResourceExplorer( + 'ActionTests', + AdaptiveTeamsBotComponent + ); + + /** + * Note: With mocha, `this.test?.title` refers to the test's name, so runTestScript + * is just calling a file with the same name as the test. + */ + it('Action_GetMeetingParticipant', async function () { + const conversationReference = getPersonalConversationReference(); + const participant = { + user: { + userPrincipalName: 'userPrincipalName-1', + }, + meeting: { + role: 'Organizer', + }, + conversation: conversationReference.conversation, + }; + + const fetchExpectation = nock('https://api.botframework.com') + .get( + '/v1/meetings/meeting-id-1/participants/participant-aad-id-1?tenantId=tenant-id-1' + ) + .reply(200, participant); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get( + '/v1/meetings/customMeetingId/participants/customParticipantId?tenantId=customTenantId' + ) + .reply(200, participant); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetMeetingParticipantError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetMeetingParticipantErrorWithAdapter', async function () { + const conversationReference = getPersonalConversationReference(); + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + }); + + it('Action_GetMember', async function () { + const conversationReference = getPersonalConversationReference(); + const members = generateTeamMembers(1); + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/conversations/a%3AoneOnOneConversationId/members/member-id') + .reply(200, members[0]); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get( + '/v3/conversations/a%3AoneOnOneConversationId/members/customMemberId' + ) + .reply(200, members[0]); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetMemberError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetMemberErrorWithAdapter', async function () { + const conversationReference = getPersonalConversationReference(); + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + }); + + it('Action_GetPagedMembers', async function () { + const conversationReference = getGroupConversationReference(); + const members = generateTeamMembers(3); + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/conversations/19%3AgroupChatId%40thread.v2/pagedmembers') + .reply(200, { continuationToken: 'token', members }); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get( + '/v3/conversations/19%3AgroupChatId%40thread.v2/pagedmembers?pageSize=2&continuationToken=token' + ) + .reply(200, { + continuationToken: 'customToken', + members: members.slice(0, 2), + }); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetPagedMembersError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetPagedTeamMembers', async function () { + const conversationReference = getGroupConversationReference(); + const members = generateTeamMembers(3); + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/conversations/team-id-1/pagedmembers') + .reply(200, { continuationToken: 'token', members }); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get( + '/v3/conversations/team-id-1/pagedmembers?pageSize=2&continuationToken=token' + ) + .reply(200, { + continuationToken: 'customToken', + members: members.slice(0, 2), + }); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetPagedTeamMembersError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetTeamChannels', async function () { + const conversationReference = getGroupConversationReference(); + const conversations = [ + { + id: '19:ChannelIdgeneralChannelId@thread.skype', + name: 'Testing0', + }, + { + id: '19:somechannelId2e5ab3df9ae9b594bdb@thread.skype', + name: 'Testing1', + }, + { + id: '19:somechannelId388ade16aa4dd375e69@thread.skype', + name: 'Testing2', + }, + ]; + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/teams/team-id-1/conversations') + .reply(200, { conversations }); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get('/v3/teams/customTeamId/conversations') + .reply(200, { conversations }); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetTeamChannelsError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetTeamDetails', async function () { + const conversationReference = getGroupConversationReference(); + const teamDetails = { + id: '19:generalChannelIdgeneralChannelId@thread.skype', + name: 'TeamName', + aadGroupId: 'Team-aadGroupId', + }; + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/teams/team-id-1') + .reply(200, teamDetails); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get('/v3/teams/customTeamId') + .reply(200, teamDetails); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetTeamDetailsError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetTeamMember', async function () { + const conversationReference = getGroupConversationReference(); + const members = generateTeamMembers(1); + + const fetchExpectation = nock('https://api.botframework.com') + .get('/v3/conversations/team-id-1/members/29%3AUser-Id') + .reply(200, members[0]); + + const fetchExpectationCustomProperties = nock( + 'https://api.botframework.com' + ) + .get('/v3/conversations/customTeamId/members/customMemberId') + .reply(200, members[0]); + + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + ok(fetchExpectationCustomProperties.isDone()); + }); + + it('Action_GetTeamMemberError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_GetTeamMemberErrorWithAdapter', async function () { + const conversationReference = getGroupConversationReference(); + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + }); + + it('Action_SendAppBasedLinkQueryResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendAppBasedLinkQueryResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMessageToTeamsChannel', async function () { + const conversationReference = getGroupConversationReference(); + const adapter = getTeamsTestAdapter(conversationReference); + adapter.use(new AddConnectorClientMiddleware()); + + const fetchExpectation = nock('https://api.botframework.com') + .post('/v3/conversations') + .times(2) + .reply(200); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + + ok(fetchExpectation.isDone()); + }); + + it('Action_SendMessageToTeamsChannelError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEActionResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEActionResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEAttachmentsResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEAttachmentsResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEAuthResponse', async function () { + // Note: the test.dialog for this test uses `StartsWith` at the end due to differences in JS and .NET TestAdapter.getSignInlink + const conversationReference = getPersonalConversationReference(); + conversationReference.conversation.id = 'Action_SendMEAuthResponse'; + const adapter = getTeamsTestAdapter(conversationReference); + + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + }); + + it('Action_SendMEAuthResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEAuthResponseErrorWithAdapter', async function () { + const adapter = getTeamsTestAdapter(); + // eslint-disable-next-line + // @ts-ignore: We have to set this to null to test the error but tsconfig "strict" doesn't allow it. + adapter.getUserToken = null; + await TestUtils.runTestScript(resourceExplorer, this.test?.title, adapter); + }); + + it('Action_SendMEBotMessagePreviewResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEBotMessagePreviewResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEConfigQuerySettingUrlResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEConfigQuerySettingUrlResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEMessageResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMEMessageResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMESelectItemResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendMESelectItemResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendTaskModuleCardResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendTaskModuleCardResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendTaskModuleMessageResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendTaskModuleUrlResponse', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); + + it('Action_SendTaskModuleUrlResponseError', async function () { + await TestUtils.runTestScript(resourceExplorer, this.test?.title); + }); +}); diff --git a/tests/unit/packages/Teams/js/tests/conditionalTests.test.ts b/tests/unit/packages/Teams/js/tests/conditionalTests.test.ts new file mode 100644 index 0000000000..9c6a66b6ef --- /dev/null +++ b/tests/unit/packages/Teams/js/tests/conditionalTests.test.ts @@ -0,0 +1,21 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +import { TestUtils } from 'botbuilder-dialogs-adaptive-testing'; +import 'mocha'; +import { AdaptiveTeamsBotComponent } from '@microsoft/bot-components-teams'; +import { makeResourceExplorer } from './utils'; + +describe('Conditional Tests', function () { + const resourceExplorer = makeResourceExplorer( + 'ConditionalTests', + AdaptiveTeamsBotComponent + ); + + it('OnTeamsActivityTypes', async () => { + await TestUtils.runTestScript( + resourceExplorer, + 'ConditionalsTests_OnTeamsActivityTypes' + ); + }); +}); diff --git a/tests/unit/packages/Teams/js/tests/utils.ts b/tests/unit/packages/Teams/js/tests/utils.ts new file mode 100644 index 0000000000..8998dbef16 --- /dev/null +++ b/tests/unit/packages/Teams/js/tests/utils.ts @@ -0,0 +1,41 @@ +// Licensed under the MIT License. +// Copyright (c) Microsoft Corporation. All rights reserved. + +import { AdaptiveBotComponent } from 'botbuilder-dialogs-adaptive'; +import { + ServiceCollection, + noOpConfiguration, +} from 'botbuilder-dialogs-adaptive-runtime-core'; +import { AdaptiveTestBotComponent } from 'botbuilder-dialogs-adaptive-testing'; +import { + ResourceExplorer, + ResourceExplorerOptions, +} from 'botbuilder-dialogs-declarative'; +import path from 'path'; +import { BotComponent } from 'botbuilder'; + +export function makeResourceExplorer( + resourceFolder: string, + ...botComponents: Array BotComponent> +): ResourceExplorer { + const services = new ServiceCollection({ + declarativeTypes: [], + }); + + new AdaptiveBotComponent().configureServices(services, noOpConfiguration); + new AdaptiveTestBotComponent().configureServices(services, noOpConfiguration); + + botComponents.forEach((BotComponent) => { + new BotComponent().configureServices(services, noOpConfiguration); + }); + + const declarativeTypes = services.mustMakeInstance('declarativeTypes'); + + return new ResourceExplorer({ + declarativeTypes, + } as ResourceExplorerOptions).addFolder( + path.join(__dirname, '..', '..', 'Shared Tests', resourceFolder), + true, + false + ); +} diff --git a/tests/unit/packages/Teams/js/tsconfig.json b/tests/unit/packages/Teams/js/tsconfig.json new file mode 100644 index 0000000000..fe0f8351e4 --- /dev/null +++ b/tests/unit/packages/Teams/js/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@tsconfig/recommended", + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "composite": true, + "sourceMap": true, + "strict": true + } + } + \ No newline at end of file diff --git a/tests/unit/skills/calendar/Microsoft.Bot.Dialogs.Tests.Skills.Calendar.csproj b/tests/unit/skills/calendar/Microsoft.Bot.Dialogs.Tests.Skills.Calendar.csproj index e98d945c2c..cd04caac54 100644 --- a/tests/unit/skills/calendar/Microsoft.Bot.Dialogs.Tests.Skills.Calendar.csproj +++ b/tests/unit/skills/calendar/Microsoft.Bot.Dialogs.Tests.Skills.Calendar.csproj @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/tests/unit/skills/common/Microsoft.Bot.Dialogs.Tests.Common.csproj b/tests/unit/skills/common/Microsoft.Bot.Dialogs.Tests.Common.csproj index 05c521c926..84135e3144 100644 --- a/tests/unit/skills/common/Microsoft.Bot.Dialogs.Tests.Common.csproj +++ b/tests/unit/skills/common/Microsoft.Bot.Dialogs.Tests.Common.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/tests/unit/skills/people/Microsoft.Bot.Dialogs.Tests.Skills.People.csproj b/tests/unit/skills/people/Microsoft.Bot.Dialogs.Tests.Skills.People.csproj index 02c6c2f4e2..cd9c89cd5b 100644 --- a/tests/unit/skills/people/Microsoft.Bot.Dialogs.Tests.Skills.People.csproj +++ b/tests/unit/skills/people/Microsoft.Bot.Dialogs.Tests.Skills.People.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/yarn.lock b/yarn.lock index faed4e0a0e..676d12eb0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,35 @@ __metadata: version: 4 cacheKey: 7 +"@azure/abort-controller@npm:^1.0.0": + version: 1.0.4 + resolution: "@azure/abort-controller@npm:1.0.4" + dependencies: + tslib: ^2.0.0 + checksum: e772f6c9afd2c448260f08ef796e4ff73348c5dfd100ce557cf73dd08d7664e819f11f8e59c19a76daa46c1b271ce3061db23072c2150b112df655d38e82944b + languageName: node + linkType: hard + +"@azure/cognitiveservices-luis-runtime@npm:2.0.0": + version: 2.0.0 + resolution: "@azure/cognitiveservices-luis-runtime@npm:2.0.0" + dependencies: + "@azure/ms-rest-js": ^1.6.0 + tslib: ^1.9.3 + checksum: 15d51d16a707a29e9e72e74e96a4227f43a76e12e920328a8f5c7ebb41c711ac11a9676035b2410a198ba9f0007521f650ebd0046709677b557755327a41a325 + languageName: node + linkType: hard + +"@azure/core-auth@npm:^1.1.4": + version: 1.3.2 + resolution: "@azure/core-auth@npm:1.3.2" + dependencies: + "@azure/abort-controller": ^1.0.0 + tslib: ^2.2.0 + checksum: 66c7d074b55e15ecf75c2de64841693c680c326c969dd037bc3800674b658ae1d1b717975c543a34de2da1a1eb1410983d7d2f96ad1d26b61f0372d9214feeb7 + languageName: node + linkType: hard + "@azure/ms-rest-js@npm:1.9.1": version: 1.9.1 resolution: "@azure/ms-rest-js@npm:1.9.1" @@ -21,6 +50,22 @@ __metadata: languageName: node linkType: hard +"@azure/ms-rest-js@npm:^1.6.0": + version: 1.11.2 + resolution: "@azure/ms-rest-js@npm:1.11.2" + dependencies: + "@azure/core-auth": ^1.1.4 + axios: ^0.21.1 + form-data: ^2.3.2 + tough-cookie: ^2.4.3 + tslib: ^1.9.2 + tunnel: 0.0.6 + uuid: ^3.2.1 + xml2js: ^0.4.19 + checksum: a96f2f075ecbef968ad85606087ad8a1d40382d4b9581d184049c46027f2d470b6b669d5dfec722545f54b10e75f8d60ea5a950a69393bc8c431ec81dd5f561b + languageName: node + linkType: hard + "@babel/code-frame@npm:7.12.11": version: 7.12.11 resolution: "@babel/code-frame@npm:7.12.11" @@ -85,39 +130,94 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/eslintrc@npm:0.4.2" + dependencies: + ajv: ^6.12.4 + debug: ^4.1.1 + espree: ^7.3.0 + globals: ^13.9.0 + ignore: ^4.0.6 + import-fresh: ^3.2.1 + js-yaml: ^3.13.1 + minimatch: ^3.0.4 + strip-json-comments: ^3.1.1 + checksum: 60b66ce4257bf5c36a920dea83a056102fef746e7afd7100a6fe245a126ff455f67f4948e75d28ed73090bff8f8556b6a996e74a124911ca703440bc245dbc23 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.5.0": + version: 0.5.0 + resolution: "@humanwhocodes/config-array@npm:0.5.0" + dependencies: + "@humanwhocodes/object-schema": ^1.2.0 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: 71e3c1fef40166ecaacbe29b681499dc6bab3fe45df5bfb3e137baf6e50f22813cf14f24ff759a4da43b6743d7f5a776298ae1e0e266c9602bab62da2ee3b302 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.0": + version: 1.2.0 + resolution: "@humanwhocodes/object-schema@npm:1.2.0" + checksum: ef533ee0d227b8036e4220013575fedc3d0346e2e40bc5f5536ba5761825f23577eb4b71e52f18a2d3b827c9d83cfa60c821a71e30d5f6537918a94bc1990963 + languageName: node + linkType: hard + "@microsoft/bot-components-helpandcancel@workspace:packages/HelpAndCancel": version: 0.0.0-use.local resolution: "@microsoft/bot-components-helpandcancel@workspace:packages/HelpAndCancel" languageName: unknown linkType: soft +"@microsoft/bot-components-teams-tests@workspace:tests/unit/packages/Teams/js": + version: 0.0.0-use.local + resolution: "@microsoft/bot-components-teams-tests@workspace:tests/unit/packages/Teams/js" + dependencies: + "@microsoft/bot-components-teams": "workspace:packages/Teams/js" + "@types/mocha": ^8.2.2 + botbuilder: 4.14.0 + botbuilder-dialogs-adaptive: 4.14.0-preview + botbuilder-dialogs-adaptive-testing: 4.14.0-preview + botframework-connector: 4.14.0 + eslint: ^7.30.0 + mocha: ^9.0.2 + nock: ^13.1.1 + ts-node: ^10.0.0 + languageName: unknown + linkType: soft + "@microsoft/bot-components-teams@workspace:packages/Teams/js": version: 0.0.0-use.local resolution: "@microsoft/bot-components-teams@workspace:packages/Teams/js" dependencies: "@tsconfig/recommended": ^1.0.1 "@types/lodash": ^4.14.168 - "@typescript-eslint/eslint-plugin": latest - "@typescript-eslint/parser": latest - adaptive-expressions: 4.13.4 - botbuilder: 4.13.4 - botbuilder-dialogs: 4.13.4 - botbuilder-dialogs-adaptive: 4.13.4-preview - botbuilder-dialogs-adaptive-runtime-core: 4.13.4-preview - botbuilder-dialogs-declarative: 4.13.4-preview - botbuilder-stdlib: 4.13.4-internal - eslint: latest + "@typescript-eslint/eslint-plugin": ^4.28.2 + "@typescript-eslint/parser": ^4.28.2 + adaptive-expressions: 4.14.0 + botbuilder: 4.14.0 + botbuilder-dialogs: 4.14.0 + botbuilder-dialogs-adaptive: 4.14.0-preview + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-dialogs-declarative: 4.14.0-preview + botbuilder-stdlib: 4.14.0-internal + botframework-connector: 4.14.0 + eslint: ^7.30.0 + eslint-plugin-prettier: latest lodash: ^4.17.21 rimraf: ^3.0.2 typescript: ^4.0.5 peerDependencies: - adaptive-expressions: ~4.13.4 - botbuilder: ~4.13.4 - botbuilder-dialogs: ~4.13.4 - botbuilder-dialogs-adaptive: ~4.13.4-preview - botbuilder-dialogs-adaptive-runtime-core: ~4.13.4-preview - botbuilder-dialogs-declarative: ~4.13.4-preview - botbuilder-stdlib: ~4.13.4-internal + adaptive-expressions: ~4.14.0 + botbuilder: ~4.14.0 + botbuilder-dialogs: ~4.14.0 + botbuilder-dialogs-adaptive: ~4.14.0-preview + botbuilder-dialogs-adaptive-runtime-core: ~4.14.0-preview + botbuilder-dialogs-declarative: ~4.14.0-preview + botbuilder-stdlib: ~4.14.0-internal + botframework-connector: ~4.14.0 lodash: ^4.17.21 languageName: unknown linkType: soft @@ -134,7 +234,7 @@ __metadata: languageName: unknown linkType: soft -"@microsoft/generator-bot-adaptive@workspace:^1.0.0, @microsoft/generator-bot-adaptive@workspace:generators/generator-bot-adaptive": +"@microsoft/generator-bot-adaptive@workspace:^1.1.1, @microsoft/generator-bot-adaptive@workspace:generators/generator-bot-adaptive": version: 0.0.0-use.local resolution: "@microsoft/generator-bot-adaptive@workspace:generators/generator-bot-adaptive" dependencies: @@ -157,7 +257,7 @@ __metadata: version: 0.0.0-use.local resolution: "@microsoft/generator-bot-core-assistant@workspace:generators/generator-bot-core-assistant" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -171,7 +271,7 @@ __metadata: version: 0.0.0-use.local resolution: "@microsoft/generator-bot-core-language@workspace:generators/generator-bot-core-language" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -185,7 +285,7 @@ __metadata: version: 0.0.0-use.local resolution: "@microsoft/generator-bot-core-qna@workspace:generators/generator-bot-core-qna" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -199,7 +299,7 @@ __metadata: version: 0.0.0-use.local resolution: "@microsoft/generator-bot-empty@workspace:generators/generator-bot-empty" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -213,9 +313,9 @@ __metadata: version: 0.0.0-use.local resolution: "@microsoft/generator-bot-enterprise-assistant@workspace:generators/generator-bot-enterprise-assistant" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" - "@microsoft/generator-bot-enterprise-calendar": "workspace:^1.0.0" - "@microsoft/generator-bot-enterprise-people": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" + "@microsoft/generator-bot-enterprise-calendar": "workspace:^1.1.1" + "@microsoft/generator-bot-enterprise-people": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -226,11 +326,11 @@ __metadata: languageName: unknown linkType: soft -"@microsoft/generator-bot-enterprise-calendar@workspace:^1.0.0, @microsoft/generator-bot-enterprise-calendar@workspace:generators/generator-bot-enterprise-calendar": +"@microsoft/generator-bot-enterprise-calendar@workspace:^1.1.1, @microsoft/generator-bot-enterprise-calendar@workspace:generators/generator-bot-enterprise-calendar": version: 0.0.0-use.local resolution: "@microsoft/generator-bot-enterprise-calendar@workspace:generators/generator-bot-enterprise-calendar" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -240,11 +340,11 @@ __metadata: languageName: unknown linkType: soft -"@microsoft/generator-bot-enterprise-people@workspace:^1.0.0, @microsoft/generator-bot-enterprise-people@workspace:generators/generator-bot-enterprise-people": +"@microsoft/generator-bot-enterprise-people@workspace:^1.1.1, @microsoft/generator-bot-enterprise-people@workspace:generators/generator-bot-enterprise-people": version: 0.0.0-use.local resolution: "@microsoft/generator-bot-enterprise-people@workspace:generators/generator-bot-enterprise-people" dependencies: - "@microsoft/generator-bot-adaptive": "workspace:^1.0.0" + "@microsoft/generator-bot-adaptive": "workspace:^1.1.1" eslint: latest eslint-config-prettier: latest eslint-plugin-prettier: latest @@ -467,6 +567,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.8 + resolution: "@tsconfig/node10@npm:1.0.8" + checksum: 0336493b89fb7c06409a1247a3fb00fac2755f21f3f8ae4b9dd2457859abfc5e8ca42b6d9ca5a279fe81bc70fe1f3450eef61e5dd5a63a7b4a6946ff31874816 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node12@npm:1.0.9" + checksum: 5532bfb5df47ed3a507da533c731a2fb80ee2e886edadbf20e664dcd3172d5c159577a281d15733b8d0c30bfa4e6b48496bef0704192c085520bc76bb9938068 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.1 + resolution: "@tsconfig/node14@npm:1.0.1" + checksum: d0068287dba46dc98e7d49c229b0fee034fbac2bb4bc2efe12cc67227a1c68ec0728ca1e535dff7f033f7455de6c67e9b8f9d90f4fc3bb07c0d9ac08186fe65c + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.1": + version: 1.0.1 + resolution: "@tsconfig/node16@npm:1.0.1" + checksum: c389a4a81c291a27b96705de7fbe46d29aa4eb771450a41dfc075d89e1fdd63141898043a0d9f627460a1c409d06635a044dc4b3a4516173769a7d0a1558c51d + languageName: node + linkType: hard + "@tsconfig/recommended@npm:^1.0.1": version: 1.0.1 resolution: "@tsconfig/recommended@npm:1.0.1" @@ -498,10 +626,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.3": - version: 7.0.7 - resolution: "@types/json-schema@npm:7.0.7" - checksum: b9d2c509fa4e0b82f58e73f5e6ab76c60ff1884ba41bb82f37fb1cece226d4a3e5a62fedf78a43da0005373a6713d9abe61c1e592906402c41c08ad6ab26d52b +"@types/json-schema@npm:^7.0.7": + version: 7.0.8 + resolution: "@types/json-schema@npm:7.0.8" + checksum: 435a3d18a88aeac7bc88c2cdd2c19466c62ce79303493edd72380cd4af9775c05f35d424d5e76ffe3f94575ebb535305c6cae928c5bfb9c39eafbfb6932520a1 languageName: node linkType: hard @@ -523,6 +651,22 @@ __metadata: languageName: node linkType: hard +"@types/lodash.isequal@npm:^4.5.5": + version: 4.5.5 + resolution: "@types/lodash.isequal@npm:4.5.5" + dependencies: + "@types/lodash": "*" + checksum: 141df617686010657bb3e46b21facce2dd15b771fdfebd9df2f3d6fd3603d6336b64da4027257402c640f71b65d91eca9305b53d282cf604bcbb88e662034aad + languageName: node + linkType: hard + +"@types/lodash@npm:*": + version: 4.14.171 + resolution: "@types/lodash@npm:4.14.171" + checksum: e48668fb030ad7d8c0c7751061bd332ad8704937d976bd4e24fd9e2128f80c17112be11e5c13d39f6a210336dc3549f7fb00eaebb56b94c2bfb89ad64c57d721 + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.168": version: 4.14.168 resolution: "@types/lodash@npm:4.14.168" @@ -544,6 +688,13 @@ __metadata: languageName: node linkType: hard +"@types/mocha@npm:^8.2.2": + version: 8.2.2 + resolution: "@types/mocha@npm:8.2.2" + checksum: 3455211b134b0cfcfc71fee2d4f22a6ac3e313a93bf6c0cd3519c1e85653ffb8c9bb68dcff083b8e9e15b4ea3cb4f50d9916709946c082f072807aeba747575b + languageName: node + linkType: hard + "@types/node@npm:*": version: 14.14.31 resolution: "@types/node@npm:14.14.31" @@ -606,103 +757,102 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:latest": - version: 4.22.0 - resolution: "@typescript-eslint/eslint-plugin@npm:4.22.0" +"@typescript-eslint/eslint-plugin@npm:^4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/eslint-plugin@npm:4.28.2" dependencies: - "@typescript-eslint/experimental-utils": 4.22.0 - "@typescript-eslint/scope-manager": 4.22.0 - debug: ^4.1.1 + "@typescript-eslint/experimental-utils": 4.28.2 + "@typescript-eslint/scope-manager": 4.28.2 + debug: ^4.3.1 functional-red-black-tree: ^1.0.1 - lodash: ^4.17.15 - regexpp: ^3.0.0 - semver: ^7.3.2 - tsutils: ^3.17.1 + regexpp: ^3.1.0 + semver: ^7.3.5 + tsutils: ^3.21.0 peerDependencies: "@typescript-eslint/parser": ^4.0.0 eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 40485bbf51283616b5098b33fa5285104a80419c4dcf75659442ae780352289bc238a64591939012ebc47823485497ae6ba8a35e653b0e33ff7f58743b46c34e + checksum: 6af8ea7665d5eaf0bafe241d71e3a85df07c0c82e59f530bd6627e0371e66a2d4a517cacd00d030680fe13d423b065c53185d3f48daa174fea316f024b1ab545 languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:4.22.0": - version: 4.22.0 - resolution: "@typescript-eslint/experimental-utils@npm:4.22.0" +"@typescript-eslint/experimental-utils@npm:4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/experimental-utils@npm:4.28.2" dependencies: - "@types/json-schema": ^7.0.3 - "@typescript-eslint/scope-manager": 4.22.0 - "@typescript-eslint/types": 4.22.0 - "@typescript-eslint/typescript-estree": 4.22.0 - eslint-scope: ^5.0.0 - eslint-utils: ^2.0.0 + "@types/json-schema": ^7.0.7 + "@typescript-eslint/scope-manager": 4.28.2 + "@typescript-eslint/types": 4.28.2 + "@typescript-eslint/typescript-estree": 4.28.2 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 peerDependencies: eslint: "*" - checksum: afabf0d6f9e70b910575d8bc2e8ccd3416e8d05ed968296fc56379f71f8cf3a27107598b98f7c76a91e6b0be796dc102c866381a3af5bf24799a333532d1e997 + checksum: 5b3fed818af9882ae54bf258351c2740a92aa0bb5a85478ce1d4d957e594882ece42048149b1a1a8500023c1d334d9846048bc96f309ed60715232be8ef5d1a8 languageName: node linkType: hard -"@typescript-eslint/parser@npm:latest": - version: 4.22.0 - resolution: "@typescript-eslint/parser@npm:4.22.0" +"@typescript-eslint/parser@npm:^4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/parser@npm:4.28.2" dependencies: - "@typescript-eslint/scope-manager": 4.22.0 - "@typescript-eslint/types": 4.22.0 - "@typescript-eslint/typescript-estree": 4.22.0 - debug: ^4.1.1 + "@typescript-eslint/scope-manager": 4.28.2 + "@typescript-eslint/types": 4.28.2 + "@typescript-eslint/typescript-estree": 4.28.2 + debug: ^4.3.1 peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 679e14a5cec5bae3b392b1736f5d919897fd1a269a9d25366babfd12c1d275b320ae36a0b8be215ba14780cb1feec2b386001b4e0225ef82bd0040bf5dbaf99f + checksum: 4d71ddbe039007f366b6e9deca12183e45ea165053a29b64e8e4534451a134fe664fd3bf8ec06951e2afe8b5fd14143fb2ef3182a9ee8d2b20a89a3c0f4f2529 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:4.22.0": - version: 4.22.0 - resolution: "@typescript-eslint/scope-manager@npm:4.22.0" +"@typescript-eslint/scope-manager@npm:4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/scope-manager@npm:4.28.2" dependencies: - "@typescript-eslint/types": 4.22.0 - "@typescript-eslint/visitor-keys": 4.22.0 - checksum: c6f5565f517373cba61d29be919c69ad0e178f2a007eed6f1d8f80518853c3c4e6a3a059e492920b71675f0828e093eb36ec9eef318b9e2b4e9e65b0e93f03b6 + "@typescript-eslint/types": 4.28.2 + "@typescript-eslint/visitor-keys": 4.28.2 + checksum: 31c30f428ba50087fc6a8dacc00b4d007d6653f1ea261a468e0a5425d730c5bf1e87bea581494862687c294d1f2ace30813f919800a05190fa332db6cd192bef languageName: node linkType: hard -"@typescript-eslint/types@npm:4.22.0": - version: 4.22.0 - resolution: "@typescript-eslint/types@npm:4.22.0" - checksum: db2717132540feba39b002cdb2483aa822e0b50c17f9deff918a52609178df071444188a1e76c07c51018c353b01509dd741272b6d482edf7d9e7d60adc6c70e +"@typescript-eslint/types@npm:4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/types@npm:4.28.2" + checksum: 9f5e6bf3df4540adf8eb1f83909bac778257f60a6ef7fcafa7df5224949839a63dba61fe4b58de538ffe17517e88ff6b29f691209f80a55df87935bac6349f69 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:4.22.0": - version: 4.22.0 - resolution: "@typescript-eslint/typescript-estree@npm:4.22.0" +"@typescript-eslint/typescript-estree@npm:4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/typescript-estree@npm:4.28.2" dependencies: - "@typescript-eslint/types": 4.22.0 - "@typescript-eslint/visitor-keys": 4.22.0 - debug: ^4.1.1 - globby: ^11.0.1 + "@typescript-eslint/types": 4.28.2 + "@typescript-eslint/visitor-keys": 4.28.2 + debug: ^4.3.1 + globby: ^11.0.3 is-glob: ^4.0.1 - semver: ^7.3.2 - tsutils: ^3.17.1 + semver: ^7.3.5 + tsutils: ^3.21.0 peerDependenciesMeta: typescript: optional: true - checksum: 538d932361d1463c9450c155fc5696f4cc1a07db2bfd4ca9079e1f919e5062fd95d8dc128fc2fa8368c9582787cfc97ee6284083b94fe8d580cd1a9fca688efa + checksum: 4fe36863b8af9808ee86b3cf64d6076a8b9a3224f9e1c17650d06ea46d80225b7e94903f71e7330a682b84eb1045189f1f09dc896165e9cab36714d24992ee84 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:4.22.0": - version: 4.22.0 - resolution: "@typescript-eslint/visitor-keys@npm:4.22.0" +"@typescript-eslint/visitor-keys@npm:4.28.2": + version: 4.28.2 + resolution: "@typescript-eslint/visitor-keys@npm:4.28.2" dependencies: - "@typescript-eslint/types": 4.22.0 + "@typescript-eslint/types": 4.28.2 eslint-visitor-keys: ^2.0.0 - checksum: 645896d05aa757fac02d952574ecda0eecd0be120162e28533c4528bb70d2162e9df62c3547217c69f18a72ceecaf212ea585afd20f976db64b59ac6de0d1ec8 + checksum: cec563831f563bb057f00045104db7ed92576755065d7563607c5f3581e5588fe8b83229767cd81763136aeb663dd49b99e7ee24decfbfc5fc7bd7b36bb1a525 languageName: node linkType: hard @@ -792,30 +942,31 @@ __metadata: languageName: node linkType: hard -"adal-node@npm:0.2.1": - version: 0.2.1 - resolution: "adal-node@npm:0.2.1" +"adal-node@npm:0.2.2": + version: 0.2.2 + resolution: "adal-node@npm:0.2.2" dependencies: "@types/node": ^8.0.47 async: ^2.6.3 + axios: ^0.21.1 date-utils: "*" jws: 3.x.x - request: ^2.88.0 underscore: ">= 1.3.1" uuid: ^3.1.0 xmldom: ">= 0.1.x" xpath.js: ~1.1.0 - checksum: 93cbb8a159873865996194cbc0ef2036927622c8ff21d2be0b093a476785b6d31e97cba80bc23fdd4ff0714aae62a43f507e3742a7c27e5ced92078519ecd554 + checksum: eafd8acda0ff50d57ce5939a801f6d72596aaeea26798d3ca006af713abd124d942f1a83d338c1472c23ca743b1940a7dc27e67b0bd63efb44e0568f6c2a96a8 languageName: node linkType: hard -"adaptive-expressions@npm:4.13.4": - version: 4.13.4 - resolution: "adaptive-expressions@npm:4.13.4" +"adaptive-expressions@npm:4.14.0": + version: 4.14.0 + resolution: "adaptive-expressions@npm:4.14.0" dependencies: "@microsoft/recognizers-text-data-types-timex-expression": 1.3.0 "@types/atob-lite": ^2.0.0 "@types/btoa-lite": ^1.0.0 + "@types/lodash.isequal": ^4.5.5 "@types/lru-cache": ^5.1.0 "@types/xmldom": ^0.1.30 antlr4ts: 0.5.0-alpha.3 @@ -825,13 +976,14 @@ __metadata: d3-format: ^1.4.4 dayjs: ^1.10.3 jspath: ^0.4.0 + lodash.isequal: ^4.5.0 lru-cache: ^5.1.1 uuid: ^8.3.2 x2js: ^3.4.0 xml2js: ^0.4.23 xmldom: ^0.5.0 xpath: ^0.0.32 - checksum: fc5a86ec925509d28275eec36a9285e8beb67a6b5b670de77a858ab9ea95cb03b53737f3dc657f4d5ce90275d60c7a98fef0c72dbb9ac69756c66e8678757e57 + checksum: de9b382e92ffe2bea6236ad40a19e73ab797e65943180e54392159c1731f3dc2138dda1d1af81c51bcc36e9a41410f64783f3ca13085933d36cbb2826e3a55b0 languageName: node linkType: hard @@ -859,6 +1011,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.1": + version: 8.6.1 + resolution: "ajv@npm:8.6.1" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 9abb66b4ced54f0e955313387183615028df1affc28859332d5d935258e391ead880ad5a4e5c59e3b82367486b3824faefdaf7b87cfd3a5b6629f14e8edc2fd7 + languageName: node + linkType: hard + "ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": version: 4.1.1 resolution: "ansi-colors@npm:4.1.1" @@ -945,7 +1109,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:~3.1.1": +"anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": version: 3.1.2 resolution: "anymatch@npm:3.1.2" dependencies: @@ -981,6 +1145,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 81b3b40b1529c4fbf75b12f7c3e6fb2dcce9e78072063babc169de9b4f40777788f3d2b04380f659ef676a756e03ccfbfe78adf4477353bda906295fa69dab89 + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -1122,16 +1293,6 @@ __metadata: languageName: node linkType: hard -"assert@npm:^1.4.1": - version: 1.5.0 - resolution: "assert@npm:1.5.0" - dependencies: - object-assign: ^4.1.1 - util: 0.10.3 - checksum: 9bd01a7a574d99656d3998b95e904c35fe41c9e18b8193a4b1bb3b1df2772f4fb03bf75897093daca9d883ed888d9be5da2a9a952da6f1da9101f4147a2f00c1 - languageName: node - linkType: hard - "assign-symbols@npm:^1.0.0": version: 1.0.0 resolution: "assign-symbols@npm:1.0.0" @@ -1508,6 +1669,13 @@ __metadata: languageName: node linkType: hard +"bitwise@npm:^2.0.4": + version: 2.1.0 + resolution: "bitwise@npm:2.1.0" + checksum: 51c7ae49c2c109444c6aafaf221b86c8caf10c60c3ac0316b0cb1a76d12c8af383170bec22863bdd378ac05730a145a0026a9ce1fe2ff4925dc75c3288e45011 + languageName: node + linkType: hard + "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -1519,156 +1687,194 @@ __metadata: languageName: node linkType: hard -"botbuilder-core@npm:4.13.4": - version: 4.13.4 - resolution: "botbuilder-core@npm:4.13.4" +"botbuilder-ai@npm:4.14.0": + version: 4.14.0 + resolution: "botbuilder-ai@npm:4.14.0" dependencies: - assert: ^1.4.1 - botbuilder-dialogs-adaptive-runtime-core: 4.13.4-preview - botbuilder-stdlib: 4.13.4-internal - botframework-connector: 4.13.4 - botframework-schema: 4.13.4 + "@azure/cognitiveservices-luis-runtime": 2.0.0 + "@azure/ms-rest-js": 1.9.1 + adaptive-expressions: 4.14.0 + botbuilder-core: 4.14.0 + botbuilder-dialogs: 4.14.0 + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-dialogs-declarative: 4.14.0-preview + botbuilder-stdlib: 4.14.0-internal + lodash: ^4.17.21 + node-fetch: ^2.6.0 + url-parse: ^1.5.1 + zod: ~1.11.17 + checksum: 1da331cc766169cf5b1a2ecca9e8c242ad51eced86656bafc134f3a53683aedb26d8bd1806e43ec14be2bba1950abbd7ef8a389b686f6d4e6339fb9eb2588f38 + languageName: node + linkType: hard + +"botbuilder-core@npm:4.14.0": + version: 4.14.0 + resolution: "botbuilder-core@npm:4.14.0" + dependencies: + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-stdlib: 4.14.0-internal + botframework-connector: 4.14.0 + botframework-schema: 4.14.0 uuid: ^8.3.2 - checksum: 6aaff87b1213008c6f3f49efb066a2866a89017bea3cf8b521842387068fafe74854f188df5a9c3753e767d9a72a9c63a1f964232f4b1bf2d9ded04dfb70efbd + zod: ~1.11.17 + checksum: b617e7fea0120460113d59062cdf12f7903eea36d7941089dfe55aae3ba4abf8b3990e09273d76a584095303c972712762a0d87263360f7b4eab3e2c5ed6e017 languageName: node linkType: hard -"botbuilder-dialogs-adaptive-runtime-core@npm:4.13.4-preview": - version: 4.13.4-preview - resolution: "botbuilder-dialogs-adaptive-runtime-core@npm:4.13.4-preview" +"botbuilder-dialogs-adaptive-runtime-core@npm:4.14.0-preview": + version: 4.14.0-preview + resolution: "botbuilder-dialogs-adaptive-runtime-core@npm:4.14.0-preview" dependencies: dependency-graph: ^0.10.0 - runtypes: ~5.1.0 - checksum: 6cd8217d06c11ed97867967986af875d3ac1c8b404bc5ed57e9a8a3111cac1d9b22918eaabbb2a4497ce45d97e86add3e75b76ddf01b015c35daabe66675b552 + checksum: 8bc38639faa59e541a32feac99d7eb3428d6a5a2071d2cdaaee3b1480224ed213cfa00f974236f76b4169848bf2189e19e4e08a1415b4646b4e58ebc3aee1da1 + languageName: node + linkType: hard + +"botbuilder-dialogs-adaptive-testing@npm:4.14.0-preview": + version: 4.14.0-preview + resolution: "botbuilder-dialogs-adaptive-testing@npm:4.14.0-preview" + dependencies: + adaptive-expressions: 4.14.0 + bitwise: ^2.0.4 + botbuilder-ai: 4.14.0 + botbuilder-core: 4.14.0 + botbuilder-dialogs: 4.14.0 + botbuilder-dialogs-adaptive: 4.14.0-preview + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-dialogs-declarative: 4.14.0-preview + botbuilder-stdlib: 4.14.0-internal + murmurhash-js: ^1.0.0 + nock: ^11.9.1 + url-parse: ^1.5.1 + checksum: 6bff035cf41273596df50a0755026a34a7b55ae31af21d2c0574b961e84d3622ae545a74db296de7df533f028daa96c563ba70df3dc864b291cccce35d4c61d2 languageName: node linkType: hard -"botbuilder-dialogs-adaptive@npm:4.13.4-preview": - version: 4.13.4-preview - resolution: "botbuilder-dialogs-adaptive@npm:4.13.4-preview" +"botbuilder-dialogs-adaptive@npm:4.14.0-preview": + version: 4.14.0-preview + resolution: "botbuilder-dialogs-adaptive@npm:4.14.0-preview" dependencies: "@microsoft/recognizers-text-suite": 1.1.4 - adaptive-expressions: 4.13.4 - botbuilder: 4.13.4 - botbuilder-dialogs: 4.13.4 - botbuilder-dialogs-adaptive-runtime-core: 4.13.4-preview - botbuilder-dialogs-declarative: 4.13.4-preview - botbuilder-lg: 4.13.4 - botframework-connector: 4.13.4 - botframework-schema: 4.13.4 + adaptive-expressions: 4.14.0 + botbuilder: 4.14.0 + botbuilder-dialogs: 4.14.0 + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-dialogs-declarative: 4.14.0-preview + botbuilder-lg: 4.14.0 lodash: ^4.17.21 node-fetch: ^2.6.0 - checksum: d11907e44030b3dc2ed1c822679de512642ec1d0ad222d4e318292922c45d36cd37d82645f9835c4928065aca5cc75ab11f2e34aea124baac2b7ac6c0ab86686 + checksum: 622237a71b8f63e8cb5e536910a0e6997dc47c1f130c09877d134dd9909873fb1a12677e4d3228c97ae7a4dd1933cdd2314c4a1c5dda059ff879687eec151ecc languageName: node linkType: hard -"botbuilder-dialogs-declarative@npm:4.13.4-preview": - version: 4.13.4-preview - resolution: "botbuilder-dialogs-declarative@npm:4.13.4-preview" +"botbuilder-dialogs-declarative@npm:4.14.0-preview": + version: 4.14.0-preview + resolution: "botbuilder-dialogs-declarative@npm:4.14.0-preview" dependencies: - botbuilder-core: 4.13.4 - botbuilder-dialogs: 4.13.4 - botbuilder-stdlib: 4.13.4-internal + botbuilder-core: 4.14.0 + botbuilder-dialogs: 4.14.0 + botbuilder-stdlib: 4.14.0-internal chokidar: ^3.4.0 - checksum: e18d637ca5cff9d0df34d813ac57108a617bc989dc37ae85130a2dc8756e11bb695fa47b8283fea8e629f47acae65d067ef9bd064411e8d27fc82d0e053e4d15 + checksum: 25863f1a2e4edd5982a5d103c44aa8f66c2ff16adf07a2fff8d49c48084f2c2143470478b978fbae0c6c82cf2f88e6fcd82a6887453f53526d186bd96d462c50 languageName: node linkType: hard -"botbuilder-dialogs@npm:4.13.4": - version: 4.13.4 - resolution: "botbuilder-dialogs@npm:4.13.4" +"botbuilder-dialogs@npm:4.14.0": + version: 4.14.0 + resolution: "botbuilder-dialogs@npm:4.14.0" dependencies: "@microsoft/recognizers-text-choice": 1.1.4 "@microsoft/recognizers-text-date-time": 1.1.4 "@microsoft/recognizers-text-number": 1.1.4 "@microsoft/recognizers-text-suite": 1.1.4 - botbuilder-core: 4.13.4 - botbuilder-dialogs-adaptive-runtime-core: 4.13.4-preview - botbuilder-stdlib: 4.13.4-internal - botframework-connector: 4.13.4 + botbuilder-core: 4.14.0 + botbuilder-dialogs-adaptive-runtime-core: 4.14.0-preview + botbuilder-stdlib: 4.14.0-internal + botframework-connector: 4.14.0 globalize: ^1.4.2 lodash: ^4.17.21 - runtypes: ~5.1.0 - uuid: ^8.3.2 - checksum: b7ac611bbf67946d0e32383a2df03c8b16f15d80850bb2e235686d588150c015db8d3c1475cad7d452c03d61ac8c5d0e70e30e86508489936e9862090da9cbe7 + zod: ~1.11.17 + checksum: c1f58e6b4bddeeea500f5bea3e1552478b39e11ea679f7d7771cf1bfb29cb79df627ac8405f3997a713338dde6861e0c465e4ab5fa78bf817264b5e49132a56a languageName: node linkType: hard -"botbuilder-lg@npm:4.13.4": - version: 4.13.4 - resolution: "botbuilder-lg@npm:4.13.4" +"botbuilder-lg@npm:4.14.0": + version: 4.14.0 + resolution: "botbuilder-lg@npm:4.14.0" dependencies: - adaptive-expressions: 4.13.4 + adaptive-expressions: 4.14.0 antlr4ts: 0.5.0-alpha.3 lodash: ^4.17.19 - path: ^0.12.7 uuid: ^8.3.2 - checksum: d1788d7ad6cc6fc64d818b89200e7d65b2a3e62e26267838b6b5861030f46fd54250bb46e6aa6da4c04425e317c002c51d00d09c22b894468cecd27ab20c4ee6 + checksum: b7602b0fabdb80994c6949f78fcd6f467917799586d857be37add227a8c261a6b4e4b24ad4d12e41ab458c062fa6fe68cb0bdb8cffa0f4f60b5ef7ea291add08 languageName: node linkType: hard -"botbuilder-stdlib@npm:4.13.4-internal": - version: 4.13.4-internal - resolution: "botbuilder-stdlib@npm:4.13.4-internal" - checksum: c6dd92a039fcca421841d9c0ebec88438152edcc8cab6ef16b2e3653c0cee5d287b4b0df02117c24b51af72a13c095c0b25e34fe2631cd5572addc15a8b735ce +"botbuilder-stdlib@npm:4.14.0-internal": + version: 4.14.0-internal + resolution: "botbuilder-stdlib@npm:4.14.0-internal" + checksum: e38630a1ae535c06422033b1301b764977cfd06259904d25c6a8bd72a676865c456fcdb792ce3abf03a3bb508bb212ab93a4b81702a32384cf297abe7dc9b8d4 languageName: node linkType: hard -"botbuilder@npm:4.13.4": - version: 4.13.4 - resolution: "botbuilder@npm:4.13.4" +"botbuilder@npm:4.14.0": + version: 4.14.0 + resolution: "botbuilder@npm:4.14.0" dependencies: "@azure/ms-rest-js": 1.9.1 axios: ^0.21.1 - botbuilder-core: 4.13.4 - botbuilder-dialogs-adaptive-runtime-core: 4.13.4-preview - botbuilder-stdlib: 4.13.4-internal - botframework-connector: 4.13.4 - botframework-streaming: 4.13.4 + botbuilder-core: 4.14.0 + botbuilder-stdlib: 4.14.0-internal + botframework-connector: 4.14.0 + botframework-streaming: 4.14.0 dayjs: ^1.10.3 filenamify: ^4.1.0 fs-extra: ^7.0.1 htmlparser2: ^6.0.1 uuid: ^8.3.2 - checksum: 20b1ca64457e1c371401f3e79476d4395f829ef7c74ef529958d2a58f90c214f68e679c7c9d73beeee1ec94fda2ad41ad017778a9d05c55c11a0b36a5b11573e + zod: ~1.11.17 + checksum: a916227bc341fc106be36f8fde60f7e83ebb8e05014d5c314c0a515711cd70595615d183989286557bad1ef08a5ad923a4bb03758a03cbc28440facafb9b0932 languageName: node linkType: hard -"botframework-connector@npm:4.13.4": - version: 4.13.4 - resolution: "botframework-connector@npm:4.13.4" +"botframework-connector@npm:4.14.0": + version: 4.14.0 + resolution: "botframework-connector@npm:4.14.0" dependencies: "@azure/ms-rest-js": 1.9.1 "@types/jsonwebtoken": 7.2.8 "@types/node": ^10.17.27 - adal-node: 0.2.1 + adal-node: 0.2.2 + axios: ^0.21.1 base64url: ^3.0.0 - botframework-schema: 4.13.4 + botbuilder-stdlib: 4.14.0-internal + botframework-schema: 4.14.0 cross-fetch: ^3.0.5 jsonwebtoken: 8.0.1 rsa-pem-from-mod-exp: ^0.8.4 - checksum: 2d1ab8b2fd4af68634cb23e31014bbc5464abfe4d76722a275a551a0b81819f15ee89bc343a8a1b918498aecb062020d638a0b2ed3c660169bd005443986dc1d + checksum: 565e2475524cd3ee3d2e4ddd83890e58a15e68f128daf9be5ad943e38c3088e8ed1a7f04c082825059a83fb007106ec1047e90aec19235665c27a526d0e9443e languageName: node linkType: hard -"botframework-schema@npm:4.13.4": - version: 4.13.4 - resolution: "botframework-schema@npm:4.13.4" +"botframework-schema@npm:4.14.0": + version: 4.14.0 + resolution: "botframework-schema@npm:4.14.0" dependencies: - botbuilder-stdlib: 4.13.4-internal - checksum: 5cf0ec42293396802b083e8099077fcb86e40ab41efd4b955aeb76253754b50f35e7d602bf3d88dafb90586bc05ad1d55d959f793333fce6f522d831a1e487ac + botbuilder-stdlib: 4.14.0-internal + uuid: ^8.3.2 + checksum: fd86f0a6eb5be4f84c90bdb58de20129fdd92138652aaebc4cc29ccdf7e0f7944e85c1c007ecb654d576b734fce984466ff2d7edc2f98c344f1210b23f0badf1 languageName: node linkType: hard -"botframework-streaming@npm:4.13.4": - version: 4.13.4 - resolution: "botframework-streaming@npm:4.13.4" +"botframework-streaming@npm:4.14.0": + version: 4.14.0 + resolution: "botframework-streaming@npm:4.14.0" dependencies: "@types/node": ^10.17.27 "@types/ws": ^6.0.3 uuid: ^8.3.2 ws: ^7.1.2 - checksum: b85af5123e04968e5cf89518f643531b15e33da0a42153b33ff8f6f39aebe6b2a5083707c6c6a87a45d755a5f6243216acaee9d3ca24338d2d207c6af05f4f4e + checksum: c23f75c1ddd95f2265bbf77c68ba0c188492398daaa0cda1cab113e9d22dcf63aec1831a5ce1df7382b91f20c0202c12e9afa4c6de799d64690825d3c3b5f76a languageName: node linkType: hard @@ -1991,6 +2197,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:3.5.2": + version: 3.5.2 + resolution: "chokidar@npm:3.5.2" + dependencies: + anymatch: ~3.1.2 + braces: ~3.0.2 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 + is-binary-path: ~2.1.0 + is-glob: ~4.0.1 + normalize-path: ~3.0.0 + readdirp: ~3.6.0 + dependenciesMeta: + fsevents: + optional: true + checksum: 52fbff3acebf06ec0125872110f6c8403e66cd3d613264c83405496e199554d99380342d9b3a7ffd7910c53c5865e242ed7dd72fcb2e883d8e3ad3f3883aee6c + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2292,6 +2517,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: babd307893abfb26d77ae11cb9d6b6cfa6d18c9cee435cf70b5a3fb44aa8d90c9ec26ea89cbb16e0a94b8d34f5fcaee164b90ed526cdd3158955673ab9652d01 + languageName: node + linkType: hard + "cross-fetch@npm:^3.0.5": version: 3.1.4 resolution: "cross-fetch@npm:3.1.4" @@ -2433,7 +2665,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.0.1, debug@npm:^4.1.0": +"debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.3.1": version: 4.3.2 resolution: "debug@npm:4.3.2" dependencies: @@ -2864,7 +3096,7 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:4.0.0": +"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" checksum: c747be8d5ff7873127e3e0cffe7d2206a37208077fa9c30a3c1bb4f26bebd081c8c24d5fba7a99449f9d20670bea3dc5e1b6098b0f074b099bd38766271a272f @@ -2930,7 +3162,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.0.0, eslint-scope@npm:^5.1.1": +"eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -2940,7 +3172,7 @@ __metadata: languageName: node linkType: hard -"eslint-utils@npm:^2.0.0, eslint-utils@npm:^2.1.0": +"eslint-utils@npm:^2.1.0": version: 2.1.0 resolution: "eslint-utils@npm:2.1.0" dependencies: @@ -2949,6 +3181,17 @@ __metadata: languageName: node linkType: hard +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" + dependencies: + eslint-visitor-keys: ^2.0.0 + peerDependencies: + eslint: ">=5" + checksum: 035451529f016e28edd26e8951f15e28a6a4e58adff67bd0cb494879f360080750b9c779e46561369aec0657ac2b89dd8b0aa38476e8cdf50e635aa872fa27b6 + languageName: node + linkType: hard + "eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0": version: 1.3.0 resolution: "eslint-visitor-keys@npm:1.3.0" @@ -2963,6 +3206,56 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^7.30.0": + version: 7.30.0 + resolution: "eslint@npm:7.30.0" + dependencies: + "@babel/code-frame": 7.12.11 + "@eslint/eslintrc": ^0.4.2 + "@humanwhocodes/config-array": ^0.5.0 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.0.1 + doctrine: ^3.0.0 + enquirer: ^2.3.5 + escape-string-regexp: ^4.0.0 + eslint-scope: ^5.1.1 + eslint-utils: ^2.1.0 + eslint-visitor-keys: ^2.0.0 + espree: ^7.3.1 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + functional-red-black-tree: ^1.0.1 + glob-parent: ^5.1.2 + globals: ^13.6.0 + ignore: ^4.0.6 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^3.13.1 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.0.4 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + progress: ^2.0.0 + regexpp: ^3.1.0 + semver: ^7.2.1 + strip-ansi: ^6.0.0 + strip-json-comments: ^3.1.0 + table: ^6.0.9 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: 028048847e0252d6c972ac612fe37be55822ae2255d10d1bf68255749f7ae1364b2aa538cd95f3bc4d951fc7d36195e46b62fe8d215297ef9a6a8aeb8ca28a90 + languageName: node + linkType: hard + "eslint@npm:latest": version: 7.21.0 resolution: "eslint@npm:7.21.0" @@ -3252,7 +3545,7 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.1": +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: 451526766b219503131d11e823eaadd1533080b0be4860e316670b039dcaf31cd1007c2fe036a9b922abba7c040dfad5e942ed79d21f2ff849e50049f36e0fb7 @@ -3641,7 +3934,7 @@ fsevents@^1.2.3: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.1#builtin": +"fsevents@patch:fsevents@~2.3.1#builtin, fsevents@patch:fsevents@~2.3.2#builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#builtin::version=2.3.2&hash=11e9ea" dependencies: @@ -3650,7 +3943,7 @@ fsevents@^1.2.3: languageName: node linkType: hard -fsevents@~2.3.1: +"fsevents@~2.3.1, fsevents@~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -3841,7 +4134,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"glob-parent@npm:^5.0.0, glob-parent@npm:^5.1.0, glob-parent@npm:~5.1.0": +"glob-parent@npm:^5.0.0, glob-parent@npm:^5.1.0, glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -3871,6 +4164,20 @@ fsevents@~2.3.1: languageName: node linkType: hard +"glob@npm:7.1.7": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 352f74f08247db5420161a2f68f2bd84b53228b5fcfc9dcc37cd54d3f19ec0232495d84aeff1286d0727059e9fdc1031400e00b971bdc59e30f8f82b199c9d02 + languageName: node + linkType: hard + "globalize@npm:^1.4.2": version: 1.6.0 resolution: "globalize@npm:1.6.0" @@ -3889,6 +4196,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"globals@npm:^13.6.0, globals@npm:^13.9.0": + version: 13.10.0 + resolution: "globals@npm:13.10.0" + dependencies: + type-fest: ^0.20.2 + checksum: ae5f8d4ef26b845a3d2a370a0dd0b7cc8bce09d11bf75dbde8dce8a0855e8ad4f34613090eaad8e71d24fb01fe00d8b2708533b32da08f104c0ddd19b70219f1 + languageName: node + linkType: hard + "globals@npm:^9.18.0": version: 9.18.0 resolution: "globals@npm:9.18.0" @@ -3896,9 +4212,9 @@ fsevents@~2.3.1: languageName: node linkType: hard -"globby@npm:^11.0.1, globby@npm:^11.0.3": - version: 11.0.3 - resolution: "globby@npm:11.0.3" +"globby@npm:^11.0.2": + version: 11.0.2 + resolution: "globby@npm:11.0.2" dependencies: array-union: ^2.1.0 dir-glob: ^3.0.1 @@ -3906,13 +4222,13 @@ fsevents@~2.3.1: ignore: ^5.1.4 merge2: ^1.3.0 slash: ^3.0.0 - checksum: f17da0f869918656ec8c16c15ad100f025fbd13e4c157286cf340811eb1355a7d06dde77be1685a7a051970ec6abeff96a9b2a1a97525f84bc94fbd518c1d1db + checksum: d23f2a6b8897b97fb27422cde243e0fd406ebbaa821929293b27c977d169884f8112494cda4f456a51d0ec1e133e3ac703ec24bfed484e327305ea34a665eb06 languageName: node linkType: hard -"globby@npm:^11.0.2": - version: 11.0.2 - resolution: "globby@npm:11.0.2" +"globby@npm:^11.0.3": + version: 11.0.3 + resolution: "globby@npm:11.0.3" dependencies: array-union: ^2.1.0 dir-glob: ^3.0.1 @@ -3920,7 +4236,7 @@ fsevents@~2.3.1: ignore: ^5.1.4 merge2: ^1.3.0 slash: ^3.0.0 - checksum: d23f2a6b8897b97fb27422cde243e0fd406ebbaa821929293b27c977d169884f8112494cda4f456a51d0ec1e133e3ac703ec24bfed484e327305ea34a665eb06 + checksum: f17da0f869918656ec8c16c15ad100f025fbd13e4c157286cf340811eb1355a7d06dde77be1685a7a051970ec6abeff96a9b2a1a97525f84bc94fbd518c1d1db languageName: node linkType: hard @@ -4377,20 +4693,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"inherits@npm:2.0.1": - version: 2.0.1 - resolution: "inherits@npm:2.0.1" - checksum: 6f59f627a64cff6f4b5a2723184d831e6fc376cf88b8a94821caa2cad9d44da6d79583335024c01a541d9a25767785928a28f6e2192bb14be9ce800b315b4faa - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 9488f9433effbc24474f6baee8014e5337c7f99305ecb4204fa5864ae7655c24225780d87fc65ed8d3d374715a18c5dc8c69fe3bf9745cde2e7acd0ac068a07b - languageName: node - linkType: hard - "ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" @@ -5530,6 +5832,17 @@ fsevents@~2.3.1: languageName: node linkType: hard +"js-yaml@npm:4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: 8973cf4296c944cc2551d1e3d3d064e7de0d0a6db3f7bafe40339ee9e5e0329560b52c4b8492b9b22365404c9be0822b62340ab49884e1dedfcc7ff80158abe0 + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1, js-yaml@npm:^3.7.0": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -5641,7 +5954,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": +"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" checksum: 261dfb8eb3e72c8b0dda11fd7c20c151ffc1d1b03e529245d51708c8dd8d8c6a225880464adf41a570dff6e5c805fd9d1f47fed948cfb526e4fbe5a67ce4e5f4 @@ -5902,6 +6215,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 41e2fe4c57c56a66a4775a6ddeebe9272f0ce4d257d97b3cb8724a9b01eeec9b09ce7e8603d6926baf5f48c287d988f0de4bf5aa244ea86b1f22c1e6f203cc27 + languageName: node + linkType: hard + "lodash.escaperegexp@npm:^4.1.2": version: 4.1.2 resolution: "lodash.escaperegexp@npm:4.1.2" @@ -5979,6 +6299,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 4e2bb42a87a148991458d7c384bc197e96f7115e9536fc8e2c86ae9e99ce1c1f693ff15eb85761952535f48d72253aed8e673d9f32dde3e671cd91e3fde220a7 + languageName: node + linkType: hard + "lodash.once@npm:^4.0.0": version: 4.1.1 resolution: "lodash.once@npm:4.1.1" @@ -5986,6 +6313,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"lodash.set@npm:^4.3.2": + version: 4.3.2 + resolution: "lodash.set@npm:4.3.2" + checksum: 4dfedacae1c1cf86385a2b6e30ba538f06c90d703a0abd83a11432d80ec24b4016fe27359cdc0554a02a31a468789cbb282801dd755e54581cf0295477e2341d + languageName: node + linkType: hard + "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -6007,6 +6341,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b1b0d7d993bb73d0032fe909d4523a836b6aa91566fa88ff78c3eac008bd3d3b2ba0f2e8381d7f906b1d6913a64982f34bea95dd556355c0d418bfddf3ab7b06 + languageName: node + linkType: hard + "lodash.zip@npm:^4.0.0": version: 4.2.0 resolution: "lodash.zip@npm:4.2.0" @@ -6014,7 +6355,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.3.0": +"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.13, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.3.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 4983720b9abca930a4a46f18db163d7dad8dd00dbed6db0cc7b499b33b717cce69f80928b27bbb1ff2cbd3b19d251ee90669a8b5ea466072ca81c2ebe91e7468 @@ -6030,16 +6371,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"log-symbols@npm:^2.2.0": - version: 2.2.0 - resolution: "log-symbols@npm:2.2.0" - dependencies: - chalk: ^2.0.1 - checksum: e2dfd255f3e3080134055597fb67bd67798d65383488683ed90f0376f7264dd21028f30d4c3a0686251dcfc4dc71172e8061cef21e89c6deabb8b375450d5166 - languageName: node - linkType: hard - -"log-symbols@npm:^4.1.0": +"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -6049,6 +6381,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"log-symbols@npm:^2.2.0": + version: 2.2.0 + resolution: "log-symbols@npm:2.2.0" + dependencies: + chalk: ^2.0.1 + checksum: e2dfd255f3e3080134055597fb67bd67798d65383488683ed90f0376f7264dd21028f30d4c3a0686251dcfc4dc71172e8061cef21e89c6deabb8b375450d5166 + languageName: node + linkType: hard + "lolex@npm:^2.4.2": version: 2.7.5 resolution: "lolex@npm:2.7.5" @@ -6126,6 +6467,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 2c780bab8409b865e8ee86697c599a2bf2765ec64d21eb67ccda27050e039f983feacad05a0d43aba3c966ea03d305d2612e94fec45474bcbc61181f57c5bb88 + languageName: node + linkType: hard + "makeerror@npm:1.0.x": version: 1.0.11 resolution: "makeerror@npm:1.0.11" @@ -6507,6 +6855,42 @@ fsevents@~2.3.1: languageName: node linkType: hard +"mocha@npm:^9.0.2": + version: 9.0.2 + resolution: "mocha@npm:9.0.2" + dependencies: + "@ungap/promise-all-settled": 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.2 + debug: 4.3.1 + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.1.7 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 3.0.4 + ms: 2.1.3 + nanoid: 3.1.23 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + wide-align: 1.1.3 + workerpool: 6.1.5 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + bin: + _mocha: bin/_mocha + mocha: bin/mocha + checksum: 305d820f2e7237f54c2c034198978c1ef7c0cf99ddf0c511c8e65e0d7cd00a2b87f7826dc91afa080473152159c1402f419f18d67f831dc55ebc84710ee97823 + languageName: node + linkType: hard + "moment@npm:^2.15.1, moment@npm:^2.24.0": version: 2.29.1 resolution: "moment@npm:2.29.1" @@ -6573,6 +6957,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"murmurhash-js@npm:^1.0.0": + version: 1.0.0 + resolution: "murmurhash-js@npm:1.0.0" + checksum: 7b0f02796fde7a6fe0e41ed3197b758e6824f33b284a5cbdcca0942e629d34309a4e344760204ad5503dc1d75f9ba7574b72406ac654dc56ab69f22b1e9ee821 + languageName: node + linkType: hard + "mute-stream@npm:0.0.7": version: 0.0.7 resolution: "mute-stream@npm:0.0.7" @@ -6605,6 +6996,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"nanoid@npm:3.1.23": + version: 3.1.23 + resolution: "nanoid@npm:3.1.23" + bin: + nanoid: bin/nanoid.cjs + checksum: e6dea1da5a593ffdc8cf2676d1d02f0626f07a54a5947a7a1f5ff1fd07901b2f53044c285e98b87eb367f016fde285fd8785d54a2dceeab9c3721f4e618f8326 + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -6671,6 +7071,31 @@ fsevents@~2.3.1: languageName: node linkType: hard +"nock@npm:^11.9.1": + version: 11.9.1 + resolution: "nock@npm:11.9.1" + dependencies: + debug: ^4.1.0 + json-stringify-safe: ^5.0.1 + lodash: ^4.17.13 + mkdirp: ^0.5.0 + propagate: ^2.0.0 + checksum: 4cbbe7ee50d7a1514c60dfdbd40e10b9ec51035b8f0282dbb1bdd795ae2dd6d8612713b5edcf7fb1034f2d6b4449f672be71880702f1f5d36e06b0e718731ffc + languageName: node + linkType: hard + +"nock@npm:^13.1.1": + version: 13.1.1 + resolution: "nock@npm:13.1.1" + dependencies: + debug: ^4.1.0 + json-stringify-safe: ^5.0.1 + lodash.set: ^4.3.2 + propagate: ^2.0.0 + checksum: fa118c2c62a432b4665fa2a8fe549959ba41666bebf5939873a0fbc3a860310580272de74b3ea9538758a7f08dddd807edf35f162854763a0056f2ed892b210f + languageName: node + linkType: hard + "node-fetch@npm:2.6.1, node-fetch@npm:^2.6.0": version: 2.6.1 resolution: "node-fetch@npm:2.6.1" @@ -6845,7 +7270,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"object-assign@npm:^4.1.0": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 66cf021898fc1b13ea573ea8635fbd5a76533f50cecbc2fcd5eee1e8029af41bcebe7023788b6d0e06cbe4401ecea075d972f78ec74467cdc571a0f1a4d1a081 @@ -7322,16 +7747,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"path@npm:^0.12.7": - version: 0.12.7 - resolution: "path@npm:0.12.7" - dependencies: - process: ^0.11.1 - util: ^0.10.3 - checksum: 0e2d3342ca6f91aba8e514919cae8a08ad12071297a3a99da6e3ea493f5296d9bb323ca9bece4d035fc280e91b701a740ce1e48ff65802004deaaae2f2cd623e - languageName: node - linkType: hard - "performance-now@npm:^2.1.0": version: 2.1.0 resolution: "performance-now@npm:2.1.0" @@ -7504,13 +7919,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"process@npm:^0.11.1": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: ed93a85e9185b40fb01788c588a87c1a9da0eb925ef7cebebbe1b8bbf0eba1802130366603a29e3b689c116969d4fe018de6aed3474bbeb5aefb3716b85d6449 - languageName: node - linkType: hard - "progress@npm:^2.0.0": version: 2.0.3 resolution: "progress@npm:2.0.3" @@ -7528,6 +7936,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"propagate@npm:^2.0.0": + version: 2.0.1 + resolution: "propagate@npm:2.0.1" + checksum: dd67518106bb3f1ee230b7e246a18285467e010b89703844f120c38e1462b52d79bddd4be0f8db080377a3d55218209674eae9eb672c29a033bf6b44cfc42828 + languageName: node + linkType: hard + "psl@npm:^1.1.28": version: 1.8.0 resolution: "psl@npm:1.8.0" @@ -7570,6 +7985,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 6235036be3aedff7919dfc06b23f759264915c5794c6352d52a917401d40d2b9bb43b1d82e4e5be983e469aa320e06992aefc218192f6fa1d9eba4f54dc4786c + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.2 resolution: "queue-microtask@npm:1.2.2" @@ -7740,6 +8162,15 @@ fsevents@~2.3.1: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: ^2.2.1 + checksum: 7da2fe8d5abf17ae0bf97a052718e16d29fa185f3e461153035728d93642326ae8e44c17b9a9b3a5fa616dff160e96be3184e0323efaac7211f80c0aab5f622b + languageName: node + linkType: hard + "realpath-native@npm:^1.0.0": version: 1.1.0 resolution: "realpath-native@npm:1.1.0" @@ -7784,7 +8215,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"regexpp@npm:^3.0.0, regexpp@npm:^3.1.0": +"regexpp@npm:^3.1.0": version: 3.1.0 resolution: "regexpp@npm:3.1.0" checksum: 69d0ce6b449cf35d3732d6341a1e70850360ffc619f8eef10629871c462e614853fffb80d3f00fc17cd0bb5b8f34b0cde5be4b434e72c0eb3fbba2360c8b5ac4 @@ -7861,7 +8292,7 @@ fsevents@~2.3.1: languageName: node linkType: hard -"request@npm:^2.87.0, request@npm:^2.88.0, request@npm:^2.88.2": +"request@npm:^2.87.0, request@npm:^2.88.2": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -7910,6 +8341,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 0db25fb2ac9b4f2345a350846b7ba99d1f25a6686b1728246d14f05450c8f2fc066bdfae4561b4be2627c184a030a27e17268cfefdf46836e271db13734bc49e + languageName: node + linkType: hard + "resolve-cwd@npm:^2.0.0": version: 2.0.0 resolution: "resolve-cwd@npm:2.0.0" @@ -8205,6 +8643,17 @@ resolve@1.1.7: languageName: node linkType: hard +"semver@npm:^7.3.5": + version: 7.3.5 + resolution: "semver@npm:7.3.5" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: c53624ddf4b9779bcbf55a1eb8b37074cc44bfeca416f3cc263429408202a8a3c59b00eef8c647d697303bc39b95c022a5c61959221d3814bfb1270ff7c14986 + languageName: node + linkType: hard + "serialize-javascript@npm:5.0.1": version: 5.0.1 resolution: "serialize-javascript@npm:5.0.1" @@ -8214,6 +8663,15 @@ resolve@1.1.7: languageName: node linkType: hard +"serialize-javascript@npm:6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" + dependencies: + randombytes: ^2.1.0 + checksum: e086a40bfcb9d341c37a4e52bc200d143b54397cf1bb486f38cd40cdbaac4b82437d981472df94dbcff6334269e0d82daffbd6b75dd50fe54a5a5da2273f2360 + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -8445,7 +8903,7 @@ resolve@1.1.7: languageName: node linkType: hard -"source-map-support@npm:^0.5.6": +"source-map-support@npm:^0.5.17, source-map-support@npm:^0.5.6": version: 0.5.19 resolution: "source-map-support@npm:0.5.19" dependencies: @@ -8835,6 +9293,20 @@ resolve@1.1.7: languageName: node linkType: hard +"table@npm:^6.0.9": + version: 6.7.1 + resolution: "table@npm:6.7.1" + dependencies: + ajv: ^8.0.1 + lodash.clonedeep: ^4.5.0 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + checksum: 66107046b7226051552d53c1260facfed03f4050373d3888620af7b1353f6a5429d9a4a5fb796c56c29b9dd5ffca7b661a815f42ec392cb5956432585578772a + languageName: node + linkType: hard + "tar@npm:^6.0.2": version: 6.1.0 resolution: "tar@npm:6.1.0" @@ -9029,14 +9501,55 @@ resolve@1.1.7: languageName: node linkType: hard -"tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.2": +"ts-node@npm:^10.0.0": + version: 10.0.0 + resolution: "ts-node@npm:10.0.0" + dependencies: + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + source-map-support: ^0.5.17 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.45" + "@swc/wasm": ">=1.2.45" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: dc461e2b9b931b00ff065530a0247f86da1d035e72a7ef6d7ed072dd8e6b236d1879f113dcc73a354d240c81b6b845445c3d32b16eeb68022ed27ab6d130c049 + languageName: node + linkType: hard + +"tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.2, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: f44fe7f216946b17d3e3074df3746372703cf24e9127b4c045511456e8e4bf25515fb0a1bb3937676cc305651c5d4fcb6377b0588a4c6a957e748c4c28905d17 languageName: node linkType: hard -"tsutils@npm:^3.17.1": +"tslib@npm:^2.0.0, tslib@npm:^2.2.0": + version: 2.3.0 + resolution: "tslib@npm:2.3.0" + checksum: 7b4fc9feff0f704743c3760f5d8d708f6417fac6458159e63df3a6b1100f0736e3b99edb9fe370f274ad15160a1f49ff05cb49402534c818ff552c48e38c3e6e + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" dependencies: @@ -9102,6 +9615,13 @@ resolve@1.1.7: languageName: node linkType: hard +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 1f887bc6150e632fb772fd28e33c22a4ab036c6f484fa9ac2e2115f6cae9d62bba7ca0368e3332b539d85bd2c8391c7bff22ad410abcbc9ab3774d61e250b210 + languageName: node + linkType: hard + "type-fest@npm:^0.6.0": version: 0.6.0 resolution: "type-fest@npm:0.6.0" @@ -9257,6 +9777,16 @@ typescript@^4.0.5: languageName: node linkType: hard +"url-parse@npm:^1.5.1": + version: 1.5.1 + resolution: "url-parse@npm:1.5.1" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: d8342b597bf1760c4b9e3c78458524d783fa1c901658f3db8b576fc73451c89e6686d218ddca4845b082a63b23971b4a8b916cccc91f4156cc9f97ffdabe0079 + languageName: node + linkType: hard + "url-to-options@npm:^1.0.1": version: 1.0.1 resolution: "url-to-options@npm:1.0.1" @@ -9291,24 +9821,6 @@ typescript@^4.0.5: languageName: node linkType: hard -"util@npm:0.10.3": - version: 0.10.3 - resolution: "util@npm:0.10.3" - dependencies: - inherits: 2.0.1 - checksum: 05c1a09f3af90250365386331b3986c0753af1900f20279f9302409b27e9d9d3c03a9cf4efba48aae859d04348ebfe56d68f89688113f61171da9c4fbe6baaca - languageName: node - linkType: hard - -"util@npm:^0.10.3": - version: 0.10.4 - resolution: "util@npm:0.10.4" - dependencies: - inherits: 2.0.3 - checksum: 6682ea8239076243495c45e81f19c2c002e02805de4de08554dc815500805923f27f504ec1a9c7599d420b62bf7452efbab6fa078219d529188b0ca830f142a5 - languageName: node - linkType: hard - "uuid@npm:^3.1.0, uuid@npm:^3.2.1, uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -9558,6 +10070,13 @@ typescript@^4.0.5: languageName: node linkType: hard +"workerpool@npm:6.1.5": + version: 6.1.5 + resolution: "workerpool@npm:6.1.5" + checksum: aaf220c463d32c146887d28b45f0291e803c8c41d77a559ff525347f178b3b53b3b029a240bb92529a72771093f7cf5afdc81a28396ecc2f2f3179ad31d03456 + languageName: node + linkType: hard + "wrap-ansi@npm:^2.0.0": version: 2.1.0 resolution: "wrap-ansi@npm:2.1.0" @@ -9960,9 +10479,23 @@ typescript@^4.0.5: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: bff63b80568d80c711670935427494dde47cdf97e8b04196b140ce0af519c81c5ee857eddad0caa8b422dd65aea0157bbfaacbb1546bebba623f0f383d5d9ae5 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" checksum: 096c3b40beb2804659539be1605a35c58eb0c85285f94b77b3e924f42ee265c1a40bf9f4153770039517146b469a964d51742395f35ca8135fc9f7e4982b785d languageName: node linkType: hard + +"zod@npm:~1.11.17": + version: 1.11.17 + resolution: "zod@npm:1.11.17" + checksum: 27e8799fa87ea4478a3155f40c39c4bef331b3c3273f00252ca646879c92eef54a5c36dcf31b6cd29bfd723fa4c1502e24d59e252d657183eab1252f273dfd7f + languageName: node + linkType: hard