diff --git a/ch14/TailwindTradersBotComposer/.gitignore b/ch14/TailwindTradersBotComposer/.gitignore new file mode 100644 index 00000000..b658b87b --- /dev/null +++ b/ch14/TailwindTradersBotComposer/.gitignore @@ -0,0 +1,2 @@ +# prevent appsettings.json get checked in +**/appsettings.json \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/README.md b/ch14/TailwindTradersBotComposer/README.md new file mode 100644 index 00000000..bad915fb --- /dev/null +++ b/ch14/TailwindTradersBotComposer/README.md @@ -0,0 +1,73 @@ +This folder contains a Bot Project created with Bot Framework Composer. + +The full documentation for Composer lives here: +https://github.com/microsoft/botframework-composer + +To test this bot locally, open this folder in Composer, then click "Start Bot" + +## Provision Azure Resources to Host Bot + +This project includes a script that can be used to provision the resources necessary to run your bot in the Azure cloud. Running this script will create all of the necessary resources and return a publishing profile in the form of a JSON object. This JSON object can be imported into Composer's "Publish" tab and used to deploy the bot. + +* From this project folder, navigate to the scripts/ folder +* Run `npm install` +* Run `node provisionComposer.js --subscriptionId= --name= --appPassword= --environment=` +* You will be asked to login to the Azure portal in your browser. +* You will see progress indicators as the provision process runs. Note that it will take roughly 10 minutes to fully provision the resources. + +It will look like this: +``` +{ + "accessToken": "", + "name": "", + "environment": "", + "settings": { + "applicationInsights": { + "InstrumentationKey": "" + }, + "cosmosDb": { + "cosmosDBEndpoint": "", + "authKey": "", + "databaseId": "botstate-db", + "containerId": "botstate-container" + }, + "blobStorage": { + "connectionString": "", + "container": "transcripts" + }, + "luis": { + "endpointKey": "", + "authoringKey": "", + "region": "westus" + }, + "MicrosoftAppId": "", + "MicrosoftAppPassword": "" + } +} +``` + +When completed, you will see a message with a JSON "publishing profile" and instructions for using it in Composer. + + +## Publish bot to Azure + +To publish your bot to a Azure resources provisioned using the process above: + +* Open your bot in Composer +* Navigate to the "Publish" tab +* Select "Add new profile" from the toolbar +* In the resulting dialog box, choose "azurePublish" from the "Publish Destination Type" dropdown +* Paste in the profile you received from the provisioning script + +When you are ready to publish your bot to Azure, select the newly created profile from the sidebar and click "Publish to selected profile" in the toolbar. + +## Refresh your Azure Token + +When publishing, you may encounter an error about your access token being expired. This happens when the access token used to provision your bot expires. + +To get a new token: + +* Open a terminal window +* Run `az account get-access-token` +* This will result in a JSON object printed to the console, containing a new `accessToken` field. +* Copy the value of the accessToken from the terminal and into the publish `accessToken` field in the profile in Composer. diff --git a/ch14/TailwindTradersBotComposer/TailwindTradeBot.botproj b/ch14/TailwindTradersBotComposer/TailwindTradeBot.botproj new file mode 100644 index 00000000..8267a12d --- /dev/null +++ b/ch14/TailwindTradersBotComposer/TailwindTradeBot.botproj @@ -0,0 +1,5 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/main/Composer/packages/server/schemas/botproject.schema", + "name": "TailwindTradeBot", + "skills": {} +} \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/TailwindTradeBot.dialog b/ch14/TailwindTradersBotComposer/TailwindTradeBot.dialog new file mode 100644 index 00000000..39d2c1a0 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/TailwindTradeBot.dialog @@ -0,0 +1,368 @@ +{ + "$kind": "Microsoft.AdaptiveDialog", + "$designer": { + "$designer": { + "name": "TailwindTradeBot", + "description": "", + "id": "QBq0Xy" + } + }, + "autoEndDialog": true, + "defaultResultProperty": "dialog.result", + "triggers": [ + { + "$kind": "Microsoft.OnConversationUpdateActivity", + "$designer": { + "id": "376720" + }, + "actions": [ + { + "$kind": "Microsoft.SetProperties", + "$designer": { + "id": "GsJQ5G" + }, + "assignments": [ + { + "property": "user.finalnumber", + "value": "+" + }, + { + "property": "user.loopindex", + "value": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + }, + { + "property": "user.supportemail", + "value": "kushal@megdap.com" + }, + { + "property": "user.transferphonenumber", + "value": "+1234567" + } + ] + }, + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "wU4CwR" + }, + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_wU4CwR()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.textinput" + }, + { + "$kind": "Microsoft.IfCondition", + "$designer": { + "id": "0tqf14" + }, + "condition": "equals(user.textinput,\"yes\")", + "actions": [ + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "aK6VcM" + }, + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_aK6VcM()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.helpinput" + } + ], + "elseActions": [ + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "tbTbrs" + }, + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_tbTbrs()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.name" + }, + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "e5sloY" + }, + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_e5sloY()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.helpinput1" + } + ] + }, + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "tCykta" + }, + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_tCykta()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.toolsneeded" + }, + { + "$kind": "Microsoft.ChoiceInput", + "$designer": { + "id": "e1s7BY" + }, + "defaultLocale": "en-us", + "disabled": false, + "maxTurnCount": 3, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${ChoiceInput_Prompt_e1s7BY()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "choiceOptions": { + "includeNumbers": true + }, + "property": "user.choice", + "choices": [ + "voice call", + "video call", + "chat" + ] + }, + { + "$kind": "Microsoft.SwitchCondition", + "$designer": { + "id": "Q5iEDK" + }, + "condition": "user.choice", + "cases": [ + { + "value": "voice call", + "actions": [] + }, + { + "value": "video call", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "lbo5po" + }, + "activity": "${SendActivity_lbo5po()}" + }, + { + "$kind": "Microsoft.Foreach", + "$designer": { + "id": "R8DcqC" + }, + "index": "dialog.foreach.index", + "value": "dialog.foreach.value", + "itemsProperty": "user.loopindex", + "actions": [ + { + "$kind": "Microsoft.TextInput", + "$designer": { + "id": "47klg3" + }, + "disabled": false, + "maxTurnCount": 1, + "alwaysPrompt": false, + "allowInterruptions": false, + "prompt": "${TextInput_Prompt_47klg3()}", + "unrecognizedPrompt": "", + "invalidPrompt": "", + "defaultValueResponse": "", + "property": "user.phonenumber" + }, + { + "$kind": "Microsoft.IfCondition", + "$designer": { + "id": "ZIRtcv" + }, + "condition": "equals(user.phonenumber,\"#\")", + "actions": [ + { + "$kind": "Microsoft.BreakLoop", + "$designer": { + "id": "9i0cYh" + } + } + ], + "elseActions": [ + { + "$kind": "Microsoft.SetProperty", + "$designer": { + "id": "yW5goa" + }, + "property": "user.finalnumber", + "value": "${user.finalnumber}${user.phonenumber}" + } + ] + }, + { + "$kind": "Microsoft.SetProperty", + "$designer": { + "id": "Kajfqm" + }, + "property": "user.phonenumber", + "value": "=null" + } + ] + }, + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "fzVZDQ" + }, + "activity": "${SendActivity_fzVZDQ()}" + }, + { + "$kind": "Microsoft.HttpRequest", + "$designer": { + "id": "blp1nZ" + }, + "method": "POST", + "responseType": "json", + "resultProperty": "dialog.api_response", + "url": "https://prod-05.westus.logic.azure.com/workflows/b544c6e110c04ef283b76b80be635ae6/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=TDbknT99-wtCvSrmIKqEftbsdFVFExjgZ20SkBomyYY", + "body": { + "email": "${user.supportemail}", + "headline": "Appointment with Tailwind Traders Associate", + "summary": "Customer Name: Scott Van Vliet
Vehicle: Fabrikam FP-150
Customer Issue: \"${user.toolsneeded}\"", + "webAppMeetingDomain": "localhost:3000", + "text": "Customer Name: Scott Van Vliet\nVehicle: Fabrikam FP-150\nCustomer Issue: ${user.toolsneeded}", + "userPhone": "${user.finalnumber}", + "isVideoCall": "true" + } + }, + { + "$kind": "Microsoft.IfCondition", + "$designer": { + "id": "xV8znq" + }, + "condition": "dialog.api_response == 200", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "TDW66F" + }, + "activity": "${SendActivity_TDW66F()}" + } + ], + "elseActions": [ + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "kX3jUj" + }, + "activity": "${SendActivity_kX3jUj()}" + } + ] + } + ] + }, + { + "value": "chat", + "actions": [ + { + "$kind": "Microsoft.HttpRequest", + "$designer": { + "id": "9G6XyM" + }, + "method": "POST", + "url": "https://prod-05.westus.logic.azure.com/workflows/b544c6e110c04ef283b76b80be635ae6/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=TDbknT99-wtCvSrmIKqEftbsdFVFExjgZ20SkBomyYY", + "body": { + "email": "${user.supportemail}", + "headline": "Appointment with Tailwind Traders Associate", + "summary": "Customer Name: Scott Van Vliet
Vehicle: Fabrikam FP-150
Customer Issue: \"${user.toolsneeded}\"", + "webAppMeetingDomain": "localhost:3000", + "text": "Customer Name: Scott Van Vliet\nVehicle: Fabrikam FP-150\nCustomer Issue: ${user.toolsneeded}", + "userPhone": "${user.finalnumber}", + "isVideoCall": "false" + }, + "resultProperty": "dialog.api.chatresponse" + }, + { + "$kind": "Microsoft.IfCondition", + "$designer": { + "id": "y4wOhU" + }, + "condition": "dialog.api.chatresponse == 200", + "actions": [ + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "Wy7Slg" + }, + "activity": "${SendActivity_Wy7Slg()}" + } + ], + "elseActions": [ + { + "$kind": "Microsoft.SendActivity", + "$designer": { + "id": "NYQSvD" + }, + "activity": "${SendActivity_NYQSvD()}" + } + ] + } + ] + } + ] + }, + { + "$kind": "Microsoft.DeleteProperties", + "$designer": { + "id": "GZcL2T" + }, + "properties": [ + "user.supportemail", + "user.finalnumber", + "user.transferphonenumber" + ] + } + ] + } + ], + "$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/stable/Composer/packages/server/schemas/sdk.schema", + "generator": "TailwindTradeBot.lg", + "id": "TailwindTradeBot", + "recognizer": "TailwindTradeBot.lu.qna" +} diff --git a/ch14/TailwindTradersBotComposer/generated/interruption/TailwindTradeBot.en-us.lu b/ch14/TailwindTradersBotComposer/generated/interruption/TailwindTradeBot.en-us.lu new file mode 100644 index 00000000..e69de29b diff --git a/ch14/TailwindTradersBotComposer/generated/interruption/TailwindTradeBot.en-us.qna b/ch14/TailwindTradersBotComposer/generated/interruption/TailwindTradeBot.en-us.qna new file mode 100644 index 00000000..e69de29b diff --git a/ch14/TailwindTradersBotComposer/knowledge-base/en-us/TailwindTradeBot.en-us.qna b/ch14/TailwindTradersBotComposer/knowledge-base/en-us/TailwindTradeBot.en-us.qna new file mode 100644 index 00000000..e69de29b diff --git a/ch14/TailwindTradersBotComposer/language-generation/en-us/TailwindTradeBot.en-us.lg b/ch14/TailwindTradersBotComposer/language-generation/en-us/TailwindTradeBot.en-us.lg new file mode 100644 index 00000000..822590ee --- /dev/null +++ b/ch14/TailwindTradersBotComposer/language-generation/en-us/TailwindTradeBot.en-us.lg @@ -0,0 +1,29 @@ +[import](common.lg) + + +# TextInput_Prompt_wU4CwR() +- Hello, and welcome to Tailwind Traders. I’m a support bot here to help you. Am I speaking with Anthony? +# TextInput_Prompt_tCykta() +- What kind of tools? +# ChoiceInput_Prompt_e1s7BY() +- Ok, let me connect you to a representative. Would you like to continue on a voice call, video call, or chat? +# SendActivity_lbo5po() +- Great, I will sent a direct link to join the video call with a Tailwind Traders associate.Please enter phone number followed by #. +# TextInput_Prompt_aK6VcM() +- Hi Anthony, how can we help you today? +# TextInput_Prompt_47klg3() +- +# SendActivity_TDW66F() +- The meeting invite has been send. Thank you. +# SendActivity_kX3jUj() +- Could not send meeting invite to ${user.finalnumber} +# TextInput_Prompt_tbTbrs() +- May I know your name? +# TextInput_Prompt_e5sloY() +- Hi ${user.name},how can we help you today? +# SendActivity_Wy7Slg() +- The meeting invite has been send. Thank you. +# SendActivity_NYQSvD() +- Could not send meeting invite. +# SendActivity_fzVZDQ() +- Please wait while we send you the meeting request. \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/language-generation/en-us/common.en-us.lg b/ch14/TailwindTradersBotComposer/language-generation/en-us/common.en-us.lg new file mode 100644 index 00000000..f091a4a5 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/language-generation/en-us/common.en-us.lg @@ -0,0 +1,2 @@ +# WelcomeUser +- Welcome to the EmptyBot sample diff --git a/ch14/TailwindTradersBotComposer/language-understanding/en-us/TailwindTradeBot.en-us.lu b/ch14/TailwindTradersBotComposer/language-understanding/en-us/TailwindTradeBot.en-us.lu new file mode 100644 index 00000000..e69de29b diff --git a/ch14/TailwindTradersBotComposer/package-lock.json b/ch14/TailwindTradersBotComposer/package-lock.json new file mode 100644 index 00000000..b1167edb --- /dev/null +++ b/ch14/TailwindTradersBotComposer/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "TailwindTradersBotComposer", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/ch14/TailwindTradersBotComposer/package.json b/ch14/TailwindTradersBotComposer/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/package.json @@ -0,0 +1 @@ +{} diff --git a/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.en-us.lu.dialog b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.en-us.lu.dialog new file mode 100644 index 00000000..91043387 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.en-us.lu.dialog @@ -0,0 +1,8 @@ +{ + "$kind": "Microsoft.LuisRecognizer", + "id": "LUIS_TailwindTradeBot", + "applicationId": "=settings.luis.TailwindTradeBot_en_us_lu.appId", + "version": "=settings.luis.TailwindTradeBot_en_us_lu.version", + "endpoint": "=settings.luis.endpoint", + "endpointKey": "=settings.luis.endpointKey" +} diff --git a/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.dialog b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.dialog new file mode 100644 index 00000000..9bc466d3 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.dialog @@ -0,0 +1,5 @@ +{ + "$kind": "Microsoft.MultiLanguageRecognizer", + "id": "LUIS_TailwindTradeBot", + "recognizers": {} +} diff --git a/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.qna.dialog b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.qna.dialog new file mode 100644 index 00000000..80b77f0d --- /dev/null +++ b/ch14/TailwindTradersBotComposer/recognizers/TailwindTradeBot.lu.qna.dialog @@ -0,0 +1,4 @@ +{ + "$kind": "Microsoft.CrossTrainedRecognizerSet", + "recognizers": [] +} diff --git a/ch14/TailwindTradersBotComposer/schemas/readme.md b/ch14/TailwindTradersBotComposer/schemas/readme.md new file mode 100644 index 00000000..3c4d35b3 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/schemas/readme.md @@ -0,0 +1,124 @@ +# How to update the schema file + +Once the bot has been setup with Composer and we wish to make changes to the schema, the first step in this process is to eject the runtime through the `Runtime Config` in Composer. The ejected runtime folder will broadly have the following structure + +``` +bot + /bot.dialog + /language-generation + /language-understanding + /dialogs + /customized-dialogs + /runtime + /azurewebapp + /azurefunctions + /schemas + sdk.schema +``` + +##### Prequisites + +Botframework CLI > 4.10 + +``` +npm i -g @microsoft/botframework-cli +``` + +> NOTE: Previous versions of botframework-cli required you to install @microsoft/bf-plugin. You will need to uninstall for 4.10 and above. +> +> ``` +> bf plugins:uninstall @microsoft/bf-dialog +> ``` + +## Adding Custom Actions to your Composer bot + +**NOTE: These steps assume you are using azurewebapp as your deployment solution. Replicating it on azurefunctions would be similar +** + +- In this tutorial, we will be going over the steps to include a custom action `MultiplyDialog` that multiplies two numbers passed as inputs. Note that the ejected runtime should contain a `customaction` folder that has this sample. + +- Navigate to the csproj file inside the `runtime` folder (bot/runtime/azurewebapp/Microsoft.BotFramework.Composer.WebApp.csproj) and include a project reference to the customaction project like ``. + +- Then Uncomment line 28 and 139 in azurewebapp/Startup.cs file so as to register this action. + +``` + +using Microsoft.BotFramework.Composer.CustomAction; +// This is for custom action component registration. +ComponentRegistration.Add(new CustomActionComponentRegistration()); + +``` + +- Run the command `dotnet build` on the azurewebapp project to verify if it passes build after adding custom actions to it. + +- Navigate to to the `schemas (bot/schemas)` folder. This folder contains a Powershell script and a bash script. Run either of these scripts `./update-schema.ps1 -runtime azurewebapp` or `sh ./update-schema.sh -runtime azurewebapp`. The runtime `azurewebapp` is chosen by default if no argument is passed. + +- Validate that the partial schema (MultiplyDialog.schema inside customaction/Schema) has been appended to the default sdk.schema file to generate one single consolidated sdk.schema file. + +The above steps should have generated a new sdk.schema file inside `schemas` folder for Composer to use. Reload the bot and you should be able to include your new custom action! + +## Customizing Composer using the UI Schema + +Composer's UI can be customized using the UI Schema. You can either customize one of your custom actions or override Composer defaults. + +There are 2 ways to do this. + +1. **Component UI Schema File** + +To customize a specific component, simply create a `.uischema` file inside of the `/schemas` directory with the same name as the component, These files will be merged into a single `.uischema` file when running the `update-schema` script. + +Example: + +```json +// Microsoft.SendActivity.uischema +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "form": { + "label": "A custom label" + } +} +``` + +2. **UI Schema Override File** + +This approach allows you to co-locate all of your UI customizations into a single file. This will not be merged into the `sdk.uischema`, instead it will be loaded by Composer and applied as overrides. + +Example: + +```json +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "Microsoft.SendActivity": { + "form": { + "label": "A custom label" + } + } +} +``` + +#### UI Customization Options + +##### Form + +| **Property** | **Description** | **Type** | **Default** | +| ------------ | -------------------------------------------------------------------------------------- | ------------------- | -------------------- | +| description | Text used in tooltips. | `string` | `schema.description` | +| helpLink | URI to component or property documentation. Used in tooltips. | `string` | | +| hidden | An array of property names to hide in the UI. | `string[]` | | +| label | Label override. Can either be a string or false to hide the label. | `string` \| `false` | `schema.title` | +| order | Set the order of fields. Use "\_" for all other fields. ex. ["foo", "_", "bar"] | `string[]` | `[*]` | +| placeholder | Placeholder override. | `string` | `schema.examples` | +| properties | A map of component property names to UI options with customizations for each property. | `object` | | +| subtitle | Subtitle rendered in form title. | `string` | `schema.$kind` | +| widget | Override default field widget. See list of widgets below. | `enum` | | + +###### Widgets + +- checkbox +- date +- datetime +- input +- number +- radio +- select +- textarea diff --git a/ch14/TailwindTradersBotComposer/schemas/sdk.schema b/ch14/TailwindTradersBotComposer/schemas/sdk.schema new file mode 100644 index 00000000..8c75e142 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/schemas/sdk.schema @@ -0,0 +1,9922 @@ +{ + "$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": [ + { + "$ref": "#/definitions/schema" + }, + { + "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/botframework.json/definitions/Attachment", + "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/botframework.json/definitions/Attachment", + "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/botframework.json/definitions/CardAction", + "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/botframework.json/definitions/CardAction", + "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": [ + { + "$ref": "#/definitions/Microsoft.ActivityTemplate" + }, + { + "$ref": "#/definitions/Microsoft.StaticActivityTemplate" + }, + { + "$ref": "#/definitions/botframework.json/definitions/Activity", + "required": [ + "type" + ] + }, + { + "type": "string" + } + ], + "$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": [ + { + "$ref": "#/definitions/Microsoft.AdaptiveDialog" + }, + { + "$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.ChoiceInput" + }, + { + "$ref": "#/definitions/Microsoft.ConfirmInput" + }, + { + "$ref": "#/definitions/Microsoft.ContinueConversationLater" + }, + { + "$ref": "#/definitions/Microsoft.ContinueLoop" + }, + { + "$ref": "#/definitions/Microsoft.DateTimeInput" + }, + { + "$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.NumberInput" + }, + { + "$ref": "#/definitions/Microsoft.OAuthInput" + }, + { + "$ref": "#/definitions/Microsoft.QnAMakerDialog" + }, + { + "$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.TextInput" + }, + { + "$ref": "#/definitions/Microsoft.ThrowException" + }, + { + "$ref": "#/definitions/Microsoft.TraceActivity" + }, + { + "$ref": "#/definitions/Microsoft.UpdateActivity" + }, + { + "type": "string" + } + ], + "$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": [ + { + "$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" + }, + { + "type": "string", + "title": "Reference to Microsoft.IEntityRecognizer", + "description": "Reference to Microsoft.IEntityRecognizer .dialog file." + } + ] + }, + "Microsoft.ILanguageGenerator": { + "title": "Microsoft LanguageGenerator", + "description": "Components which dervie from the LanguageGenerator class", + "$role": "interface", + "oneOf": [ + { + "$ref": "#/definitions/Microsoft.ResourceMultiLanguageGenerator" + }, + { + "$ref": "#/definitions/Microsoft.TemplateEngineLanguageGenerator" + }, + { + "type": "string" + } + ], + "$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": [ + { + "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.ChannelMentionEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.CrossTrainedRecognizerSet" + }, + { + "$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.LuisRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.MultiLanguageRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.QnAMakerRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.RecognizerSet" + }, + { + "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.RegexRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" + }, + { + "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" + }, + { + "type": "string" + } + ], + "$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": [ + { + "$ref": "#/definitions/Microsoft.TextTemplate" + }, + { + "type": "string" + } + ], + "$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": [ + { + "$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" + }, + { + "type": "string", + "title": "Reference to Microsoft.ITrigger", + "description": "Reference to Microsoft.ITrigger .dialog file." + } + ] + }, + "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": [ + { + "$ref": "#/definitions/Microsoft.ConditionalSelector" + }, + { + "$ref": "#/definitions/Microsoft.FirstSelector" + }, + { + "$ref": "#/definitions/Microsoft.MostSpecificSelector" + }, + { + "$ref": "#/definitions/Microsoft.RandomSelector" + }, + { + "$ref": "#/definitions/Microsoft.TrueSelector" + }, + { + "type": "string", + "title": "Reference to Microsoft.ITriggerSelector", + "description": "Reference to Microsoft.ITriggerSelector .dialog file." + } + ] + }, + "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/botframework.json/definitions/Activity", + "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": "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.", + "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": [ + "=..." + ] + } + ] + }, + "schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/schema" + } + }, + "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" + ], + "default": true, + "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/schema/definitions/nonNegativeInteger" + }, + "minLength": { + "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" + }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "$ref": "#/definitions/schema" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/schema/definitions/schemaArray" + } + ], + "default": true + }, + "maxItems": { + "$ref": "#/definitions/schema/definitions/nonNegativeInteger" + }, + "minItems": { + "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" + }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "contains": { + "$ref": "#/definitions/schema" + }, + "maxProperties": { + "$ref": "#/definitions/schema/definitions/nonNegativeInteger" + }, + "minProperties": { + "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" + }, + "required": { + "$ref": "#/definitions/schema/definitions/stringArray" + }, + "additionalProperties": { + "$ref": "#/definitions/schema" + }, + "definitions": { + "type": "object", + "default": {}, + "additionalProperties": { + "$ref": "#/definitions/schema" + } + }, + "properties": { + "type": "object", + "default": {}, + "additionalProperties": { + "$ref": "#/definitions/schema" + } + }, + "patternProperties": { + "type": "object", + "propertyNames": { + "format": "regex" + }, + "default": {}, + "additionalProperties": { + "$ref": "#/definitions/schema" + } + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/schema/definitions/stringArray" + } + ] + } + }, + "propertyNames": { + "$ref": "#/definitions/schema" + }, + "const": true, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": true + }, + "type": { + "anyOf": [ + { + "$ref": "#/definitions/schema/definitions/simpleTypes" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/schema/definitions/simpleTypes" + }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "format": { + "type": "string" + }, + "contentMediaType": { + "type": "string" + }, + "contentEncoding": { + "type": "string" + }, + "if": { + "$ref": "#/definitions/schema" + }, + "then": { + "$ref": "#/definitions/schema" + }, + "else": { + "$ref": "#/definitions/schema" + }, + "allOf": { + "$ref": "#/definitions/schema/definitions/schemaArray" + }, + "anyOf": { + "$ref": "#/definitions/schema/definitions/schemaArray" + }, + "oneOf": { + "$ref": "#/definitions/schema/definitions/schemaArray" + }, + "not": { + "$ref": "#/definitions/schema" + } + } + }, + "botframework.json": { + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "ChannelAccount": { + "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" + } + } + }, + "ConversationAccount": { + "description": "Channel account information for a conversation", + "title": "ConversationAccount", + "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" + } + } + }, + "MessageReaction": { + "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" + } + } + }, + "CardAction": { + "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" + } + } + }, + "SuggestedActions": { + "description": "SuggestedActions that can be performed", + "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": { + "$ref": "#/definitions/botframework.json/definitions/CardAction" + } + } + } + }, + "Attachment": { + "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" + } + } + }, + "Entity": { + "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" + } + } + }, + "ConversationReference": { + "description": "An object relating to a particular point in a conversation", + "title": "ConversationReference", + "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/botframework.json/definitions/ChannelAccount", + "title": "user" + }, + "bot": { + "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", + "description": "Bot participating in this conversation", + "title": "bot" + }, + "conversation": { + "$ref": "#/definitions/botframework.json/definitions/ConversationAccount", + "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" + } + } + }, + "TextHighlight": { + "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": "Represents a reference to a programmatic action", + "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/botframework.json/definitions/Entity" + } + } + } + }, + "Activity": { + "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/botframework.json/definitions/ChannelAccount", + "description": "Identifies the sender of the message.", + "title": "from" + }, + "conversation": { + "$ref": "#/definitions/botframework.json/definitions/ConversationAccount", + "description": "Identifies the conversation to which the activity belongs.", + "title": "conversation" + }, + "recipient": { + "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", + "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": { + "$ref": "#/definitions/botframework.json/definitions/ChannelAccount" + } + }, + "membersRemoved": { + "description": "The collection of members removed from the conversation.", + "type": "array", + "title": "membersRemoved", + "items": { + "$ref": "#/definitions/botframework.json/definitions/ChannelAccount" + } + }, + "reactionsAdded": { + "description": "The collection of reactions added to the conversation.", + "type": "array", + "title": "reactionsAdded", + "items": { + "$ref": "#/definitions/botframework.json/definitions/MessageReaction" + } + }, + "reactionsRemoved": { + "description": "The collection of reactions removed from the conversation.", + "type": "array", + "title": "reactionsRemoved", + "items": { + "$ref": "#/definitions/botframework.json/definitions/MessageReaction" + } + }, + "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.", + "$ref": "#/definitions/botframework.json/definitions/SuggestedActions", + "title": "suggestedActions" + }, + "attachments": { + "description": "Attachments", + "type": "array", + "title": "attachments", + "items": { + "$ref": "#/definitions/botframework.json/definitions/Attachment" + } + }, + "entities": { + "description": "Represents the entities that were mentioned in the message.", + "type": "array", + "title": "entities", + "items": { + "$ref": "#/definitions/botframework.json/definitions/Entity" + } + }, + "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.", + "$ref": "#/definitions/botframework.json/definitions/ConversationReference", + "title": "relatesTo" + }, + "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": { + "$ref": "#/definitions/botframework.json/definitions/TextHighlight" + } + }, + "semanticAction": { + "$ref": "#/definitions/botframework.json/definitions/SemanticAction", + "description": "An optional programmatic action accompanying this request", + "title": "semanticAction" + } + } + } + } + } + } +} diff --git a/ch14/TailwindTradersBotComposer/schemas/sdk.uischema b/ch14/TailwindTradersBotComposer/schemas/sdk.uischema new file mode 100644 index 00000000..788aba68 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/schemas/sdk.uischema @@ -0,0 +1,781 @@ +{ + "$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.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.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.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.ContinueLoop": { + "form": { + "label": "Continue loop", + "subtitle": "Continue loop" + } + }, + "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.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.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.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" + } + }, + "Microsoft.RegexRecognizer": { + "form": { + "hidden": [ + "entities" + ] + } + }, + "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.TextInput": { + "form": { + "helpLink": "https://aka.ms/bfc-ask-for-user-input", + "label": "Prompt for text", + "properties": { + "property": { + "intellisenseScopes": [ + "variable-scopes" + ] + } + }, + "subtitle": "Text Input" + } + }, + "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" + } + } +} diff --git a/ch14/TailwindTradersBotComposer/schemas/update-schema.ps1 b/ch14/TailwindTradersBotComposer/schemas/update-schema.ps1 new file mode 100644 index 00000000..f25721e8 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/schemas/update-schema.ps1 @@ -0,0 +1,30 @@ +param ( + [string]$runtime = "azurewebapp" +) +$SCHEMA_FILE="sdk.schema" +$UISCHEMA_FILE="sdk.uischema" +$BACKUP_SCHEMA_FILE="sdk-backup.schema" +$BACKUP_UISCHEMA_FILE="sdk-backup.uischema" + +Write-Host "Running schema merge on $runtime runtime." + +if (Test-Path $SCHEMA_FILE -PathType leaf) { Move-Item -Force -Path $SCHEMA_FILE -Destination $BACKUP_SCHEMA_FILE } +if (Test-Path $UISCHEMA_FILE -PathType leaf) { Move-Item -Force -Path $UISCHEMA_FILE -Destination $BACKUP_UISCHEMA_FILE } + +bf dialog:merge "*.schema" "!sdk-backup.schema" "*.uischema" "!sdk-backup.uischema" "!sdk.override.uischema" "../runtime/$runtime/*.csproj" -o $SCHEMA_FILE + +if (Test-Path $SCHEMA_FILE -PathType leaf) +{ + if (Test-Path $BACKUP_SCHEMA_FILE -PathType leaf) { Remove-Item -Force -Path $BACKUP_SCHEMA_FILE } + if (Test-Path $BACKUP_UISCHEMA_FILE -PathType leaf) { Remove-Item -Force -Path $BACKUP_UISCHEMA_FILE } + + Write-Host "Schema merged succesfully." + if (Test-Path $SCHEMA_FILE -PathType leaf) { Write-Host " Schema: $SCHEMA_FILE" } + if (Test-Path $UISCHEMA_FILE -PathType leaf) { Write-Host " UI Schema: $UISCHEMA_FILE" } +} +else +{ + Write-Host "Schema merge failed. Restoring previous versions." + if (Test-Path $BACKUP_SCHEMA_FILE -PathType leaf) { Move-Item -Force -Path $BACKUP_SCHEMA_FILE -Destination $SCHEMA_FILE } + if (Test-Path $BACKUP_UISCHEMA_FILE -PathType leaf) { Move-Item -Force -Path $BACKUP_UISCHEMA_FILE -Destination $UISCHEMA_FILE } +} diff --git a/ch14/TailwindTradersBotComposer/schemas/update-schema.sh b/ch14/TailwindTradersBotComposer/schemas/update-schema.sh new file mode 100644 index 00000000..9d0f9000 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/schemas/update-schema.sh @@ -0,0 +1,32 @@ +#!/bin/bash +runtime=${runtime:-azurewebapp} +SCHEMA_FILE=sdk.schema +UISCHEMA_FILE=sdk.uischema +BACKUP_SCHEMA_FILE=sdk-backup.schema +BACKUP_UISCHEMA_FILE=sdk-backup.uischema + +while [ $# -gt 0 ]; do + if [[ $1 == *"-"* ]]; then + param="${1/-/}" + declare $param="$2" + fi + shift +done + +echo "Running schema merge on $runtime runtime." +[ -f "$SCHEMA_FILE" ] && mv "./$SCHEMA_FILE" "./$BACKUP_SCHEMA_FILE" +[ -f "$UISCHEMA_FILE" ] && mv "./$UISCHEMA_FILE" "./$BACKUP_UISCHEMA_FILE" + +bf dialog:merge "*.schema" "!sdk-backup.schema" "*.uischema" "!sdk-backup.uischema" "!sdk.override.uischema" "../runtime/$runtime/*.csproj" -o $SCHEMA_FILE + +if [ -f "$SCHEMA_FILE" ]; then + rm -rf "./$BACKUP_SCHEMA_FILE" + rm -rf "./$BACKUP_UISCHEMA_FILE" + echo "Schema merged succesfully." + [ -f "$SCHEMA_FILE" ] && echo " Schema: $SCHEMA_FILE" + [ -f "$UISCHEMA_FILE" ] && echo " UI Schema: $UISCHEMA_FILE" +else + echo "Schema merge failed. Restoring previous versions." + [ -f "$BACKUP_SCHEMA_FILE" ] && mv "./$BACKUP_SCHEMA_FILE" "./$SCHEMA_FILE" + [ -f "$BACKUP_UISCHEMA_FILE" ] && mv "./$BACKUP_UISCHEMA_FILE" "./$UISCHEMA_FILE" +fi diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/function-template-with-preexisting-rg.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/function-template-with-preexisting-rg.json new file mode 100644 index 00000000..6d2a3d04 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/function-template-with-preexisting-rg.json @@ -0,0 +1,355 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "name": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "appId": { + "type": "string", + "metadata": { + "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings." + } + }, + "appSecret": { + "type": "string", + "metadata": { + "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"." + } + }, + "useCosmosDb": { + "type": "bool", + "defaultValue": true + }, + "useAppInsights": { + "type": "bool", + "defaultValue": true + }, + "shouldCreateAuthoringResource": { + "type": "bool", + "defaultValue": true + }, + "shouldCreateLuisResource": { + "type": "bool", + "defaultValue": true + }, + "cosmosDbName": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "botId": { + "type": "string", + "metadata": { + "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable." + } + }, + "botSku": { + "defaultValue": "F0", + "type": "string", + "metadata": { + "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1." + } + }, + "luisAuthoringKey": { + "type": "string", + "defaultValue": "" + }, + "newAppServicePlanName": { + "type": "string", + "defaultValue": "[resourceGroup().name]", + "metadata": { + "description": "The name of the new App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "appServicePlanLocation": { + "type": "string", + "metadata": { + "description": "The location of the App Service Plan." + } + }, + "existingAppServicePlan": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Name of the existing App Service Plan used to create the Web App for the bot." + } + }, + "newWebAppName": { + "type": "string", + "defaultValue": "[resourceGroup().name]", + "metadata": { + "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"." + } + }, + "appInsightsName": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "appInsightsLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "useStorage": { + "type": "bool", + "defaultValue": true + }, + "storageAccountName": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "luisServiceName": { + "type": "string", + "defaultValue": "[concat(resourceGroup().name, '-luis')]" + }, + "luisServiceAuthoringSku": { + "type": "string", + "defaultValue": "F0" + }, + "luisServiceRunTimeSku": { + "type": "string", + "defaultValue": "S0" + }, + "luisServiceLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "variables": { + "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]", + "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]", + "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]", + "resourcesLocation": "[parameters('appServicePlanLocation')]", + "cosmosDbAccountName": "[toLower(take(replace(parameters('cosmosDbName'), '_', ''), 31))]", + "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]", + "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]", + "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]", + "storageAccountName": "[toLower(take(replace(replace(parameters('storageAccountName'), '-', ''), '_', ''), 24))]", + "LuisAuthoringAccountName": "[concat(parameters('luisServiceName'), '-Authoring')]" + }, + "resources": [ + { + "comments": "Create a Web App using an App Service Plan", + "type": "Microsoft.Web/sites", + "apiVersion": "2015-08-01", + "location": "[variables('resourcesLocation')]", + "kind": "functionapp", + "name": "[variables('webAppName')]", + "properties": { + "name": "[variables('webAppName')]", + "kind": "functionapp", + "httpsOnly": true + }, + "resources": [ + { + "name": "appsettings", + "type": "config", + "apiVersion": "2015-08-01", + "dependsOn": [ + "[concat('Microsoft.Web/Sites/', variables('webAppName'))]" + ], + "properties": { + "FUNCTIONS_EXTENSION_VERSION": "~3", + "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "APPINSIGHTS_INSTRUMENTATIONKEY": "[reference(resourceId('microsoft.insights/components/', parameters('appInsightsName')), '2015-05-01').InstrumentationKey]", + "MicrosoftAppId": "[parameters('appId')]", + "MicrosoftAppPassword": "[parameters('appSecret')]" + } + } + ] + }, + { + "comments": "CosmosDB for bot state.", + "type": "Microsoft.DocumentDB/databaseAccounts", + "kind": "GlobalDocumentDB", + "apiVersion": "2015-04-08", + "name": "[variables('cosmosDbAccountName')]", + "location": "[parameters('location')]", + "properties": { + "databaseAccountOfferType": "Standard", + "locations": [ + { + "locationName": "[parameters('location')]", + "failoverPriority": 0 + } + ] + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases", + "apiVersion": "2020-03-01", + "name": "[concat(variables('cosmosDbAccountName'), '/botstate-db')]", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))]" + ], + "properties": { + "resource": { + "id": "botstate-db" + }, + "options": {} + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers", + "apiVersion": "2020-03-01", + "name": "[concat(variables('cosmosDbAccountName'), '/botstate-db/botstate-container')]", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', variables('cosmosDbAccountName'), 'botstate-db')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))]" + ], + "properties": { + "resource": { + "id": "botstate-container", + "indexingPolicy": { + "indexingMode": "consistent", + "automatic": true, + "includedPaths": [ + { + "path": "/*" + } + ], + "excludedPaths": [ + { + "path": "/\"_etag\"/?" + } + ] + }, + "partitionKey": { + "paths": [ + "/id" + ], + "kind": "Hash" + }, + "conflictResolutionPolicy": { + "mode": "LastWriterWins", + "conflictResolutionPath": "/_ts" + } + }, + "options": {} + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "apiVersion": "2017-12-01", + "type": "Microsoft.BotService/botServices", + "name": "[parameters('botId')]", + "location": "global", + "kind": "bot", + "sku": { + "name": "[parameters('botSku')]" + }, + "properties": { + "name": "[parameters('botId')]", + "displayName": "[parameters('botId')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('appId')]", + "developerAppInsightsApplicationId": null, + "developerAppInsightKey": null, + "publishingCredentials": null, + "storageResourceId": null + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]" + ] + }, + { + "comments": "app insights", + "type": "Microsoft.Insights/components", + "kind": "web", + "apiVersion": "2015-05-01", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('appInsightsLocation')]", + "properties": { + "Application_Type": "web" + }, + "condition": "[parameters('useAppInsights')]" + }, + { + "comments": "storage account", + "type": "Microsoft.Storage/storageAccounts", + "kind": "StorageV2", + "apiVersion": "2018-07-01", + "name": "[variables('storageAccountName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard_LRS" + }, + "condition": "[parameters('useStorage')]" + }, + { + "comments": "Cognitive service authoring key for all LUIS apps.", + "apiVersion": "2017-04-18", + "name": "[variables('LuisAuthoringAccountName')]", + "location": "[parameters('luisServiceLocation')]", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "LUIS.Authoring", + "sku": { + "name": "[parameters('luisServiceAuthoringSku')]" + }, + "condition": "[parameters('shouldCreateAuthoringResource')]" + }, + { + "comments": "Cognitive service endpoint key for all LUIS apps.", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "LUIS", + "apiVersion": "2017-04-18", + "name": "[parameters('luisServiceName')]", + "location": "[parameters('luisServiceLocation')]", + "sku": { + "name": "[parameters('luisServiceRunTimeSku')]" + }, + "condition": "[parameters('shouldCreateLuisResource')]" + } + ], + "outputs": { + "ApplicationInsights": { + "type": "object", + "value": { + "InstrumentationKey": "[if(parameters('useAppInsights'), reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).InstrumentationKey, '')]" + } + }, + "cosmosDb": { + "type": "object", + "value": { + "cosmosDBEndpoint": "[if(parameters('useCosmosDb'), reference(resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))).documentEndpoint, '')]", + "authKey": "[if(parameters('useCosmosDb'), listKeys(resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName')), '2015-04-08').primaryMasterKey, '')]", + "databaseId": "botstate-db", + "containerId": "botstate-container" + } + }, + "blobStorage": { + "type": "object", + "value": { + "connectionString": "[if(parameters('useStorage'), concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2018-07-01').keys[0].value, ';EndpointSuffix=core.windows.net'), '')]", + "container": "transcripts" + } + }, + "luis": { + "type": "object", + "value": { + "endpointKey": "[if(parameters('shouldCreateLuisResource'), listKeys(resourceId('Microsoft.CognitiveServices/accounts', parameters('luisServiceName')),'2017-04-18').key1, '')]", + "authoringKey": "[if(parameters('shouldCreateAuthoringResource'), listKeys(resourceId('Microsoft.CognitiveServices/accounts', variables('LuisAuthoringAccountName')),'2017-04-18').key1, parameters('luisAuthoringKey'))]", + "region": "[parameters('luisServiceLocation')]" + } + } + } +} diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/new-rg-parameters.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/new-rg-parameters.json new file mode 100644 index 00000000..ead33909 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/new-rg-parameters.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "groupLocation": { + "value": "" + }, + "groupName": { + "value": "" + }, + "appId": { + "value": "" + }, + "appSecret": { + "value": "" + }, + "botId": { + "value": "" + }, + "botSku": { + "value": "" + }, + "newAppServicePlanName": { + "value": "" + }, + "newAppServicePlanSku": { + "value": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + } + }, + "newAppServicePlanLocation": { + "value": "" + }, + "newWebAppName": { + "value": "" + } + } +} \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/preexisting-rg-parameters.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/preexisting-rg-parameters.json new file mode 100644 index 00000000..b6f5114f --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/preexisting-rg-parameters.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "appId": { + "value": "" + }, + "appSecret": { + "value": "" + }, + "botId": { + "value": "" + }, + "botSku": { + "value": "" + }, + "newAppServicePlanName": { + "value": "" + }, + "newAppServicePlanSku": { + "value": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + } + }, + "appServicePlanLocation": { + "value": "" + }, + "existingAppServicePlan": { + "value": "" + }, + "newWebAppName": { + "value": "" + } + } +} \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/qna-template.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/qna-template.json new file mode 100644 index 00000000..511420d5 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/qna-template.json @@ -0,0 +1,221 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "name": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "newAppServicePlanName": { + "type": "string", + "defaultValue": "[resourceGroup().name]", + "metadata": { + "description": "The name of the new App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "appServicePlanLocation": { + "type": "string", + "metadata": { + "description": "The location of the App Service Plan." + } + }, + "existingAppServicePlan": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Name of the existing App Service Plan used to create the Web App for the bot." + } + }, + "appInsightsName": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "appInsightsLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "qnaMakerServiceName": { + "type": "string", + "defaultValue": "[concat(parameters('name'), '-qna')]" + }, + "qnaMakerServiceSku": { + "type": "string", + "defaultValue": "S0" + }, + "qnaMakerServiceLocation": { + "type": "string", + "defaultValue": "westus" + }, + "qnaMakerSearchName": { + "type": "string", + "defaultValue": "[concat(parameters('name'), '-search')]" + }, + "qnaMakerSearchSku": { + "type": "string", + "defaultValue": "standard" + }, + "qnaMakerSearchLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "qnaMakerWebAppName": { + "type": "string", + "defaultValue": "[concat(parameters('name'), '-qnahost')]" + }, + "qnaMakerWebAppLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "variables": { + "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]", + "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]", + "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]", + "resourcesLocation": "[parameters('appServicePlanLocation')]", + "qnaMakerSearchName": "[toLower(replace(parameters('qnaMakerSearchName'), '_', ''))]", + "qnaMakerWebAppName": "[replace(parameters('qnaMakerWebAppName'), '_', '')]" + }, + "resources": [ + { + "apiVersion": "2018-02-01", + "name": "1d41002f-62a1-49f3-bd43-2f3f32a19cbb", + "type": "Microsoft.Resources/deployments", + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [] + } + } + }, + { + "comments": "Create a new App Service Plan if no existing App Service Plan name was passed in.", + "type": "Microsoft.Web/serverfarms", + "condition": "[not(variables('useExistingAppServicePlan'))]", + "name": "[variables('servicePlanName')]", + "apiVersion": "2018-02-01", + "location": "[variables('resourcesLocation')]", + "sku": "[parameters('newAppServicePlanSku')]", + "properties": { + "name": "[variables('servicePlanName')]" + } + }, + { + "comments": "app insights", + "type": "Microsoft.Insights/components", + "kind": "web", + "apiVersion": "2015-05-01", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('appInsightsLocation')]", + "properties": { + "Application_Type": "web" + } + }, + { + "comments": "Cognitive service key for all QnA Maker knowledgebases.", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "QnAMaker", + "apiVersion": "2017-04-18", + "name": "[parameters('qnaMakerServiceName')]", + "location": "[parameters('qnaMakerServiceLocation')]", + "sku": { + "name": "[parameters('qnaMakerServiceSku')]" + }, + "properties": { + "apiProperties": { + "qnaRuntimeEndpoint": "[concat('https://',reference(resourceId('Microsoft.Web/sites', variables('qnaMakerWebAppName'))).hostNames[0])]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/Sites', variables('qnaMakerWebAppName'))]", + "[resourceId('Microsoft.Search/searchServices/', variables('qnaMakerSearchName'))]", + "[resourceId('microsoft.insights/components/', parameters('appInsightsName'))]" + ] + }, + { + "comments": "Search service for QnA Maker service.", + "type": "Microsoft.Search/searchServices", + "apiVersion": "2015-08-19", + "name": "[variables('qnaMakerSearchName')]", + "location": "[parameters('qnaMakerSearchLocation')]", + "sku": { + "name": "[parameters('qnaMakerSearchSku')]" + }, + "properties": { + "replicaCount": 1, + "partitionCount": 1, + "hostingMode": "default" + } + }, + { + "comments": "Web app for QnA Maker service.", + "type": "Microsoft.Web/sites", + "apiVersion": "2016-08-01", + "name": "[variables('qnaMakerWebAppName')]", + "location": "[parameters('qnaMakerWebAppLocation')]", + "properties": { + "enabled": true, + "name": "[variables('qnaMakerWebAppName')]", + "hostingEnvironment": "", + "serverFarmId": "[concat('/subscriptions/', Subscription().SubscriptionId,'/resourcegroups/', resourceGroup().name, '/providers/Microsoft.Web/serverfarms/', variables('servicePlanName'))]", + "siteConfig": { + "cors": { + "allowedOrigins": [ + "*" + ] + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms/', variables('servicePlanName'))]" + ], + "resources": [ + { + "apiVersion": "2016-08-01", + "name": "appsettings", + "type": "config", + "dependsOn": [ + "[resourceId('Microsoft.Web/Sites', variables('qnaMakerWebAppName'))]", + "[resourceId('Microsoft.Insights/components', parameters('appInsightsName'))]", + "[resourceId('Microsoft.Search/searchServices/', variables('qnaMakerSearchName'))]" + ], + "properties": { + "AzureSearchName": "[variables('qnaMakerSearchName')]", + "AzureSearchAdminKey": "[listAdminKeys(resourceId('Microsoft.Search/searchServices/', variables('qnaMakerSearchName')), '2015-08-19').primaryKey]", + "UserAppInsightsKey": "[reference(resourceId('Microsoft.Insights/components/', parameters('appInsightsName')), '2015-05-01').InstrumentationKey]", + "UserAppInsightsName": "[parameters('appInsightsName')]", + "UserAppInsightsAppId": "[reference(resourceId('Microsoft.Insights/components/', parameters('appInsightsName')), '2015-05-01').AppId]", + "PrimaryEndpointKey": "[concat(variables('qnaMakerWebAppName'), '-PrimaryEndpointKey')]", + "SecondaryEndpointKey": "[concat(variables('qnaMakerWebAppName'), '-SecondaryEndpointKey')]", + "DefaultAnswer": "No good match found in KB.", + "QNAMAKER_EXTENSION_VERSION": "latest" + } + } + ] + } + ], + "outputs": { + "qna": { + "type": "object", + "value": { + "endpoint": "[concat('https://', reference(resourceId('Microsoft.Web/sites', variables('qnaMakerWebAppName'))).hostNames[0])]", + "subscriptionKey": "[listKeys(resourceId('Microsoft.CognitiveServices/accounts', parameters('qnaMakerServiceName')),'2017-04-18').key1]" + } + } + } + } + \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-new-rg.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-new-rg.json new file mode 100644 index 00000000..06b82841 --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-new-rg.json @@ -0,0 +1,183 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "groupLocation": { + "type": "string", + "metadata": { + "description": "Specifies the location of the Resource Group." + } + }, + "groupName": { + "type": "string", + "metadata": { + "description": "Specifies the name of the Resource Group." + } + }, + "appId": { + "type": "string", + "metadata": { + "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings." + } + }, + "appSecret": { + "type": "string", + "metadata": { + "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings." + } + }, + "botId": { + "type": "string", + "metadata": { + "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable." + } + }, + "botSku": { + "type": "string", + "metadata": { + "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1." + } + }, + "newAppServicePlanName": { + "type": "string", + "metadata": { + "description": "The name of the App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "newAppServicePlanLocation": { + "type": "string", + "metadata": { + "description": "The location of the App Service Plan. Defaults to \"westus\"." + } + }, + "newWebAppName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"." + } + } + }, + "variables": { + "appServicePlanName": "[parameters('newAppServicePlanName')]", + "resourcesLocation": "[parameters('newAppServicePlanLocation')]", + "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]", + "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]", + "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]" + }, + "resources": [ + { + "name": "[parameters('groupName')]", + "type": "Microsoft.Resources/resourceGroups", + "apiVersion": "2018-05-01", + "location": "[parameters('groupLocation')]", + "properties": { + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2018-05-01", + "name": "storageDeployment", + "resourceGroup": "[parameters('groupName')]", + "dependsOn": [ + "[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]" + ], + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": {}, + "variables": {}, + "resources": [ + { + "comments": "Create a new App Service Plan", + "type": "Microsoft.Web/serverfarms", + "name": "[variables('appServicePlanName')]", + "apiVersion": "2018-02-01", + "location": "[variables('resourcesLocation')]", + "sku": "[parameters('newAppServicePlanSku')]", + "properties": { + "name": "[variables('appServicePlanName')]" + } + }, + { + "comments": "Create a Web App using the new App Service Plan", + "type": "Microsoft.Web/sites", + "apiVersion": "2015-08-01", + "location": "[variables('resourcesLocation')]", + "kind": "app", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms/', variables('appServicePlanName'))]" + ], + "name": "[variables('webAppName')]", + "properties": { + "name": "[variables('webAppName')]", + "serverFarmId": "[variables('appServicePlanName')]", + "siteConfig": { + "appSettings": [ + { + "name": "WEBSITE_NODE_DEFAULT_VERSION", + "value": "10.14.1" + }, + { + "name": "MicrosoftAppId", + "value": "[parameters('appId')]" + }, + { + "name": "MicrosoftAppPassword", + "value": "[parameters('appSecret')]" + } + ], + "cors": { + "allowedOrigins": [ + "https://botservice.hosting.portal.azure.net", + "https://hosting.onecloud.azure-test.net/" + ] + } + } + } + }, + { + "apiVersion": "2017-12-01", + "type": "Microsoft.BotService/botServices", + "name": "[parameters('botId')]", + "location": "global", + "kind": "bot", + "sku": { + "name": "[parameters('botSku')]" + }, + "properties": { + "name": "[parameters('botId')]", + "displayName": "[parameters('botId')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('appId')]", + "developerAppInsightsApplicationId": null, + "developerAppInsightKey": null, + "publishingCredentials": null, + "storageResourceId": null + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]" + ] + } + ], + "outputs": {} + } + } + } + ] +} \ No newline at end of file diff --git a/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-preexisting-rg.json b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-preexisting-rg.json new file mode 100644 index 00000000..f028329f --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/DeploymentTemplates/template-with-preexisting-rg.json @@ -0,0 +1,389 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "name": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "appId": { + "type": "string", + "metadata": { + "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings." + } + }, + "appSecret": { + "type": "string", + "metadata": { + "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"." + } + }, + "useCosmosDb": { + "type": "bool", + "defaultValue": true + }, + "useAppInsights": { + "type": "bool", + "defaultValue": true + }, + "shouldCreateAuthoringResource": { + "type": "bool", + "defaultValue": true + }, + "shouldCreateLuisResource": { + "type": "bool", + "defaultValue": true + }, + "cosmosDbName": { + "type": "string", + "defaultValue": "ttbotdb" + }, + "botId": { + "type": "string", + "metadata": { + "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable." + } + }, + "botSku": { + "defaultValue": "F0", + "type": "string", + "metadata": { + "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1." + } + }, + "luisAuthoringKey": { + "type": "string", + "defaultValue": "" + }, + "newAppServicePlanName": { + "type": "string", + "defaultValue": "ttbotplan", + "metadata": { + "description": "The name of the new App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "appServicePlanLocation": { + "type": "string", + "metadata": { + "description": "The location of the App Service Plan." + } + }, + "existingAppServicePlan": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Name of the existing App Service Plan used to create the Web App for the bot." + } + }, + "newWebAppName": { + "type": "string", + "defaultValue": "ttbotweb", + "metadata": { + "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"." + } + }, + "appInsightsName": { + "type": "string", + "defaultValue": "ttbotinsights" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "appInsightsLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "useStorage": { + "type": "bool", + "defaultValue": true + }, + "storageAccountName": { + "type": "string", + "defaultValue": "ttbotstg" + }, + "luisServiceName": { + "type": "string", + "defaultValue": "ttbotluis" + }, + "luisServiceAuthoringSku": { + "type": "string", + "defaultValue": "F0" + }, + "luisServiceRunTimeSku": { + "type": "string", + "defaultValue": "S0" + }, + "luisServiceLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "variables": { + "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]", + "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]", + "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]", + "resourcesLocation": "[parameters('appServicePlanLocation')]", + "cosmosDbAccountName": "[toLower(take(replace(parameters('cosmosDbName'), '_', ''), 31))]", + "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]", + "siteHost": "[concat(variables('webAppName'), '.azurewebsites.net')]", + "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]", + "storageAccountName": "[toLower(take(replace(replace(parameters('storageAccountName'), '-', ''), '_', ''), 24))]", + "LuisAuthoringAccountName": "[concat(parameters('luisServiceName'), '-Authoring')]" + }, + "resources": [ + { + "apiVersion": "2018-02-01", + "name": "1d41002f-62a1-49f3-bd43-2f3f32a19cbb", + "type": "Microsoft.Resources/deployments", + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [] + } + } + }, + { + "comments": "Create a new App Service Plan if no existing App Service Plan name was passed in.", + "type": "Microsoft.Web/serverfarms", + "condition": "[not(variables('useExistingAppServicePlan'))]", + "name": "[variables('servicePlanName')]", + "apiVersion": "2018-02-01", + "location": "[variables('resourcesLocation')]", + "sku": "[parameters('newAppServicePlanSku')]", + "properties": { + "name": "[variables('servicePlanName')]" + } + }, + { + "comments": "Create a Web App using an App Service Plan", + "type": "Microsoft.Web/sites", + "apiVersion": "2015-08-01", + "location": "[variables('resourcesLocation')]", + "kind": "app", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms/', variables('servicePlanName'))]" + ], + "name": "[variables('webAppName')]", + "properties": { + "name": "[variables('webAppName')]", + "serverFarmId": "[variables('servicePlanName')]", + "siteConfig": { + "appSettings": [ + { + "name": "WEBSITE_NODE_DEFAULT_VERSION", + "value": "10.14.1" + }, + { + "name": "MicrosoftAppId", + "value": "[parameters('appId')]" + }, + { + "name": "MicrosoftAppPassword", + "value": "[parameters('appSecret')]" + } + ], + "cors": { + "allowedOrigins": [ + "https://botservice.hosting.portal.azure.net", + "https://hosting.onecloud.azure-test.net/" + ] + } + } + } + }, + { + "comments": "CosmosDB for bot state.", + "type": "Microsoft.DocumentDB/databaseAccounts", + "kind": "GlobalDocumentDB", + "apiVersion": "2015-04-08", + "name": "[variables('cosmosDbAccountName')]", + "location": "[parameters('location')]", + "properties": { + "databaseAccountOfferType": "Standard", + "locations": [ + { + "locationName": "[parameters('location')]", + "failoverPriority": 0 + } + ] + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases", + "apiVersion": "2020-03-01", + "name": "[concat(variables('cosmosDbAccountName'), '/botstate-db')]", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))]" + ], + "properties": { + "resource": { + "id": "botstate-db" + }, + "options": {} + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers", + "apiVersion": "2020-03-01", + "name": "[concat(variables('cosmosDbAccountName'), '/botstate-db/botstate-container')]", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', variables('cosmosDbAccountName'), 'botstate-db')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))]" + ], + "properties": { + "resource": { + "id": "botstate-container", + "indexingPolicy": { + "indexingMode": "consistent", + "automatic": true, + "includedPaths": [ + { + "path": "/*" + } + ], + "excludedPaths": [ + { + "path": "/\"_etag\"/?" + } + ] + }, + "partitionKey": { + "paths": [ + "/id" + ], + "kind": "Hash" + }, + "conflictResolutionPolicy": { + "mode": "LastWriterWins", + "conflictResolutionPath": "/_ts" + } + }, + "options": {} + }, + "condition": "[parameters('useCosmosDb')]" + }, + { + "apiVersion": "2017-12-01", + "type": "Microsoft.BotService/botServices", + "name": "[parameters('botId')]", + "location": "global", + "kind": "bot", + "sku": { + "name": "[parameters('botSku')]" + }, + "properties": { + "name": "[parameters('botId')]", + "displayName": "[parameters('botId')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('appId')]", + "developerAppInsightsApplicationId": null, + "developerAppInsightKey": null, + "publishingCredentials": null, + "storageResourceId": null + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]" + ] + }, + { + "comments": "app insights", + "type": "Microsoft.Insights/components", + "kind": "web", + "apiVersion": "2015-05-01", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('appInsightsLocation')]", + "properties": { + "Application_Type": "web" + }, + "condition": "[parameters('useAppInsights')]" + }, + { + "comments": "storage account", + "type": "Microsoft.Storage/storageAccounts", + "kind": "StorageV2", + "apiVersion": "2018-07-01", + "name": "[variables('storageAccountName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard_LRS" + }, + "condition": "[parameters('useStorage')]" + }, + { + "comments": "Cognitive service authoring key for all LUIS apps.", + "apiVersion": "2017-04-18", + "name": "[variables('LuisAuthoringAccountName')]", + "location": "[parameters('luisServiceLocation')]", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "LUIS.Authoring", + "sku": { + "name": "[parameters('luisServiceAuthoringSku')]" + }, + "condition": "[parameters('shouldCreateAuthoringResource')]" + }, + { + "comments": "Cognitive service endpoint key for all LUIS apps.", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "LUIS", + "apiVersion": "2017-04-18", + "name": "[parameters('luisServiceName')]", + "location": "[parameters('luisServiceLocation')]", + "sku": { + "name": "[parameters('luisServiceRunTimeSku')]" + }, + "condition": "[parameters('shouldCreateLuisResource')]" + } + ], + "outputs": { + "ApplicationInsights": { + "type": "object", + "value": { + "InstrumentationKey": "[if(parameters('useAppInsights'), reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).InstrumentationKey, '')]" + } + }, + "cosmosDb": { + "type": "object", + "value": { + "cosmosDBEndpoint": "[if(parameters('useCosmosDb'), reference(resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName'))).documentEndpoint, '')]", + "authKey": "[if(parameters('useCosmosDb'), listKeys(resourceId('Microsoft.DocumentDB/databaseAccounts', variables('cosmosDbAccountName')), '2015-04-08').primaryMasterKey, '')]", + "databaseId": "botstate-db", + "containerId": "botstate-container" + } + }, + "blobStorage": { + "type": "object", + "value": { + "connectionString": "[if(parameters('useStorage'), concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2018-07-01').keys[0].value, ';EndpointSuffix=core.windows.net'), '')]", + "container": "transcripts" + } + }, + "luis": { + "type": "object", + "value": { + "endpointKey": "[if(parameters('shouldCreateLuisResource'), listKeys(resourceId('Microsoft.CognitiveServices/accounts', parameters('luisServiceName')),'2017-04-18').key1, '')]", + "authoringKey": "[if(parameters('shouldCreateAuthoringResource'), listKeys(resourceId('Microsoft.CognitiveServices/accounts', variables('LuisAuthoringAccountName')),'2017-04-18').key1, parameters('luisAuthoringKey'))]", + "region": "[parameters('luisServiceLocation')]", + "endpoint": "[if(parameters('shouldCreateLuisResource'), reference(resourceId('Microsoft.CognitiveServices/accounts', parameters('luisServiceName'))).endpoint, '')]", + "authoringEndpoint": "[if(parameters('shouldCreateAuthoringResource'), reference(resourceId('Microsoft.CognitiveServices/accounts', variables('LuisAuthoringAccountName'))).endpoint, '')]" + } + } + } +} diff --git a/ch14/TailwindTradersBotComposer/scripts/package-lock.json b/ch14/TailwindTradersBotComposer/scripts/package-lock.json new file mode 100644 index 00000000..0cf7e7cc --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/package-lock.json @@ -0,0 +1,2263 @@ +{ + "name": "azure_provision", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "azure_provision", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@azure/arm-appinsights": "^2.1.0", + "@azure/arm-botservice": "^1.0.0", + "@azure/arm-resources": "^2.1.0", + "@azure/graph": "^5.0.1", + "@azure/ms-rest-nodeauth": "^3.0.3", + "@types/fs-extra": "^8.1.0", + "chalk": "^4.0.0", + "fs-extra": "^8.1.0", + "minimist": "^1.2.5", + "ora": "^4.0.4", + "request-promise": "^4.2.5" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.4.tgz", + "integrity": "sha512-lNUmDRVGpanCsiUN3NWxFTdwmdFI53xwhkTFfHDGTYk46ca7Ind3nanJc+U6Zj9Tv+9nTCWRBscWEW1DyKOpTw==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/abort-controller/node_modules/tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + }, + "node_modules/@azure/arm-appinsights": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-appinsights/-/arm-appinsights-2.1.0.tgz", + "integrity": "sha512-wfJgzoz/ZdLpT9TsKtpjWWsKmqQ7BkseEmKrm6gPcrQeINjzpgqex29suhS+Jmq1f4i2ZEofQKA1YHhBknrcsA==", + "dependencies": { + "@azure/ms-rest-azure-js": "^1.1.0", + "@azure/ms-rest-js": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "node_modules/@azure/arm-botservice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/arm-botservice/-/arm-botservice-1.0.0.tgz", + "integrity": "sha512-0+Er+05npiOerhG6FAyFY17bglwHQA5+AmeLIlD+/skAcPI3pvcRfepFTI2XW7CoBWeakY8Ki5w89PPkLFNqjQ==", + "dependencies": { + "@azure/ms-rest-azure-js": "^1.3.2", + "@azure/ms-rest-js": "^1.8.1", + "tslib": "^1.9.3" + } + }, + "node_modules/@azure/arm-resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-resources/-/arm-resources-2.1.0.tgz", + "integrity": "sha512-WpBQt3QwfulWAgss7r6apfKswc6SS8Z005AhQalx618757dX+0kTiizL5XipDZFWq/nlCN2fFv9ba1m4v5x2tg==", + "dependencies": { + "@azure/ms-rest-azure-js": "^2.0.1", + "@azure/ms-rest-js": "^2.0.4", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/arm-resources/node_modules/@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha512-CjZjB8apvXl5h97Ck6SbeeCmU0sk56YPozPtTyGudPp1RGoHXNjFNtoOvwOG76EdpmMpxbK10DqcygI16Lu60Q==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/arm-resources/node_modules/@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "node_modules/@azure/arm-resources/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.0.tgz", + "integrity": "sha512-kSDSZBL6c0CYdhb+7KuutnKGf2geeT+bCJAgccB0DD7wmNJSsQPcF7TcuoZX83B7VK4tLz/u+8sOO/CnCsYp8A==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + }, + "node_modules/@azure/graph": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@azure/graph/-/graph-5.0.2.tgz", + "integrity": "sha512-V/rG6maHOLf3NrV+PTJ822/9T5RCjlhtihN0oIS83ZvrYlGMjf9ut/83ovdk4ceLTkQrlubiJ/rw1ZihI0jQog==", + "dependencies": { + "@azure/ms-rest-azure-js": "^2.0.0", + "@azure/ms-rest-js": "^2.0.3", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/graph/node_modules/@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha512-CjZjB8apvXl5h97Ck6SbeeCmU0sk56YPozPtTyGudPp1RGoHXNjFNtoOvwOG76EdpmMpxbK10DqcygI16Lu60Q==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/graph/node_modules/@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "node_modules/@azure/graph/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@azure/ms-rest-azure-env": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-env/-/ms-rest-azure-env-2.0.0.tgz", + "integrity": "sha512-dG76W7ElfLi+fbTjnZVGj+M9e0BIEJmRxU6fHaUQ12bZBe8EJKYb2GV50YWNaP2uJiVQ5+7nXEVj1VN1UQtaEw==" + }, + "node_modules/@azure/ms-rest-azure-js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-1.4.0.tgz", + "integrity": "sha512-ul1wfkzwU9wYg6kFKD/AuQfVRJU4utEjDcfa0hvXqDS99yRuJqUrt/Ojv3duZMwskBIrD3CV5d9TjLBOV7/pQw==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^1.10.0", + "tslib": "^1.9.3" + } + }, + "node_modules/@azure/ms-rest-js": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-1.11.2.tgz", + "integrity": "sha512-2AyQ1IKmLGKW7DU3/x3TsTBzZLcbC9YRI+yuDPuXAQrv3zar340K9wsxU413kHFIDjkWNCo9T0w5VtwcyWxhbQ==", + "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" + } + }, + "node_modules/@azure/ms-rest-nodeauth": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-3.0.9.tgz", + "integrity": "sha512-+GdDHUJlWtIDanRZemFooLy68NsBDhN/Oni9DSFeoXIFNGlSe1IOes8/IRkQdrNXyUvBanuzzR7I5WYYzYQsmA==", + "dependencies": { + "@azure/ms-rest-azure-env": "^2.0.0", + "@azure/ms-rest-js": "^2.0.4", + "adal-node": "^0.1.28" + } + }, + "node_modules/@azure/ms-rest-nodeauth/node_modules/@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "node_modules/@azure/ms-rest-nodeauth/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", + "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/adal-node": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.1.28.tgz", + "integrity": "sha1-RoxLs+u9lrEnBmn0ucuk4AZepIU=", + "dependencies": { + "@types/node": "^8.0.47", + "async": ">=0.6.0", + "date-utils": "*", + "jws": "3.x.x", + "request": ">= 2.52.0", + "underscore": ">= 1.3.1", + "uuid": "^3.1.0", + "xmldom": ">= 0.1.x", + "xpath.js": "~1.1.0" + }, + "engines": { + "node": ">= 0.6.15" + } + }, + "node_modules/adal-node/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-utils": { + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", + "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=", + "engines": { + "node": ">0.4.0" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/follow-redirects": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", + "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "dependencies": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmldom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", + "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xpath.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", + "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==", + "engines": { + "node": ">=0.4.0" + } + } + }, + "dependencies": { + "@azure/abort-controller": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.4.tgz", + "integrity": "sha512-lNUmDRVGpanCsiUN3NWxFTdwmdFI53xwhkTFfHDGTYk46ca7Ind3nanJc+U6Zj9Tv+9nTCWRBscWEW1DyKOpTw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@azure/arm-appinsights": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-appinsights/-/arm-appinsights-2.1.0.tgz", + "integrity": "sha512-wfJgzoz/ZdLpT9TsKtpjWWsKmqQ7BkseEmKrm6gPcrQeINjzpgqex29suhS+Jmq1f4i2ZEofQKA1YHhBknrcsA==", + "requires": { + "@azure/ms-rest-azure-js": "^1.1.0", + "@azure/ms-rest-js": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "@azure/arm-botservice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/arm-botservice/-/arm-botservice-1.0.0.tgz", + "integrity": "sha512-0+Er+05npiOerhG6FAyFY17bglwHQA5+AmeLIlD+/skAcPI3pvcRfepFTI2XW7CoBWeakY8Ki5w89PPkLFNqjQ==", + "requires": { + "@azure/ms-rest-azure-js": "^1.3.2", + "@azure/ms-rest-js": "^1.8.1", + "tslib": "^1.9.3" + } + }, + "@azure/arm-resources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-resources/-/arm-resources-2.1.0.tgz", + "integrity": "sha512-WpBQt3QwfulWAgss7r6apfKswc6SS8Z005AhQalx618757dX+0kTiizL5XipDZFWq/nlCN2fFv9ba1m4v5x2tg==", + "requires": { + "@azure/ms-rest-azure-js": "^2.0.1", + "@azure/ms-rest-js": "^2.0.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha512-CjZjB8apvXl5h97Ck6SbeeCmU0sk56YPozPtTyGudPp1RGoHXNjFNtoOvwOG76EdpmMpxbK10DqcygI16Lu60Q==", + "requires": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "requires": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "@azure/core-auth": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.3.0.tgz", + "integrity": "sha512-kSDSZBL6c0CYdhb+7KuutnKGf2geeT+bCJAgccB0DD7wmNJSsQPcF7TcuoZX83B7VK4tLz/u+8sOO/CnCsYp8A==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@azure/graph": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@azure/graph/-/graph-5.0.2.tgz", + "integrity": "sha512-V/rG6maHOLf3NrV+PTJ822/9T5RCjlhtihN0oIS83ZvrYlGMjf9ut/83ovdk4ceLTkQrlubiJ/rw1ZihI0jQog==", + "requires": { + "@azure/ms-rest-azure-js": "^2.0.0", + "@azure/ms-rest-js": "^2.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha512-CjZjB8apvXl5h97Ck6SbeeCmU0sk56YPozPtTyGudPp1RGoHXNjFNtoOvwOG76EdpmMpxbK10DqcygI16Lu60Q==", + "requires": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "requires": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "@azure/ms-rest-azure-env": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-env/-/ms-rest-azure-env-2.0.0.tgz", + "integrity": "sha512-dG76W7ElfLi+fbTjnZVGj+M9e0BIEJmRxU6fHaUQ12bZBe8EJKYb2GV50YWNaP2uJiVQ5+7nXEVj1VN1UQtaEw==" + }, + "@azure/ms-rest-azure-js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-js/-/ms-rest-azure-js-1.4.0.tgz", + "integrity": "sha512-ul1wfkzwU9wYg6kFKD/AuQfVRJU4utEjDcfa0hvXqDS99yRuJqUrt/Ojv3duZMwskBIrD3CV5d9TjLBOV7/pQw==", + "requires": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^1.10.0", + "tslib": "^1.9.3" + } + }, + "@azure/ms-rest-js": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-1.11.2.tgz", + "integrity": "sha512-2AyQ1IKmLGKW7DU3/x3TsTBzZLcbC9YRI+yuDPuXAQrv3zar340K9wsxU413kHFIDjkWNCo9T0w5VtwcyWxhbQ==", + "requires": { + "@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" + } + }, + "@azure/ms-rest-nodeauth": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-3.0.9.tgz", + "integrity": "sha512-+GdDHUJlWtIDanRZemFooLy68NsBDhN/Oni9DSFeoXIFNGlSe1IOes8/IRkQdrNXyUvBanuzzR7I5WYYzYQsmA==", + "requires": { + "@azure/ms-rest-azure-env": "^2.0.0", + "@azure/ms-rest-js": "^2.0.4", + "adal-node": "^0.1.28" + }, + "dependencies": { + "@azure/ms-rest-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.4.1.tgz", + "integrity": "sha512-76Tc+RRqXj1bqwg/1TX2KHaAGyFLzypqBQ65+FaVxw+oSeZhZcePRFM4r0lqRVwweC9RTct95aNPnMZSzGxDwA==", + "requires": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.0", + "tough-cookie": "^3.0.1", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^3.3.2", + "xml2js": "^0.4.19" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "@types/fs-extra": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", + "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "adal-node": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.1.28.tgz", + "integrity": "sha1-RoxLs+u9lrEnBmn0ucuk4AZepIU=", + "requires": { + "@types/node": "^8.0.47", + "async": ">=0.6.0", + "date-utils": "*", + "jws": "3.x.x", + "request": ">= 2.52.0", + "underscore": ">= 1.3.1", + "uuid": "^3.1.0", + "xmldom": ">= 0.1.x", + "xpath.js": "~1.1.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-utils": { + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", + "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "follow-redirects": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", + "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "requires": { + "mime-db": "1.47.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmldom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", + "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==" + }, + "xpath.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", + "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" + } + } +} diff --git a/ch14/TailwindTradersBotComposer/scripts/package.json b/ch14/TailwindTradersBotComposer/scripts/package.json new file mode 100644 index 00000000..13b5294d --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/package.json @@ -0,0 +1,23 @@ +{ + "name": "azure_provision", + "version": "1.0.0", + "description": "provision to azure cloud", + "main": "provisionComposer.js", + "license": "MIT", + "scripts": { + "start": "node provisionComposer.js" + }, + "dependencies": { + "@azure/arm-appinsights": "^2.1.0", + "@azure/arm-botservice": "^1.0.0", + "@azure/arm-resources": "^2.1.0", + "@azure/graph": "^5.0.1", + "@azure/ms-rest-nodeauth": "^3.0.3", + "@types/fs-extra": "^8.1.0", + "chalk": "^4.0.0", + "fs-extra": "^8.1.0", + "minimist": "^1.2.5", + "ora": "^4.0.4", + "request-promise": "^4.2.5" + } +} diff --git a/ch14/TailwindTradersBotComposer/scripts/provisionComposer.js b/ch14/TailwindTradersBotComposer/scripts/provisionComposer.js new file mode 100644 index 00000000..da98904c --- /dev/null +++ b/ch14/TailwindTradersBotComposer/scripts/provisionComposer.js @@ -0,0 +1,812 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +const chalk = require('chalk'); +const fs = require('fs-extra'); +const msRestNodeAuth = require('@azure/ms-rest-nodeauth'); +const argv = require('minimist')(process.argv.slice(2)); +const path = require('path'); +const rp = require('request-promise'); +const { promisify } = require('util'); +const { GraphRbacManagementClient } = require('@azure/graph'); +const { ApplicationInsightsManagementClient } = require('@azure/arm-appinsights'); +const { AzureBotService } = require('@azure/arm-botservice'); +const { ResourceManagementClient } = require('@azure/arm-resources'); +const readFile = promisify(fs.readFile); +const ora = require('ora'); + +const logger = (msg) => { + if (msg.status === BotProjectDeployLoggerType.PROVISION_ERROR) { + console.log(chalk.red(msg.message)); + } else if (msg.status === BotProjectDeployLoggerType.PROVISION_ERROR_DETAILS) { + console.log(chalk.white(msg.message)); + } else { + console.log(chalk.green(msg.message)); + } +}; + +const usage = () => { + const options = [ + ['subscriptionId', 'Azure Subscription Id'], + ['name', 'Project Name'], + ['appPassword', '16 character password'], + ['environment', 'Environment name (Defaults to dev)'], + ['location', 'Azure Region (Defaults to westus)'], + ['appId', 'Microsoft App ID (Will create if absent)'], + ['tenantId', 'ID of your tenant if required (will choose first in list by default)'], + ['createLuisResource', 'Create a LUIS resource? Default true'], + ['createLuisAuthoringResource', 'Create a LUIS authoring resource? Default true'], + ['createCosmosDb', 'Create a CosmosDB? Default true'], + ['createStorage', 'Create a storage account? Default true'], + ['createAppInsights', 'Create an AppInsights resource? Default true'], + ['createQnAResource', 'Create a QnA resource? Default true'], + [ + 'customArmTemplate', + 'Path to runtime ARM template. By default it will use an Azure WebApp template. Pass `DeploymentTemplates/function-template-with-preexisting-rg.json` for Azure Functions or your own template for a custom deployment.', + ], + ['qnaTemplate', 'Path to qna template. By default it will use `DeploymentTemplates/qna-template.json`'], + ]; + + const instructions = [ + ``, + chalk.bold('Provision Azure resources for use with Bot Framework Composer bots'), + `* This script will create a new resource group and the necessary Azure resources needed to operate a Bot Framework bot in the cloud.`, + `* Use this to create a publishing profile used in Composer's "Publish" toolbar.`, + ``, + chalk.bold(`Basic Usage:`), + chalk.greenBright(`node provisionComposer --subscriptionId=`) + + chalk.yellow('') + + chalk.greenBright(' --name=') + + chalk.yellow('') + + chalk.greenBright(' --appPassword=') + + chalk.yellow('<16 character password>'), + ``, + chalk.bold(`All options:`), + ...options.map((option) => { + return chalk.greenBright('--' + option[0]) + '\t' + chalk.yellow(option[1]); + }), + ]; + + console.log(instructions.join('\n')); +}; + +// check for required parameters +if (Object.keys(argv).length === 0) { + return usage(); +} + +if (!argv.name || !argv.subscriptionId || !argv.appPassword) { + return usage(); +} + +// Get required fields from the arguments +const subId = argv.subscriptionId; +const name = argv.name.toString(); +const appPassword = argv.appPassword; + +// Get optional fields from the arguments +const environment = argv.environment || 'dev'; +const location = argv.location || 'westus'; +const appId = argv.appId; // MicrosoftAppId - generated if left blank + +// Get option flags +const createLuisResource = argv.createLuisResource == 'false' ? false : true; +const createLuisAuthoringResource = argv.createLuisAuthoringResource == 'false' ? false : true; +const createCosmosDb = argv.createCosmosDb == 'false' ? false : true; +const createStorage = argv.createStorage == 'false' ? false : true; +const createAppInsights = argv.createAppInsights == 'false' ? false : true; +const createQnAResource = argv.createQnAResource == 'false' ? false : true; +var tenantId = argv.tenantId ? argv.tenantId : ''; + +const templatePath = + argv.customArmTemplate || path.join(__dirname, 'DeploymentTemplates', 'template-with-preexisting-rg.json'); +const qnaTemplatePath = argv.qnaTemplate || path.join(__dirname, 'DeploymentTemplates', 'qna-template.json'); + +const BotProjectDeployLoggerType = { + // Logger Type for Provision + PROVISION_INFO: 'PROVISION_INFO', + PROVISION_ERROR: 'PROVISION_ERROR', + PROVISION_WARNING: 'PROVISION_WARNING', + PROVISION_SUCCESS: 'PROVISION_SUCCESS', + PROVISION_ERROR_DETAILS: 'PROVISION_ERROR_DETAILS', +}; + +/** + * Create a Bot Framework registration + * @param {} graphClient + * @param {*} displayName + * @param {*} appPassword + */ +const createApp = async (graphClient, displayName, appPassword) => { + try { + const createRes = await graphClient.applications.create({ + displayName: displayName, + passwordCredentials: [ + { + value: appPassword, + startDate: new Date(), + endDate: new Date(new Date().setFullYear(new Date().getFullYear() + 2)), + }, + ], + availableToOtherTenants: true, + replyUrls: ['https://token.botframework.com/.auth/web/redirect'], + }); + return createRes; + } catch (err) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: err.body.message, + }); + return false; + } +}; + +/** + * Create an Azure resources group + * @param {} client + * @param {*} location + * @param {*} resourceGroupName + */ +const createResourceGroup = async (client, location, resourceGroupName) => { + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Creating resource group ...`, + }); + const param = { + location: location, + }; + + return await client.resourceGroups.createOrUpdate(resourceGroupName, param); +}; + +/** + * Format parameters + * @param {} scope + */ +const pack = (scope) => { + return { + value: scope, + }; +}; + +const unpackObject = (output) => { + const unpacked = {}; + for (const key in output) { + const objValue = output[key]; + if (objValue.value) { + unpacked[key] = objValue.value; + } + } + return unpacked; +}; + +/** + * For more information about this api, please refer to this doc: https://docs.microsoft.com/en-us/rest/api/resources/Tenants/List + * @param {*} accessToken + */ +const getTenantId = async (accessToken) => { + if (!accessToken) { + throw new Error( + 'Error: Missing access token. Please provide a non-expired Azure access token. Tokens can be obtained by running az account get-access-token' + ); + } + if (!subId) { + throw new Error(`Error: Missing subscription Id. Please provide a valid Azure subscription id.`); + } + try { + const tenantUrl = `https://management.azure.com/subscriptions/${subId}?api-version=2020-01-01`; + const options = { + headers: { Authorization: `Bearer ${accessToken}` }, + }; + const response = await rp.get(tenantUrl, options); + const jsonRes = JSON.parse(response); + if (jsonRes.tenantId === undefined) { + throw new Error(`No tenants found in the account.`); + } + return jsonRes.tenantId; + } catch (err) { + throw new Error(`Get Tenant Id Failed, details: ${getErrorMesssage(err)}`); + } +}; + +/** + * + * @param {*} appId the appId of application registration + * @param {*} appPwd the app password of application registration + * @param {*} location the locaiton of all resources + * @param {*} name the name of resource group + * @param {*} shouldCreateAuthoringResource + * @param {*} shouldCreateLuisResource + * @param {*} useAppInsights + * @param {*} useCosmosDb + * @param {*} useStorage + */ +const getDeploymentTemplateParam = ( + appId, + appPwd, + location, + name, + shouldCreateAuthoringResource, + shouldCreateLuisResource, + useAppInsights, + useCosmosDb, + useStorage +) => { + return { + appId: pack(appId), + appSecret: pack(appPwd), + appServicePlanLocation: pack(location), + botId: pack(name), + shouldCreateAuthoringResource: pack(shouldCreateAuthoringResource), + shouldCreateLuisResource: pack(shouldCreateLuisResource), + useAppInsights: pack(useAppInsights), + useCosmosDb: pack(useCosmosDb), + useStorage: pack(useStorage), + }; +}; + +/** + * Get QnA template param + */ +const getQnaTemplateParam = (location, name) => { + return { + appServicePlanLocation: pack(location), + name: pack(name), + }; +}; + +/** + * Validate the qna template and the qna template param + */ +const validateQnADeployment = async (client, resourceGroupName, deployName, templateParam) => { + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: '> Validating QnA deployment ...', + }); + + const templateFile = await readFile(qnaTemplatePath, { encoding: 'utf-8' }); + const deployParam = { + properties: { + template: JSON.parse(templateFile), + parameters: templateParam, + mode: 'Incremental', + }, + }; + return await client.deployments.validate(resourceGroupName, deployName, deployParam); +}; + +/** + * Create a QnA resource deployment + * @param {*} client + * @param {*} resourceGroupName + * @param {*} deployName + * @param {*} templateParam + */ +const createQnADeployment = async (client, resourceGroupName, deployName, templateParam) => { + const templateFile = await readFile(qnaTemplatePath, { encoding: 'utf-8' }); + const deployParam = { + properties: { + template: JSON.parse(templateFile), + parameters: templateParam, + mode: 'Incremental', + }, + }; + + return await client.deployments.createOrUpdate(resourceGroupName, deployName, deployParam); +}; + +/** + * Validate the deployment using the Azure API + */ +const validateDeployment = async (client, resourceGroupName, deployName, templateParam) => { + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: '> Validating Azure deployment ...', + }); + + const templateFile = await readFile(templatePath, { encoding: 'utf-8' }); + const deployParam = { + properties: { + template: JSON.parse(templateFile), + parameters: templateParam, + mode: 'Incremental', + }, + }; + return await client.deployments.validate(resourceGroupName, deployName, deployParam); +}; + +/** + * Using an ARM template, provision a bunch of resources + */ +const createDeployment = async (client, resourceGroupName, deployName, templateParam) => { + const templateFile = await readFile(templatePath, { encoding: 'utf-8' }); + const deployParam = { + properties: { + template: JSON.parse(templateFile), + parameters: templateParam, + mode: 'Incremental', + }, + }; + + return await client.deployments.createOrUpdate(resourceGroupName, deployName, deployParam); +}; + +/** + * Format the results into the expected shape + */ +const updateDeploymentJsonFile = async (client, resourceGroupName, deployName, appId, appPwd) => { + const outputs = await client.deployments.get(resourceGroupName, deployName); + if (outputs && outputs.properties && outputs.properties.outputs) { + const outputResult = outputs.properties.outputs; + const applicationResult = { + MicrosoftAppId: appId, + MicrosoftAppPassword: appPwd, + }; + const outputObj = unpackObject(outputResult); + + if (!createAppInsights) { + delete outputObj.applicationInsights; + } + if (!createCosmosDb) { + delete outputObj.cosmosDb; + } + if (!createLuisAuthoringResource && !createLuisResource) { + delete outputObj.luis; + } + if (!createStorage) { + delete outputObj.blobStorage; + } + const result = {}; + Object.assign(result, outputObj, applicationResult); + return result; + } else { + return null; + } +}; + +const provisionFailed = (msg) => { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: chalk.bold('** Provision failed **'), + }); +}; + +const getErrorMesssage = (err) => { + if (err.body) { + if (err.body.error) { + if (err.body.error.details) { + const details = err.body.error.details; + let errMsg = ''; + for (let detail of details) { + errMsg += detail.message; + } + return errMsg; + } else { + return err.body.error.message; + } + } else { + return JSON.stringify(err.body, null, 2); + } + } else { + return JSON.stringify(err, null, 2); + } +}; + +/** + * Provision a set of Azure resources for use with a bot + */ +const create = async ( + creds, + subId, + name, + location, + environment, + appId, + appPassword, + createLuisResource = true, + createLuisAuthoringResource = true, + createQnAResource = true, + createCosmosDb = true, + createStorage = true, + createAppInsights = true +) => { + // App insights is a dependency of QnA + if (createQnAResource) { + createAppInsights = true; + } + + // If tenantId is empty string, get tenanId from API + if (!tenantId) { + const token = await creds.getToken(); + const accessToken = token.accessToken; + // the returned access token will almost surely have a tenantId. + // use this as the default if one isn't specified. + if (token.tenantId) { + tenantId = token.tenantId; + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Using Tenant ID: ${tenantId}`, + }); + } else { + tenantId = await getTenantId(accessToken); + } + } + + const graphCreds = new msRestNodeAuth.DeviceTokenCredentials( + creds.clientId, + tenantId, + creds.username, + 'graph', + creds.environment, + creds.tokenCache + ); + const graphClient = new GraphRbacManagementClient(graphCreds, tenantId, { + baseUri: 'https://graph.windows.net', + }); + + // If the appId is not specified, create one + if (!appId) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: '> Creating App Registration ...', + }); + + // create the app registration + const appCreated = await createApp(graphClient, name, appPassword); + if (appCreated === false) { + return provisionFailed(); + } + + // use the newly created app + appId = appCreated.appId; + } + + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Create App Id Success! ID: ${appId}`, + }); + + const resourceGroupName = `${name}`; + + // timestamp will be used as deployment name + const timeStamp = new Date().getTime().toString(); + const client = new ResourceManagementClient(creds, subId); + + // Create a resource group to contain the new resources + try { + const rpres = await createResourceGroup(client, location, resourceGroupName); + } catch (err) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: getErrorMesssage(err), + }); + return provisionFailed(); + } + + // Caste the parameters into the right format + const deploymentTemplateParam = getDeploymentTemplateParam( + appId, + appPassword, + location, + name, + createLuisAuthoringResource, + createLuisResource, + createAppInsights, + createCosmosDb, + createStorage + ); + + // Validate the deployment using the Azure API + const validation = await validateDeployment(client, resourceGroupName, timeStamp, deploymentTemplateParam); + + // Handle validation errors + if (validation.error) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Error: ${validation.error.message}`, + }); + if (validation.error.details) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR_DETAILS, + message: JSON.stringify(validation.error.details, null, 2), + }); + } + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `+ To delete this resource group, run 'az group delete -g ${resourceGroupName} --no-wait'`, + }); + return provisionFailed(); + } + + // Create the entire stack of resources inside the new resource group + // this is controlled by an ARM template identified in templatePath + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Deploying Azure services (this could take a while)...`, + }); + const spinner = ora().start(); + try { + const deployment = await createDeployment(client, resourceGroupName, timeStamp, deploymentTemplateParam); + // Handle errors + if (deployment._response.status != 200) { + spinner.fail(); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Template is not valid with provided parameters. Review the log for more information.`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Error: ${validation.error}`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `+ To delete this resource group, run 'az group delete -g ${resourceGroupName} --no-wait'`, + }); + return provisionFailed(); + } + } catch (err) { + spinner.fail(); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: getErrorMesssage(err), + }); + return provisionFailed(); + } + + var qnaResult = null; + + // Create qna resources, the reason why seperate the qna resources from others: https://github.com/Azure/azure-sdk-for-js/issues/10186 + if (createQnAResource) { + const qnaDeployName = new Date().getTime().toString(); + const qnaDeploymentTemplateParam = getQnaTemplateParam(location, name); + const qnaValidation = await validateQnADeployment( + client, + resourceGroupName, + qnaDeployName, + qnaDeploymentTemplateParam + ); + if (qnaValidation.error) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Error: ${qnaValidation.error.message}`, + }); + if (qnaValidation.error.details) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR_DETAILS, + message: JSON.stringify(qnaValidation.error.details, null, 2), + }); + } + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `+ To delete this resource group, run 'az group delete -g ${resourceGroupName} --no-wait'`, + }); + return provisionFailed(); + } + + // Create qna deloyment + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Deploying QnA Resources (this could take a while)...`, + }); + const spinner = ora().start(); + try { + const qnaDeployment = await createQnADeployment( + client, + resourceGroupName, + qnaDeployName, + qnaDeploymentTemplateParam + ); + // Handle errors + if (qnaDeployment._response.status != 200) { + spinner.fail(); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! QnA Template is not valid with provided parameters. Review the log for more information.`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Error: ${qnaValidation.error}`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `+ To delete this resource group, run 'az group delete -g ${resourceGroupName} --no-wait'`, + }); + return provisionFailed(); + } + } catch (err) { + spinner.fail(); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: getErrorMesssage(err), + }); + return provisionFailed(); + } + + const qnaDeploymentOutput = await client.deployments.get(resourceGroupName, qnaDeployName); + if (qnaDeploymentOutput && qnaDeploymentOutput.properties && qnaDeploymentOutput.properties.outputs) { + const qnaOutputResult = qnaDeploymentOutput.properties.outputs; + qnaResult = unpackObject(qnaOutputResult); + } + } + + // If application insights created, update the application insights settings in azure bot service + if (createAppInsights) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Linking Application Insights settings to Bot Service ...`, + }); + + const appinsightsClient = new ApplicationInsightsManagementClient(creds, subId); + const appComponents = await appinsightsClient.components.get(resourceGroupName, resourceGroupName); + const appinsightsId = appComponents.appId; + const appinsightsInstrumentationKey = appComponents.instrumentationKey; + const apiKeyOptions = { + name: `${resourceGroupName}-provision-${timeStamp}`, + linkedReadProperties: [ + `/subscriptions/${subId}/resourceGroups/${resourceGroupName}/providers/microsoft.insights/components/${resourceGroupName}/api`, + `/subscriptions/${subId}/resourceGroups/${resourceGroupName}/providers/microsoft.insights/components/${resourceGroupName}/agentconfig`, + ], + linkedWriteProperties: [ + `/subscriptions/${subId}/resourceGroups/${resourceGroupName}/providers/microsoft.insights/components/${resourceGroupName}/annotations`, + ], + }; + const appinsightsApiKeyResponse = await appinsightsClient.aPIKeys.create( + resourceGroupName, + resourceGroupName, + apiKeyOptions + ); + const appinsightsApiKey = appinsightsApiKeyResponse.apiKey; + + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> AppInsights AppId: ${appinsightsId} ...`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> AppInsights InstrumentationKey: ${appinsightsInstrumentationKey} ...`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> AppInsights ApiKey: ${appinsightsApiKey} ...`, + }); + + if (appinsightsId && appinsightsInstrumentationKey && appinsightsApiKey) { + const botServiceClient = new AzureBotService(creds, subId); + const botCreated = await botServiceClient.bots.get(resourceGroupName, name); + if (botCreated.properties) { + botCreated.properties.developerAppInsightKey = appinsightsInstrumentationKey; + botCreated.properties.developerAppInsightsApiKey = appinsightsApiKey; + botCreated.properties.developerAppInsightsApplicationId = appinsightsId; + const botUpdateResult = await botServiceClient.bots.update(resourceGroupName, name, botCreated); + + if (botUpdateResult._response.status != 200) { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Something went wrong while trying to link Application Insights settings to Bot Service Result: ${JSON.stringify( + botUpdateResult + )}`, + }); + throw new Error(`Linking Application Insights Failed.`); + } + logger({ + status: BotProjectDeployLoggerType.PROVISION_INFO, + message: `> Linking Application Insights settings to Bot Service Success!`, + }); + } else { + logger({ + status: BotProjectDeployLoggerType.PROVISION_WARNING, + message: `! The Bot doesn't have a keys properties to update.`, + }); + } + } + } + + spinner.succeed('Success!'); + + // Validate that everything was successfully created. + // Then, update the settings file with information about the new resources + const updateResult = await updateDeploymentJsonFile(client, resourceGroupName, timeStamp, appId, appPassword); + + // Handle errors + if (!updateResult) { + const operations = await client.deploymentOperations.list(resourceGroupName, timeStamp); + if (operations) { + const failedOperations = operations.filter( + (value) => value && value.properties && value.properties.statusMessage.error !== null + ); + if (failedOperations) { + failedOperations.forEach((operation) => { + switch ( + operation && + operation.properties && + operation.properties.statusMessage.error.code && + operation.properties.targetResource + ) { + case 'MissingRegistrationForLocation': + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Deployment failed for resource of type ${operation.properties.targetResource.resourceType}. This resource is not avaliable in the location provided.`, + }); + break; + default: + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Deployment failed for resource of type ${operation.properties.targetResource.resourceType}.`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Code: ${operation.properties.statusMessage.error.code}.`, + }); + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Message: ${operation.properties.statusMessage.error.message}.`, + }); + break; + } + }); + } + } else { + logger({ + status: BotProjectDeployLoggerType.PROVISION_ERROR, + message: `! Deployment failed. Please refer to the log file for more information.`, + }); + } + } + + // Merge qna outputs with other resources' outputs + if (createQnAResource) { + if (qnaResult) { + Object.assign(updateResult, qnaResult); + } + } + + return updateResult; +}; + +console.log(chalk.bold('Login to Azure:')); +msRestNodeAuth + .interactiveLogin({ domain: tenantId }) + .then(async (creds) => { + const createResult = await create( + creds, + subId, + name, + location, + environment, + appId, + appPassword, + createLuisResource, + createLuisAuthoringResource, + createQnAResource, + createCosmosDb, + createStorage, + createAppInsights + ); + + if (createResult) { + console.log(''); + console.log( + chalk.bold( + `Your Azure hosting environment has been created! Copy paste the following configuration into a new profile in Composer's Publishing tab.` + ) + ); + console.log(''); + + const token = await creds.getToken(); + const profile = { + accessToken: token.accessToken, + name: name, + environment: environment, + hostname: `${name}-${environment}`, + luisResource: `${name}-${environment}-luis`, + settings: createResult, + runtimeIdentifier: 'win-x64', + }; + + console.log(chalk.white(JSON.stringify(profile, null, 2))); + + console.log(''); + } + }) + .catch((err) => { + console.error(err); + });