From 09deebc2e7ac438d7918a74530892121c06e9278 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 10:01:48 -0700 Subject: [PATCH 01/44] Duplicate of dotnet deploy steps for generator directory --- .../deployBotResources/deployBotResources.yml | 16 +- .../deployBotResources/generator/deploy.yml | 260 ++++++++++++++++++ .../generator/deployComposer.yml | 167 +++++++++++ .../evaluateDependenciesVariables.yml | 67 +++++ .../generator/installDependencies.yml | 60 ++++ .../generator/installDependenciesV3.yml | 44 +++ 6 files changed, 612 insertions(+), 2 deletions(-) create mode 100644 tests/functional/build/yaml/deployBotResources/generator/deploy.yml create mode 100644 tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml create mode 100644 tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml create mode 100644 tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml create mode 100644 tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index 6fd01cd5fa..d460bddd14 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -89,7 +89,7 @@ stages: displayName: "Prepare JS's Resource Group" # DotNet - - template: dotnet/deploy.yml + - template: generator/deploy.yml parameters: appInsight: "$(INTERNALAPPINSIGHTSNAME)" appServicePlan: "$(INTERNALAPPSERVICEPLANDOTNETNAME)" @@ -115,6 +115,18 @@ stages: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} version: ${{ parameters.dependenciesVersionDotNetHosts }} + - template: dotnet/deploy.yml + parameters: + appInsight: "$(INTERNALAPPINSIGHTSNAME)" + appServicePlan: "$(INTERNALAPPSERVICEPLANDOTNETNAME)" + appServicePlanRG: "$(INTERNALAPPSERVICEPLANWINDOWSRESOURCEGROUP)" + azureSubscription: "$(AZURESUBSCRIPTION)" + botPricingTier: $env:BOTPRICINGTIER + connectionName: $env:CONNECTIONNAME + keyVault: "$(INTERNALKEYVAULTNAME)" + resourceGroup: "$(INTERNALRESOURCEGROUPNAME)-DotNet" + resourceSuffix: $(INTERNALRESOURCESUFFIX) + bots: - name: "bfcfnemptybotdotnetfunctions" dependsOn: "Prepare_DotNetGroup" type: "Host" @@ -127,7 +139,7 @@ stages: netCoreVersion: "3.1.x" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} - version: ${{ parameters.dependenciesVersionDotNetHosts }} + version: ${{ parameters.dependenciesVersionDotNetHosts }} # JS - template: js/deploy.yml diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml new file mode 100644 index 0000000000..9c85c0cd42 --- /dev/null +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -0,0 +1,260 @@ +parameters: + - name: appInsight + displayName: Azure Application Insight name + type: string + + - name: appServicePlan + displayName: App Service Plan name + type: string + + - name: appServicePlanRG + displayName: App Service Plan Resource Group + type: string + + - name: azureSubscription + displayName: Azure Service Connection + type: string + + - name: botPricingTier + displayName: Bot Pricing Tier + type: string + + - name: bots + displayName: Bots + type: object + + - name: buildFolder + displayName: Build Folder + type: string + default: "build-dotnet" + + - name: connectionName + displayName: OAuth Connection Name + type: string + + - name: keyVault + displayName: Key Vault name + type: string + + - name: resourceGroup + displayName: Resource Group + type: string + + - name: resourceSuffix + displayName: Azure resources' name suffix + type: string + +stages: +- ${{ each bot in parameters.bots }}: + - stage: "Deploy_${{ bot.name }}" + ${{ if eq(bot.displayName, '') }}: + displayName: "${{ bot.name }}" + ${{ if ne(bot.displayName, '') }}: + displayName: "${{ bot.displayName }}" + dependsOn: "${{ bot.dependsOn }}" + jobs: + - job: "Deploy" + ${{ if eq(bot.type, 'SkillV3') }}: + variables: + SolutionDir: "$(BUILD.SOURCESDIRECTORY)/Bots/DotNet/" + displayName: "Deploy steps" + steps: + # Delete Bot Resources + - template: ../common/deleteResources.yml + parameters: + azureSubscription: "${{ parameters.azureSubscription }}" + resourceGroup: "${{ parameters.resourceGroup }}" + resourceName: "${{ bot.name }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" + + # Gets Bot App Registration credentials from KeyVault or Pipeline Variables + - template: ../common/getAppRegistration.yml + parameters: + appId: ${{ bot.appId }} + appSecret: ${{ bot.appSecret }} + azureSubscription: "${{ parameters.azureSubscription }}" + botName: "${{ bot.name }}" + keyVault: "${{ parameters.keyVault }}" + + # Use Net Core version + - ${{ if ne(bot.project.netCoreVersion, '') }}: + - task: UseDotNet@2 + displayName: "Use NetCore v${{ bot.project.netCoreVersion }}" + inputs: + version: "${{ bot.project.netCoreVersion }}" + + # Use NuGet + - task: NuGetToolInstaller@1 + displayName: "Use NuGet" + + # Prepare appsettings.json file, deleting all the declared skills, so it uses only the settings define in Azure + - ${{ if eq(bot.type, 'Host') }}: + - task: PowerShell@2 + displayName: 'Prepare App Settings' + inputs: + targetType: inline + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + failOnStderr: true + script: | + $file = "./appsettings.json" + $content = Get-Content -Raw $file | ConvertFrom-Json + $content.BotFrameworkSkills = @() + $content | ConvertTo-Json | Set-Content $file + + # Run NuGet restore SkillV3 + - ${{ if eq(bot.type, 'SkillV3') }}: + - task: NuGetCommand@2 + displayName: "NuGet restore" + inputs: + restoreSolution: "${{ bot.project.directory }}/${{ bot.project.name }}" + restoreDirectory: "$(SOLUTIONDIR)packages" + + # Evaluate dependencies source and version + - template: evaluateDependenciesVariables.yml + parameters: + botType: "${{ bot.type }}" + registry: "${{ bot.dependency.registry }}" + version: "${{ bot.dependency.version }}" + + # Start of DotNet Install & Build + - ${{ if in(bot.type, 'Host', 'Skill') }}: + # Install dependencies + - template: installDependencies.yml + parameters: + project: "${{ bot.project }}" + registry: "$(DEPENDENCIESSOURCE)" + version: "$(DEPENDENCIESVERSIONNUMBER)" + packages: + Microsoft.Bot.Builder.Dialogs + Microsoft.Bot.Builder.Integration.AspNet.Core + + # Build Bot + - task: DotNetCoreCLI@2 + displayName: "Build" + inputs: + command: publish + publishWebProjects: false + projects: "${{ bot.project.directory }}/${{ bot.project.name }}" + arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" + modifyOutputPath: false + + # Get BotBuilder package version + - task: PowerShell@2 + displayName: 'Get BotBuilder Version' + inputs: + targetType: inline + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + failOnStderr: true + script: | + [XML]$data = Get-Content "./${{ bot.project.name }}" + $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Integration.AspNet.Core" } + Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" + + # End of DotNet Install & Build + + # Start DotNet v3 Install, Build + - ${{ if eq(bot.type, 'SkillV3') }}: + # Install dependencies + - template: installDependenciesV3.yml + parameters: + registry: "$(DEPENDENCIESSOURCE)" + version: "$(DEPENDENCIESVERSIONNUMBER)" + project: "${{ bot.project }}" + packages: + Microsoft.Bot.Builder + Microsoft.Bot.Builder.Azure + Microsoft.Bot.Builder.History + + # Build bot + - task: MSBuild@1 + displayName: "Build" + inputs: + solution: "${{ bot.project.directory }}/${{ bot.project.name }}" + vsVersion: 16.0 + platform: "$(BUILDPLATFORM)" + configuration: "$(BUILDCONFIGURATION)" + + # Get BotBuilder version + - task: PowerShell@2 + displayName: 'Get BotBuilder Version' + inputs: + targetType: inline + failOnStderr: true + script: | + $result = @(Get-ChildItem "$(SOLUTIONDIR)packages\Microsoft.Bot.Builder.[0-9]*" -directory | Sort LastWriteTime -Descending) + $version = $result[0].Name.Replace("Microsoft.Bot.Builder.", "") + Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($version)" + + # Zip bot + - task: ArchiveFiles@2 + displayName: 'Zip bot' + inputs: + rootFolderOrFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + includeRootFolder: false + archiveType: 'zip' + archiveFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' + replaceExistingArchive: true + verbose: true + # End of DotNet v3 Install, Build + + # Tag BotBuilder package version + - template: ../common/tagBotBuilderVersion.yml + parameters: + ${{ if eq(bot.displayName, '') }}: + botName: "${{ bot.name }}" + ${{ if ne(bot.displayName, '') }}: + botName: "${{ bot.displayName }}" + version: "$(BOTBUILDERVERSIONNUMBER)" + + # Upload zip to artifacts in case we want to debug it + - task: PublishBuildArtifacts@1 + displayName: 'Publish zip package' + inputs: + pathToPublish: "$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip" + artifactName: dotnet-$(BUILD.BUILDID) + + # Create App Service and Bot Channel Registration + - template: ../common/createAppService.yml + parameters: + appId: $(APPID) + appInsight: "${{ parameters.appInsight }}" + appSecret: $(APPSECRET) + appServicePlan: "${{ parameters.appServicePlan }}" + appServicePlanRG: "${{ parameters.appServicePlanRG }}" + azureSubscription: "${{ parameters.azureSubscription }}" + botGroup: "${{ parameters.resourceGroup }}" + botName: "${{ bot.name }}" + botPricingTier: "${{ parameters.botPricingTier }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" + templateFile: "build/templates/template-bot-resources.json" + + # Deploy bot + - task: AzureWebApp@1 + displayName: 'Deploy Azure Web App : ${{ bot.name }}-$(BUILD.BUILDID)' + inputs: + azureSubscription: "${{ parameters.azureSubscription }}" + appName: '${{ bot.name }}${{ parameters.resourceSuffix }}-$(BUILD.BUILDID)' + resourceGroupName: '${{ parameters.resourceGroup }}' + package: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' + deploymentMethod: runFromPackage + + # Configure OAuth + - ${{ if eq(bot.type, 'Skill') }}: + - template: ../common/configureOAuth.yml + parameters: + appId: $(APPID) + appSecret: $(APPSECRET) + azureSubscription: "${{ parameters.azureSubscription }}" + botGroup: "${{ parameters.resourceGroup }}" + botName: "${{ bot.name }}" + connectionName: "${{ parameters.connectionName }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" + + # Create DirectLine Channel Hosts + - ${{ if eq(bot.type, 'Host') }}: + - template: ../common/createDirectLine.yml + parameters: + azureSubscription: "${{ parameters.azureSubscription }}" + botGroup: "${{ parameters.resourceGroup }}" + botName: "${{ bot.name }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" diff --git a/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml b/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml new file mode 100644 index 0000000000..5e20c68afe --- /dev/null +++ b/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml @@ -0,0 +1,167 @@ +parameters: + - name: appInsight + displayName: Azure Application Insight name + type: string + + - name: appServicePlan + displayName: App Service Plan name + type: string + + - name: appServicePlanRG + displayName: App Service Plan Resource Group + type: string + + - name: azureSubscription + displayName: Azure Service Connection + type: string + + - name: botPricingTier + displayName: Bot Pricing Tier + type: string + + - name: bots + displayName: Bots + type: object + + - name: buildFolder + displayName: Build Folder + type: string + default: "build-composer" + + - name: keyVault + displayName: Key Vault name + type: string + + - name: resourceGroup + displayName: Resource Group + type: string + + - name: resourceSuffix + displayName: Azure resources' name suffix + type: string + +stages: +- ${{ each bot in parameters.bots }}: + - stage: "Deploy_${{ bot.name }}" + ${{ if eq(bot.displayName, '') }}: + displayName: "${{ bot.name }}" + ${{ if ne(bot.displayName, '') }}: + displayName: "${{ bot.displayName }}" + dependsOn: "${{ bot.dependsOn }}" + jobs: + - job: "Deploy" + displayName: "Deploy steps" + steps: + # Delete Bot Resources + - template: ../common/deleteResources.yml + parameters: + azureSubscription: "${{ parameters.azureSubscription }}" + resourceGroup: "${{ parameters.resourceGroup }}" + resourceName: "${{ bot.name }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" + + # Gets Bot App Registration credentials from KeyVault or Pipeline Variables + - template: ../common/getAppRegistration.yml + parameters: + appId: ${{ bot.appId }} + appSecret: ${{ bot.appSecret }} + azureSubscription: "${{ parameters.azureSubscription }}" + botName: "${{ bot.name }}" + keyVault: "${{ parameters.keyVault }}" + + # Use Net Core version + - ${{ if ne(bot.project.netCoreVersion, '') }}: + - task: UseDotNet@2 + displayName: "Use NetCore v${{ bot.project.netCoreVersion }}" + inputs: + version: "${{ bot.project.netCoreVersion }}" + + # Evaluate dependencies source and version + - template: evaluateDependenciesVariables.yml + parameters: + botType: "${{ bot.type }}" + registry: "${{ bot.dependency.registry }}" + version: "${{ bot.dependency.version }}" + + # Start of DotNet Install & Build + - template: installDependencies.yml + parameters: + project: "${{ bot.project }}" + registry: "$(DEPENDENCIESSOURCE)" + version: "$(DEPENDENCIESVERSIONNUMBER)" + packages: + Microsoft.Bot.Builder.AI.Luis + Microsoft.Bot.Builder.AI.QnA + Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime + + # Build Bot + - task: DotNetCoreCLI@2 + displayName: "Build" + inputs: + command: publish + publishWebProjects: false + projects: "${{ bot.project.directory }}/${{ bot.project.name }}" + arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" + modifyOutputPath: false + + # Get BotBuilder package version + - task: PowerShell@2 + displayName: 'Get BotBuilder Version' + inputs: + targetType: inline + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + failOnStderr: true + script: | + [XML]$data = Get-Content "./${{ bot.project.name }}" + $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } + Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" + + # Tag BotBuilder package version + - template: ../common/tagBotBuilderVersion.yml + parameters: + ${{ if eq(bot.displayName, '') }}: + botName: "${{ bot.name }}" + ${{ if ne(bot.displayName, '') }}: + botName: "${{ bot.displayName }}" + version: "$(BOTBUILDERVERSIONNUMBER)" + + # Upload zip to artifacts in case we want to debug it + - task: PublishBuildArtifacts@1 + displayName: 'Publish zip package' + inputs: + pathToPublish: "$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip" + artifactName: dotnet-$(BUILD.BUILDID) + + # Create App Service and Bot Channel Registration + - template: ../common/createAppService.yml + parameters: + appId: $(APPID) + appInsight: "${{ parameters.appInsight }}" + appSecret: $(APPSECRET) + appServicePlan: "${{ parameters.appServicePlan }}" + appServicePlanRG: "${{ parameters.appServicePlanRG }}" + azureSubscription: "${{ parameters.azureSubscription }}" + botGroup: "${{ parameters.resourceGroup }}" + botName: "${{ bot.name }}" + botPricingTier: "${{ parameters.botPricingTier }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" + templateFile: "build/templates/template-bot-resources.json" + + # Deploy bot + - task: AzureWebApp@1 + displayName: 'Deploy Azure Web App : ${{ bot.name }}-$(BUILD.BUILDID)' + inputs: + azureSubscription: "${{ parameters.azureSubscription }}" + appName: '${{ bot.name }}${{ parameters.resourceSuffix }}-$(BUILD.BUILDID)' + resourceGroupName: '${{ parameters.resourceGroup }}' + package: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' + deploymentMethod: runFromPackage + + # Create DirectLine Channel Hosts + - ${{ if eq(bot.type, 'Host') }}: + - template: ../common/createDirectLine.yml + parameters: + azureSubscription: "${{ parameters.azureSubscription }}" + botGroup: "${{ parameters.resourceGroup }}" + botName: "${{ bot.name }}" + resourceSuffix: "${{ parameters.resourceSuffix }}" diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml new file mode 100644 index 0000000000..161b04723b --- /dev/null +++ b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml @@ -0,0 +1,67 @@ +parameters: + - name: botType + displayName: Bot type + type: string + + - name: registry + displayName: Registry source + type: string + + - name: version + displayName: Version number + type: string + +steps: + - task: PowerShell@2 + displayName: 'Evaluate source & version' + inputs: + targetType: inline + failOnStderr: true + script: | + # Get Source + $sourceDotNetv3MyGet = "https://botbuilder.myget.org/F/botbuilder-v3-dotnet-daily/api/v3/index.json" + $sourceDotNetArtifacts = "https://pkgs.dev.azure.com/ConversationalAI/BotFramework/_packaging/SDK/nuget/v3/index.json" + $sourceDotNetMyGet = "https://botbuilder.myget.org/F/botbuilder-v4-dotnet-daily/api/v3/index.json" + switch -regex ("${{ parameters.registry }}") { + "^($null|)$" { + switch ("${{ parameters.botType }}") { + "SkillV3" { $source = $sourceDotNetv3MyGet } + default { $source = $sourceDotNetArtifacts } + } + } + "Artifacts" { $source = $sourceDotNetArtifacts } + "MyGet" { + switch ("${{ parameters.botType }}") { + "SkillV3" { $source = $sourceDotNetv3MyGet } + default { $source = $sourceDotNetMyGet } + } + } + "NuGet" { $source = "" } + default { $source = "${{ parameters.registry }}" } + } + Write-Host "Source: $source" + + # Get Version Number + switch -regex ("${{ parameters.version }}") { + "^($null||LATEST)$" { + if ("${{ parameters.registry }}".ToUpper() -in "NUGET") { + [Console]::ForegroundColor = "red" + [Console]::Error.WriteLine("Preview versions of BotBuilder are not available for this source.") + [Console]::ResetColor() + exit 1 # Force exit + } + if ("${{ parameters.botType }}" -in "Host", "Skill") { + $PackageList = nuget list Microsoft.Bot.Builder.Integration.AspNet.Core -Source "$source" -PreRelease + $versionNumber = $PackageList.Split(" ")[-1] + } elseif ("${{ parameters.botType }}" -in "SkillV3") { + $versionNumber = "" + } + } + STABLE { $versionNumber = "" } + default { $versionNumber = "${{ parameters.version }}" } + } + Write-Host "Version Number: $versionNumber" + + # Set environment variables + Write-Host "##vso[task.setvariable variable=DependenciesSource]$source" + Write-Host "##vso[task.setvariable variable=DependenciesVersionNumber]$versionNumber" diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml new file mode 100644 index 0000000000..4fc5ef882e --- /dev/null +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -0,0 +1,60 @@ +parameters: + - name: packages + displayName: Dependency Packages + type: object + + - name: project + displayName: Project + type: object + + - name: registry + displayName: Registry source + type: string + + - name: version + displayName: Version number + type: string + +steps: + - task: PowerShell@2 + displayName: 'Install dependencies for ${{ parameters.project.name }}' + inputs: + targetType: inline + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.project.directory }}' + failOnStderr: true + script: | + $version = "" + $source = "" + + if (-not ([string]::IsNullOrEmpty("${{ parameters.version }}"))) { + $version = "--version ${{ parameters.version }}" + } + + if (-not ([string]::IsNullOrEmpty("${{ parameters.registry }}"))) { + $source = "--source ${{ parameters.registry }}" + } + + foreach ($package in "${{ parameters.packages }}".Split()) { + if ($package -eq "Microsoft.Bot.Builder.Dialogs.Debugging") { + $versionAux = $version + if ($version -Match "rc") { + $version = "$version.preview" + } elseif ($version -Match "daily") { + $version = $version.replace("daily", "daily.preview") + } else { + $version = "$version-preview" + } + } + + Invoke-Expression "dotnet add ""./${{ parameters.project.name }}"" package $version $source $package" + + if (-not ([string]::IsNullOrEmpty("$versionAux"))) { + $version = $versionAux + $versionAux = "" + } + } + + write-host " `nPackages:" + foreach ($package in "${{ parameters.packages }}".Split()) { + write-host " - $package" + } diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml new file mode 100644 index 0000000000..62bb916f5a --- /dev/null +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml @@ -0,0 +1,44 @@ +parameters: + - name: packages + displayName: Dependency Packages + type: object + + - name: project + displayName: Project + type: object + + - name: registry + displayName: Registry source + type: string + + - name: version + displayName: Version number + type: string + +steps: + - task: PowerShell@2 + displayName: 'Install dependencies' + inputs: + targetType: inline + workingDirectory: '$(System.DefaultWorkingDirectory)/${{ parameters.project.directory }}' + failOnStderr: true + script: | + $version = "" + $source = "" + + if (-not ([string]::IsNullOrEmpty("${{ parameters.version }}"))) { + $version = "-Version ""${{ parameters.version }}""" + } + + if (-not ([string]::IsNullOrEmpty("${{ parameters.registry }}"))) { + $source = "-Source ""${{ parameters.registry }}""" + } + + foreach ($package in "${{ parameters.packages }}".Split()) { + Invoke-Expression "nuget update ""./packages.config"" -Id $package $version $source" + } + + write-host "`nPackages:" + foreach ($package in "${{ parameters.packages }}".Split()) { + write-host " - $package " + } From 24448bdb093007530462f3a313f7108ab3cff6ad Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 15:28:30 -0700 Subject: [PATCH 02/44] add test call to empty bot generator with paramters --- .../yaml/deployBotResources/dotnet/deploy.yml | 47 +------------------ .../deployBotResources/generator/deploy.yml | 7 +++ 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml index 9c85c0cd42..7002d74d08 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml @@ -150,52 +150,7 @@ stages: $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Integration.AspNet.Core" } Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" - # End of DotNet Install & Build - - # Start DotNet v3 Install, Build - - ${{ if eq(bot.type, 'SkillV3') }}: - # Install dependencies - - template: installDependenciesV3.yml - parameters: - registry: "$(DEPENDENCIESSOURCE)" - version: "$(DEPENDENCIESVERSIONNUMBER)" - project: "${{ bot.project }}" - packages: - Microsoft.Bot.Builder - Microsoft.Bot.Builder.Azure - Microsoft.Bot.Builder.History - - # Build bot - - task: MSBuild@1 - displayName: "Build" - inputs: - solution: "${{ bot.project.directory }}/${{ bot.project.name }}" - vsVersion: 16.0 - platform: "$(BUILDPLATFORM)" - configuration: "$(BUILDCONFIGURATION)" - - # Get BotBuilder version - - task: PowerShell@2 - displayName: 'Get BotBuilder Version' - inputs: - targetType: inline - failOnStderr: true - script: | - $result = @(Get-ChildItem "$(SOLUTIONDIR)packages\Microsoft.Bot.Builder.[0-9]*" -directory | Sort LastWriteTime -Descending) - $version = $result[0].Name.Replace("Microsoft.Bot.Builder.", "") - Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($version)" - - # Zip bot - - task: ArchiveFiles@2 - displayName: 'Zip bot' - inputs: - rootFolderOrFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - includeRootFolder: false - archiveType: 'zip' - archiveFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' - replaceExistingArchive: true - verbose: true - # End of DotNet v3 Install, Build + # End of DotNet Install & Build # Tag BotBuilder package version - template: ../common/tagBotBuilderVersion.yml diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 9c85c0cd42..6a39eb573a 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -59,6 +59,13 @@ stages: SolutionDir: "$(BUILD.SOURCESDIRECTORY)/Bots/DotNet/" displayName: "Deploy steps" steps: + - script: | + npm install yo + npm install @microsoft/generator-microsoft-bot-empty + + yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + displayName: 'Build template' + # Delete Bot Resources - template: ../common/deleteResources.yml parameters: From 4c441f66da1ba25ef5c49d7eb56ae5cd14b819e3 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 15:34:30 -0700 Subject: [PATCH 03/44] add dir workspace for debugging --- .../build/yaml/deployBotResources/generator/deploy.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 6a39eb573a..f0863d76cf 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -66,6 +66,14 @@ stages: yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} displayName: 'Build template' + # Perhaps debugging output for the workspace? + - script: | + cd .. + dir *.* /s + displayName: 'Dir workspace' + continueOnError: true + condition: succeededOrFailed() + # Delete Bot Resources - template: ../common/deleteResources.yml parameters: From 94e1049931c3362996448b17f737b4f15edb646b Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 15:36:14 -0700 Subject: [PATCH 04/44] add params to generator test --- .../build/yaml/deployBotResources/deployBotResources.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index d460bddd14..699f68a295 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -111,6 +111,9 @@ stages: directory: 'Tests/Functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot' name: "SimpleHostBot.csproj" netCoreVersion: "3.1.x" + generator: '@microsoft/generator-microsoft-bot-empty' + platform: "dotnet" + integration: "webapp" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} version: ${{ parameters.dependenciesVersionDotNetHosts }} From b19bbe20cdf1022fd230a81613eb3ab5f22c0e00 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 15:37:57 -0700 Subject: [PATCH 05/44] fix indent in generator deploy --- .../deployBotResources/generator/deploy.yml | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index f0863d76cf..c0d7a79c69 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -59,20 +59,20 @@ stages: SolutionDir: "$(BUILD.SOURCESDIRECTORY)/Bots/DotNet/" displayName: "Deploy steps" steps: - - script: | - npm install yo - npm install @microsoft/generator-microsoft-bot-empty - - yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - displayName: 'Build template' - - # Perhaps debugging output for the workspace? - - script: | - cd .. - dir *.* /s - displayName: 'Dir workspace' - continueOnError: true - condition: succeededOrFailed() + - script: | + npm install yo + npm install @microsoft/generator-microsoft-bot-empty + + yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + displayName: 'Build template' + + # Perhaps debugging output for the workspace? + - script: | + cd .. + dir *.* /s + displayName: 'Dir workspace' + continueOnError: true + condition: succeededOrFailed() # Delete Bot Resources - template: ../common/deleteResources.yml From ebb1ee30fa79b2883b227c39d2a777db0a6953ca Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 15:48:17 -0700 Subject: [PATCH 06/44] split script into 2 steps --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index c0d7a79c69..36207c0b03 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -61,6 +61,10 @@ stages: steps: - script: | npm install yo + + displayName: 'Install prereq' + + - script: | npm install @microsoft/generator-microsoft-bot-empty yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} From b16809f8a356d7da0b1087e92d2fdc27aadf2bc6 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 16:16:48 -0700 Subject: [PATCH 07/44] pull generation into third script --- .../build/yaml/deployBotResources/generator/deploy.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 36207c0b03..86d072a3bf 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -61,14 +61,15 @@ stages: steps: - script: | npm install yo - - displayName: 'Install prereq' + displayName: 'Install yeoman' - script: | npm install @microsoft/generator-microsoft-bot-empty + displayName: 'Install template' + - script: | yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - displayName: 'Build template' + displayName: 'Generate template' # Perhaps debugging output for the workspace? - script: | From 9bab7563a2fa148c1cd4f34152f92290a2e8b6c7 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 16:34:16 -0700 Subject: [PATCH 08/44] install yeoman globally --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 86d072a3bf..b625936c55 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -60,11 +60,11 @@ stages: displayName: "Deploy steps" steps: - script: | - npm install yo + npm install -g yo displayName: 'Install yeoman' - script: | - npm install @microsoft/generator-microsoft-bot-empty + npm install -g @microsoft/generator-microsoft-bot-empty displayName: 'Install template' - script: | From 5b5bc6de123c71e07921edeb95b2736f9e703d65 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 17:06:54 -0700 Subject: [PATCH 09/44] add working directory to generate template step --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index b625936c55..ea4eaa7a27 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -69,7 +69,9 @@ stages: - script: | yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - displayName: 'Generate template' + displayName: 'Generate template' + inputs: + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.name }}' # Perhaps debugging output for the workspace? - script: | From e140505fc83cb225f820ec92d2c5e65e0ca9aa27 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 17:10:37 -0700 Subject: [PATCH 10/44] change yo task to cmdline --- .../build/yaml/deployBotResources/generator/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index ea4eaa7a27..dce7fd7f1a 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -67,10 +67,10 @@ stages: npm install -g @microsoft/generator-microsoft-bot-empty displayName: 'Install template' - - script: | - yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - displayName: 'Generate template' + - task: CmdLine@2 inputs: + script: | + yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.name }}' # Perhaps debugging output for the workspace? From 08f32a53f9cc060b8fce198743c2e40397bfdb20 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 17:25:04 -0700 Subject: [PATCH 11/44] add task to create bot directory --- .../yaml/deployBotResources/generator/deploy.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index dce7fd7f1a..645af75f47 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -64,14 +64,17 @@ stages: displayName: 'Install yeoman' - script: | - npm install -g @microsoft/generator-microsoft-bot-empty - displayName: 'Install template' + mkdir ${{ bot.name }} + displayName: 'Create bot directory' - task: CmdLine@2 + displayName: 'Install template' inputs: script: | - yo @microsoft/microsoft-bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.name }}' + npm install -g @microsoft/generator-bot-empty + + yo @microsoft/bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY' # Perhaps debugging output for the workspace? - script: | From b9f8072613fbd1e3a9acf5e912eb76d2a1feb18d Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 17:31:48 -0700 Subject: [PATCH 12/44] rename scratch directory to bots and merge install yo task --- .../yaml/deployBotResources/generator/deploy.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 645af75f47..c9364036ab 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -60,21 +60,18 @@ stages: displayName: "Deploy steps" steps: - script: | - npm install -g yo - displayName: 'Install yeoman' - - - script: | - mkdir ${{ bot.name }} - displayName: 'Create bot directory' + mkdir bots + displayName: 'Create bots directory' - task: CmdLine@2 displayName: 'Install template' inputs: script: | + npm install -g yo npm install -g @microsoft/generator-bot-empty yo @microsoft/bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY' + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)'/bots' # Perhaps debugging output for the workspace? - script: | From 23b84e24ea3a9e6a6e4c4d73c5f379e349c2d3c5 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 17:34:09 -0700 Subject: [PATCH 13/44] remove extra ' --- .../build/yaml/deployBotResources/generator/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index c9364036ab..a5df5ed9d3 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -71,7 +71,7 @@ stages: npm install -g @microsoft/generator-bot-empty yo @microsoft/bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)'/bots' + workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/bots' # Perhaps debugging output for the workspace? - script: | From 6932a2dcbb5eb4db14803ac6bc0bdff44236fe51 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Mon, 14 Jun 2021 18:07:51 -0700 Subject: [PATCH 14/44] split install into 3 tasks --- .../yaml/deployBotResources/generator/deploy.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index a5df5ed9d3..1b92ad2089 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -63,13 +63,18 @@ stages: mkdir bots displayName: 'Create bots directory' + - script: | + npm install -g yo + displayName: 'Install yeoman' + + - script: | + npm install -g @microsoft/generator-bot-empty + displayName: 'Install generator' + - task: CmdLine@2 displayName: 'Install template' inputs: script: | - npm install -g yo - npm install -g @microsoft/generator-bot-empty - yo @microsoft/bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/bots' From 55d458e55c6c24a18e87b65d5dea87e63ca70c7e Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 10:42:03 -0700 Subject: [PATCH 15/44] Test with calendar bot --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 1b92ad2089..c477e34ef4 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -68,14 +68,14 @@ stages: displayName: 'Install yeoman' - script: | - npm install -g @microsoft/generator-bot-empty + npm install -g @microsoft/generator-bot-calendar displayName: 'Install generator' - task: CmdLine@2 displayName: 'Install template' inputs: script: | - yo @microsoft/bot-empty ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + yo @microsoft/bot-calendar ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/bots' # Perhaps debugging output for the workspace? From 76fd8281d3ae8a89d00fc1d757c903502d786f02 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 11:24:05 -0700 Subject: [PATCH 16/44] Pass in generator directory to install local copy --- .../build/yaml/deployBotResources/deployBotResources.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index 699f68a295..fe60890acd 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -108,7 +108,7 @@ stages: appId: $(BFCFNEMPTYBOTDOTNETWEBAPPID) appSecret: $(BFCFNEMPTYBOTDOTNETWEBAPPSECRET) project: - directory: 'Tests/Functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot' + directory: 'generators/generator-bot-empty' name: "SimpleHostBot.csproj" netCoreVersion: "3.1.x" generator: '@microsoft/generator-microsoft-bot-empty' From 3efb55fd48a10fd08cb4cf3e82ee3da8c385c3f4 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 11:43:37 -0700 Subject: [PATCH 17/44] use directory parameter to pass in generator location --- .../build/yaml/deployBotResources/generator/deploy.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index c477e34ef4..94215dce26 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -67,15 +67,11 @@ stages: npm install -g yo displayName: 'Install yeoman' - - script: | - npm install -g @microsoft/generator-bot-calendar - displayName: 'Install generator' - - task: CmdLine@2 displayName: 'Install template' inputs: script: | - yo @microsoft/bot-calendar ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + yo ../${{ bot.project.directory }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/bots' # Perhaps debugging output for the workspace? From d9c40a5fbcf485514639386225d89474a9152ec3 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 11:57:06 -0700 Subject: [PATCH 18/44] Run yarn --immutable to install dependencies --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 94215dce26..9c8e40edf7 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -64,8 +64,8 @@ stages: displayName: 'Create bots directory' - script: | - npm install -g yo - displayName: 'Install yeoman' + yarn --immutable + displayName: 'Install dependencies' - task: CmdLine@2 displayName: 'Install template' From 3ebd1c08fdfc1fdbe89a81b2c0f4fe6f57eda1cd Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 12:28:22 -0700 Subject: [PATCH 19/44] Add install yo step --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 9c8e40edf7..616cefd79f 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -67,6 +67,10 @@ stages: yarn --immutable displayName: 'Install dependencies' + - script: | + npm install -g yo + displayName: 'Install yo' + - task: CmdLine@2 displayName: 'Install template' inputs: From c71c39fb7744396da7cc522fd1ffb13d01164175 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 12:55:26 -0700 Subject: [PATCH 20/44] Change to generator parameter and remove prepare app settings step --- .../deployBotResources/deployBotResources.yml | 4 +-- .../deployBotResources/generator/deploy.yml | 25 ++++--------------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index fe60890acd..f6d3ed6d23 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -108,10 +108,8 @@ stages: appId: $(BFCFNEMPTYBOTDOTNETWEBAPPID) appSecret: $(BFCFNEMPTYBOTDOTNETWEBAPPSECRET) project: - directory: 'generators/generator-bot-empty' - name: "SimpleHostBot.csproj" + generator: 'generators/generator-bot-empty' netCoreVersion: "3.1.x" - generator: '@microsoft/generator-microsoft-bot-empty' platform: "dotnet" integration: "webapp" dependency: diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 616cefd79f..66f8eb39cf 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -56,7 +56,7 @@ stages: - job: "Deploy" ${{ if eq(bot.type, 'SkillV3') }}: variables: - SolutionDir: "$(BUILD.SOURCESDIRECTORY)/Bots/DotNet/" + SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" displayName: "Deploy steps" steps: - script: | @@ -75,8 +75,8 @@ stages: displayName: 'Install template' inputs: script: | - yo ../${{ bot.project.directory }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/bots' + yo ../${{ bot.project.generator }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + workingDirectory: '$(SOLUTIONDIR)' # Perhaps debugging output for the workspace? - script: | @@ -114,26 +114,12 @@ stages: - task: NuGetToolInstaller@1 displayName: "Use NuGet" - # Prepare appsettings.json file, deleting all the declared skills, so it uses only the settings define in Azure - - ${{ if eq(bot.type, 'Host') }}: - - task: PowerShell@2 - displayName: 'Prepare App Settings' - inputs: - targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - failOnStderr: true - script: | - $file = "./appsettings.json" - $content = Get-Content -Raw $file | ConvertFrom-Json - $content.BotFrameworkSkills = @() - $content | ConvertTo-Json | Set-Content $file - # Run NuGet restore SkillV3 - ${{ if eq(bot.type, 'SkillV3') }}: - task: NuGetCommand@2 displayName: "NuGet restore" inputs: - restoreSolution: "${{ bot.project.directory }}/${{ bot.project.name }}" + restoreSolution: "$(SOLUTIONDIR)/${{ bot.project.name }}" restoreDirectory: "$(SOLUTIONDIR)packages" # Evaluate dependencies source and version @@ -152,8 +138,7 @@ stages: registry: "$(DEPENDENCIESSOURCE)" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: - Microsoft.Bot.Builder.Dialogs - Microsoft.Bot.Builder.Integration.AspNet.Core + Microsoft.Bot.Builder.Integration.Runtime # Build Bot - task: DotNetCoreCLI@2 From 565250b010aaf123d8856e3c02784884608b4276 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 13:00:33 -0700 Subject: [PATCH 21/44] remove skillv3 refs --- .../deployBotResources/generator/deploy.yml | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 66f8eb39cf..b803b17e90 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -54,7 +54,6 @@ stages: dependsOn: "${{ bot.dependsOn }}" jobs: - job: "Deploy" - ${{ if eq(bot.type, 'SkillV3') }}: variables: SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" displayName: "Deploy steps" @@ -114,14 +113,6 @@ stages: - task: NuGetToolInstaller@1 displayName: "Use NuGet" - # Run NuGet restore SkillV3 - - ${{ if eq(bot.type, 'SkillV3') }}: - - task: NuGetCommand@2 - displayName: "NuGet restore" - inputs: - restoreSolution: "$(SOLUTIONDIR)/${{ bot.project.name }}" - restoreDirectory: "$(SOLUTIONDIR)packages" - # Evaluate dependencies source and version - template: evaluateDependenciesVariables.yml parameters: @@ -164,50 +155,6 @@ stages: # End of DotNet Install & Build - # Start DotNet v3 Install, Build - - ${{ if eq(bot.type, 'SkillV3') }}: - # Install dependencies - - template: installDependenciesV3.yml - parameters: - registry: "$(DEPENDENCIESSOURCE)" - version: "$(DEPENDENCIESVERSIONNUMBER)" - project: "${{ bot.project }}" - packages: - Microsoft.Bot.Builder - Microsoft.Bot.Builder.Azure - Microsoft.Bot.Builder.History - - # Build bot - - task: MSBuild@1 - displayName: "Build" - inputs: - solution: "${{ bot.project.directory }}/${{ bot.project.name }}" - vsVersion: 16.0 - platform: "$(BUILDPLATFORM)" - configuration: "$(BUILDCONFIGURATION)" - - # Get BotBuilder version - - task: PowerShell@2 - displayName: 'Get BotBuilder Version' - inputs: - targetType: inline - failOnStderr: true - script: | - $result = @(Get-ChildItem "$(SOLUTIONDIR)packages\Microsoft.Bot.Builder.[0-9]*" -directory | Sort LastWriteTime -Descending) - $version = $result[0].Name.Replace("Microsoft.Bot.Builder.", "") - Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($version)" - - # Zip bot - - task: ArchiveFiles@2 - displayName: 'Zip bot' - inputs: - rootFolderOrFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - includeRootFolder: false - archiveType: 'zip' - archiveFile: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' - replaceExistingArchive: true - verbose: true - # End of DotNet v3 Install, Build # Tag BotBuilder package version - template: ../common/tagBotBuilderVersion.yml From bc0a87530d87687aa26cc64e04116780f318a17f Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 13:07:12 -0700 Subject: [PATCH 22/44] Remove unused deployCompoeser and v3 templates. Fix indent on SolutionDir variable --- .../generator/evaluateDependenciesVariables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml index 161b04723b..50d213b499 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml @@ -1,4 +1,4 @@ -parameters: +lparameters: - name: botType displayName: Bot type type: string From af063709a6ce0ce745ea3cfd405e13415717a976 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 13:07:52 -0700 Subject: [PATCH 23/44] Fix indent on SolutionDir --- .../deployBotResources/generator/deploy.yml | 6 +- .../generator/deployComposer.yml | 167 ------------------ .../generator/installDependenciesV3.yml | 44 ----- 3 files changed, 3 insertions(+), 214 deletions(-) delete mode 100644 tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml delete mode 100644 tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index b803b17e90..f73fa5134e 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -54,8 +54,8 @@ stages: dependsOn: "${{ bot.dependsOn }}" jobs: - job: "Deploy" - variables: - SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" + variables: + SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" displayName: "Deploy steps" steps: - script: | @@ -75,7 +75,7 @@ stages: inputs: script: | yo ../${{ bot.project.generator }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SOLUTIONDIR)' + workingDirectory: '$(SolutionDir)' # Perhaps debugging output for the workspace? - script: | diff --git a/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml b/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml deleted file mode 100644 index 5e20c68afe..0000000000 --- a/tests/functional/build/yaml/deployBotResources/generator/deployComposer.yml +++ /dev/null @@ -1,167 +0,0 @@ -parameters: - - name: appInsight - displayName: Azure Application Insight name - type: string - - - name: appServicePlan - displayName: App Service Plan name - type: string - - - name: appServicePlanRG - displayName: App Service Plan Resource Group - type: string - - - name: azureSubscription - displayName: Azure Service Connection - type: string - - - name: botPricingTier - displayName: Bot Pricing Tier - type: string - - - name: bots - displayName: Bots - type: object - - - name: buildFolder - displayName: Build Folder - type: string - default: "build-composer" - - - name: keyVault - displayName: Key Vault name - type: string - - - name: resourceGroup - displayName: Resource Group - type: string - - - name: resourceSuffix - displayName: Azure resources' name suffix - type: string - -stages: -- ${{ each bot in parameters.bots }}: - - stage: "Deploy_${{ bot.name }}" - ${{ if eq(bot.displayName, '') }}: - displayName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - displayName: "${{ bot.displayName }}" - dependsOn: "${{ bot.dependsOn }}" - jobs: - - job: "Deploy" - displayName: "Deploy steps" - steps: - # Delete Bot Resources - - template: ../common/deleteResources.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - resourceGroup: "${{ parameters.resourceGroup }}" - resourceName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - - # Gets Bot App Registration credentials from KeyVault or Pipeline Variables - - template: ../common/getAppRegistration.yml - parameters: - appId: ${{ bot.appId }} - appSecret: ${{ bot.appSecret }} - azureSubscription: "${{ parameters.azureSubscription }}" - botName: "${{ bot.name }}" - keyVault: "${{ parameters.keyVault }}" - - # Use Net Core version - - ${{ if ne(bot.project.netCoreVersion, '') }}: - - task: UseDotNet@2 - displayName: "Use NetCore v${{ bot.project.netCoreVersion }}" - inputs: - version: "${{ bot.project.netCoreVersion }}" - - # Evaluate dependencies source and version - - template: evaluateDependenciesVariables.yml - parameters: - botType: "${{ bot.type }}" - registry: "${{ bot.dependency.registry }}" - version: "${{ bot.dependency.version }}" - - # Start of DotNet Install & Build - - template: installDependencies.yml - parameters: - project: "${{ bot.project }}" - registry: "$(DEPENDENCIESSOURCE)" - version: "$(DEPENDENCIESVERSIONNUMBER)" - packages: - Microsoft.Bot.Builder.AI.Luis - Microsoft.Bot.Builder.AI.QnA - Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime - - # Build Bot - - task: DotNetCoreCLI@2 - displayName: "Build" - inputs: - command: publish - publishWebProjects: false - projects: "${{ bot.project.directory }}/${{ bot.project.name }}" - arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" - modifyOutputPath: false - - # Get BotBuilder package version - - task: PowerShell@2 - displayName: 'Get BotBuilder Version' - inputs: - targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - failOnStderr: true - script: | - [XML]$data = Get-Content "./${{ bot.project.name }}" - $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } - Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" - - # Tag BotBuilder package version - - template: ../common/tagBotBuilderVersion.yml - parameters: - ${{ if eq(bot.displayName, '') }}: - botName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - botName: "${{ bot.displayName }}" - version: "$(BOTBUILDERVERSIONNUMBER)" - - # Upload zip to artifacts in case we want to debug it - - task: PublishBuildArtifacts@1 - displayName: 'Publish zip package' - inputs: - pathToPublish: "$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip" - artifactName: dotnet-$(BUILD.BUILDID) - - # Create App Service and Bot Channel Registration - - template: ../common/createAppService.yml - parameters: - appId: $(APPID) - appInsight: "${{ parameters.appInsight }}" - appSecret: $(APPSECRET) - appServicePlan: "${{ parameters.appServicePlan }}" - appServicePlanRG: "${{ parameters.appServicePlanRG }}" - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - botPricingTier: "${{ parameters.botPricingTier }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - templateFile: "build/templates/template-bot-resources.json" - - # Deploy bot - - task: AzureWebApp@1 - displayName: 'Deploy Azure Web App : ${{ bot.name }}-$(BUILD.BUILDID)' - inputs: - azureSubscription: "${{ parameters.azureSubscription }}" - appName: '${{ bot.name }}${{ parameters.resourceSuffix }}-$(BUILD.BUILDID)' - resourceGroupName: '${{ parameters.resourceGroup }}' - package: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' - deploymentMethod: runFromPackage - - # Create DirectLine Channel Hosts - - ${{ if eq(bot.type, 'Host') }}: - - template: ../common/createDirectLine.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml deleted file mode 100644 index 62bb916f5a..0000000000 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependenciesV3.yml +++ /dev/null @@ -1,44 +0,0 @@ -parameters: - - name: packages - displayName: Dependency Packages - type: object - - - name: project - displayName: Project - type: object - - - name: registry - displayName: Registry source - type: string - - - name: version - displayName: Version number - type: string - -steps: - - task: PowerShell@2 - displayName: 'Install dependencies' - inputs: - targetType: inline - workingDirectory: '$(System.DefaultWorkingDirectory)/${{ parameters.project.directory }}' - failOnStderr: true - script: | - $version = "" - $source = "" - - if (-not ([string]::IsNullOrEmpty("${{ parameters.version }}"))) { - $version = "-Version ""${{ parameters.version }}""" - } - - if (-not ([string]::IsNullOrEmpty("${{ parameters.registry }}"))) { - $source = "-Source ""${{ parameters.registry }}""" - } - - foreach ($package in "${{ parameters.packages }}".Split()) { - Invoke-Expression "nuget update ""./packages.config"" -Id $package $version $source" - } - - write-host "`nPackages:" - foreach ($package in "${{ parameters.packages }}".Split()) { - write-host " - $package " - } From d81eb0c2cef3a36d12b6db763442b419c9564ea8 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 13:08:39 -0700 Subject: [PATCH 24/44] remove typo --- .../generator/evaluateDependenciesVariables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml index 50d213b499..161b04723b 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml @@ -1,4 +1,4 @@ -lparameters: +parameters: - name: botType displayName: Bot type type: string From 92a0c220918d016da20a73739d51bf51af02a21a Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 13:40:41 -0700 Subject: [PATCH 25/44] pass bot and solutiondir to installdependencies instead of project --- .../deployBotResources/deployBotResources.yml | 2 +- .../deployBotResources/generator/deploy.yml | 27 +++++++++++-------- .../generator/installDependencies.yml | 18 ++++++++----- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index f6d3ed6d23..c7ac3c98b7 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -109,9 +109,9 @@ stages: appSecret: $(BFCFNEMPTYBOTDOTNETWEBAPPSECRET) project: generator: 'generators/generator-bot-empty' + integration: "webapp" netCoreVersion: "3.1.x" platform: "dotnet" - integration: "webapp" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} version: ${{ parameters.dependenciesVersionDotNetHosts }} diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index f73fa5134e..29f8eab819 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -58,32 +58,28 @@ stages: SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" displayName: "Deploy steps" steps: + # Create /bots directory - script: | mkdir bots displayName: 'Create bots directory' + # Install yarn workspace - script: | yarn --immutable - displayName: 'Install dependencies' + displayName: 'Install yarn' + # Install yo - script: | npm install -g yo displayName: 'Install yo' + # Generate Bot template - task: CmdLine@2 displayName: 'Install template' inputs: script: | yo ../${{ bot.project.generator }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SolutionDir)' - - # Perhaps debugging output for the workspace? - - script: | - cd .. - dir *.* /s - displayName: 'Dir workspace' - continueOnError: true - condition: succeededOrFailed() + workingDirectory: '$(SOLUTIONDIR)' # Delete Bot Resources - template: ../common/deleteResources.yml @@ -125,7 +121,8 @@ stages: # Install dependencies - template: installDependencies.yml parameters: - project: "${{ bot.project }}" + bot: "${{ bot }}" + solutiondir: "$(SOLUTIONDIR)" registry: "$(DEPENDENCIESSOURCE)" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: @@ -217,3 +214,11 @@ stages: botGroup: "${{ parameters.resourceGroup }}" botName: "${{ bot.name }}" resourceSuffix: "${{ parameters.resourceSuffix }}" + + # Perhaps debugging output for the workspace? + - script: | + cd .. + dir *.* /s + displayName: 'Dir workspace' + continueOnError: true + condition: succeededOrFailed() \ No newline at end of file diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index 4fc5ef882e..7d476626ff 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -1,26 +1,30 @@ parameters: + - name: bot + displayName: Bot + type: object + - name: packages displayName: Dependency Packages type: object - - name: project - displayName: Project - type: object - - name: registry displayName: Registry source type: string + - name: solutiondir + displayName: Solution directory + type: string + - name: version displayName: Version number type: string steps: - task: PowerShell@2 - displayName: 'Install dependencies for ${{ parameters.project.name }}' + displayName: 'Install dependencies for ${{ parameters.bot.name }}.csproj' inputs: targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.project.directory }}' + workingDirectory: '${{ parameters.solutiondir }}/${{ parameters.bot.name}} }}' failOnStderr: true script: | $version = "" @@ -46,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.project.name }}"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.bot.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux From 6c1eb90ebaf307c8bb38f642d9efb99f69fefed8 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 14:05:13 -0700 Subject: [PATCH 26/44] change working directory in installdependencies --- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index 7d476626ff..d238e3797c 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -24,7 +24,7 @@ steps: displayName: 'Install dependencies for ${{ parameters.bot.name }}.csproj' inputs: targetType: inline - workingDirectory: '${{ parameters.solutiondir }}/${{ parameters.bot.name}} }}' + workingDirectory: '${{ parameters.solutiondir }}' failOnStderr: true script: | $version = "" From aa6fe55534085eabcc9df932f357f0346e62921c Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 14:27:51 -0700 Subject: [PATCH 27/44] change dir reference in installdependencies --- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index d238e3797c..acbf8fcaf1 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -50,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.bot.name }}.csproj"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.bot.name }}/${{ parameters.bot.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux From e2ec5ccf45e3a1294a00b1bed2728012434541c0 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 16:26:58 -0700 Subject: [PATCH 28/44] add bot.project.name parameter --- .../build/yaml/deployBotResources/deployBotResources.yml | 1 + .../build/yaml/deployBotResources/generator/deploy.yml | 2 +- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index c7ac3c98b7..d142f3ece7 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -111,6 +111,7 @@ stages: generator: 'generators/generator-bot-empty' integration: "webapp" netCoreVersion: "3.1.x" + name: "EmptyBotDotNetWebApp" platform: "dotnet" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 29f8eab819..4f282f315b 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -78,7 +78,7 @@ stages: displayName: 'Install template' inputs: script: | - yo ../${{ bot.project.generator }} ${{ bot.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} + yo ../${{ bot.project.generator }} ${{ bot.project.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} workingDirectory: '$(SOLUTIONDIR)' # Delete Bot Resources diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index acbf8fcaf1..a00b193830 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -50,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.bot.name }}/${{ parameters.bot.name }}.csproj"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.bot.project.name }}/${{ parameters.bot.project.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux From 4adcf37f057525daf72b13651b32905da81deffb Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 16:56:51 -0700 Subject: [PATCH 29/44] Look for adaptive runtime package to get version --- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index a00b193830..bb0eab8ddb 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -39,7 +39,7 @@ steps: } foreach ($package in "${{ parameters.packages }}".Split()) { - if ($package -eq "Microsoft.Bot.Builder.Dialogs.Debugging") { + if ($package -eq "Microsoft.Bot.Builder.Integration.Runtime") { $versionAux = $version if ($version -Match "rc") { $version = "$version.preview" From 419a5a3bd4fded7107dab85a143d043746e90b64 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 17:08:29 -0700 Subject: [PATCH 30/44] update evaluate dependency package to Microsoft.Bot.Builder.Integration.Runtime --- .../generator/evaluateDependenciesVariables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml index 161b04723b..86dec7d955 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml @@ -51,7 +51,7 @@ steps: exit 1 # Force exit } if ("${{ parameters.botType }}" -in "Host", "Skill") { - $PackageList = nuget list Microsoft.Bot.Builder.Integration.AspNet.Core -Source "$source" -PreRelease + $PackageList = nuget list Microsoft.Bot.Builder.Integration.Runtime -Source "$source" -PreRelease $versionNumber = $PackageList.Split(" ")[-1] } elseif ("${{ parameters.botType }}" -in "SkillV3") { $versionNumber = "" From 72000e3067c54aab1f881f9b594831e7f2e7f4a0 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 19:30:24 -0700 Subject: [PATCH 31/44] Use Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime instead of Integration namespace --- .../build/yaml/deployBotResources/generator/deploy.yml | 2 +- .../generator/evaluateDependenciesVariables.yml | 2 +- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 4f282f315b..dbc2b7393e 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -126,7 +126,7 @@ stages: registry: "$(DEPENDENCIESSOURCE)" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: - Microsoft.Bot.Builder.Integration.Runtime + Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime # Build Bot - task: DotNetCoreCLI@2 diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml index 86dec7d955..f2e44169c4 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml @@ -51,7 +51,7 @@ steps: exit 1 # Force exit } if ("${{ parameters.botType }}" -in "Host", "Skill") { - $PackageList = nuget list Microsoft.Bot.Builder.Integration.Runtime -Source "$source" -PreRelease + $PackageList = nuget list Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime -Source "$source" -PreRelease $versionNumber = $PackageList.Split(" ")[-1] } elseif ("${{ parameters.botType }}" -in "SkillV3") { $versionNumber = "" diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index bb0eab8ddb..3238e76caf 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -39,7 +39,7 @@ steps: } foreach ($package in "${{ parameters.packages }}".Split()) { - if ($package -eq "Microsoft.Bot.Builder.Integration.Runtime") { + if ($package -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime") { $versionAux = $version if ($version -Match "rc") { $version = "$version.preview" From 9b5f27dd4179a8d072d915048e902c735bea1ebc Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 19:59:06 -0700 Subject: [PATCH 32/44] reference all nuget packages generated from template --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 +++- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index dbc2b7393e..fab9051198 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -126,7 +126,9 @@ stages: registry: "$(DEPENDENCIESSOURCE)" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: - Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime + Microsoft.Bot.Builder.AI.Luis + Microsoft.Bot.Builder.AI.QnA + Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime # Build Bot - task: DotNetCoreCLI@2 diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index 3238e76caf..a00b193830 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -39,7 +39,7 @@ steps: } foreach ($package in "${{ parameters.packages }}".Split()) { - if ($package -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime") { + if ($package -eq "Microsoft.Bot.Builder.Dialogs.Debugging") { $versionAux = $version if ($version -Match "rc") { $version = "$version.preview" From 4017189593c9ae0446a63b02302f1e82ccaabe8a Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 20:24:49 -0700 Subject: [PATCH 33/44] use bots directory --- .../build/yaml/deployBotResources/generator/deploy.yml | 8 ++++---- .../deployBotResources/generator/installDependencies.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index fab9051198..dfc5787c70 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -136,7 +136,7 @@ stages: inputs: command: publish publishWebProjects: false - projects: "${{ bot.project.directory }}/${{ bot.project.name }}" + projects: "$(SOLUTIONDIR)/${{ bot.project.name }}/${{ bot.project.name }}.csproj" arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" modifyOutputPath: false @@ -145,11 +145,11 @@ stages: displayName: 'Get BotBuilder Version' inputs: targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + workingDirectory: '$(SOLUTIONDIR)/${{ bot.project.name }}' failOnStderr: true script: | - [XML]$data = Get-Content "./${{ bot.project.name }}" - $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Integration.AspNet.Core" } + [XML]$data = Get-Content "./${{ bot.project.name }}.csproj" + $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" # End of DotNet Install & Build diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index a00b193830..592a5a3e2a 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -21,7 +21,7 @@ parameters: steps: - task: PowerShell@2 - displayName: 'Install dependencies for ${{ parameters.bot.name }}.csproj' + displayName: 'Install dependencies for ${{ parameters.bot.project.name }}' inputs: targetType: inline workingDirectory: '${{ parameters.solutiondir }}' From 673062790a5d51dc8d35222310f29419873da3ca Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 21:01:32 -0700 Subject: [PATCH 34/44] use bot project parameter --- .../yaml/deployBotResources/generator/deploy.yml | 4 ++-- .../generator/installDependencies.yml | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index dfc5787c70..8465621a22 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -121,9 +121,9 @@ stages: # Install dependencies - template: installDependencies.yml parameters: - bot: "${{ bot }}" - solutiondir: "$(SOLUTIONDIR)" + project: "${{ bot.project }}" registry: "$(DEPENDENCIESSOURCE)" + solutiondir: "$(SOLUTIONDIR)" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: Microsoft.Bot.Builder.AI.Luis diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index 592a5a3e2a..7f88fdf648 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -1,12 +1,12 @@ -parameters: - - name: bot - displayName: Bot - type: object - +parameters: - name: packages displayName: Dependency Packages type: object + - name: project + displayName: Project + type: object + - name: registry displayName: Registry source type: string @@ -21,7 +21,7 @@ parameters: steps: - task: PowerShell@2 - displayName: 'Install dependencies for ${{ parameters.bot.project.name }}' + displayName: 'Install dependencies for ${{ parameters.project.name }}' inputs: targetType: inline workingDirectory: '${{ parameters.solutiondir }}' @@ -50,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.bot.project.name }}/${{ parameters.bot.project.name }}.csproj"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.project.name }}/${{ parameters.project.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux From fe0ac6305557a2628b92e88e7fff22047ba74a48 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 21:20:38 -0700 Subject: [PATCH 35/44] add bot name to solutiondir --- .../build/yaml/deployBotResources/generator/deploy.yml | 2 +- .../yaml/deployBotResources/generator/installDependencies.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 8465621a22..433b5fa66a 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -123,7 +123,7 @@ stages: parameters: project: "${{ bot.project }}" registry: "$(DEPENDENCIESSOURCE)" - solutiondir: "$(SOLUTIONDIR)" + solutiondir: "$(SOLUTIONDIR)/${{ bot.project.name }}" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: Microsoft.Bot.Builder.AI.Luis diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml index 7f88fdf648..76c859d3ee 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml @@ -50,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.project.name }}/${{ parameters.project.name }}.csproj"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.project.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux From acf4637abf788852d367d97fcad7edcb3b76e1c1 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 21:21:35 -0700 Subject: [PATCH 36/44] add functions to generator template --- .../deployBotResources/deployBotResources.yml | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index d142f3ece7..18d58b776d 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -116,32 +116,21 @@ stages: dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} version: ${{ parameters.dependenciesVersionDotNetHosts }} - - - template: dotnet/deploy.yml - parameters: - appInsight: "$(INTERNALAPPINSIGHTSNAME)" - appServicePlan: "$(INTERNALAPPSERVICEPLANDOTNETNAME)" - appServicePlanRG: "$(INTERNALAPPSERVICEPLANWINDOWSRESOURCEGROUP)" - azureSubscription: "$(AZURESUBSCRIPTION)" - botPricingTier: $env:BOTPRICINGTIER - connectionName: $env:CONNECTIONNAME - keyVault: "$(INTERNALKEYVAULTNAME)" - resourceGroup: "$(INTERNALRESOURCEGROUPNAME)-DotNet" - resourceSuffix: $(INTERNALRESOURCESUFFIX) - bots: - name: "bfcfnemptybotdotnetfunctions" dependsOn: "Prepare_DotNetGroup" type: "Host" - displayName: "DotNet Functions Empty Bot" - appId: $(BFCFNEMPTYBOTDOTNETFUNCTIONSID) - appSecret: $(BFCFNEMPTYBOTDOTNETFUNCTIONSSECRET) + displayName: "DotNet Web App Empty Bot" + appId: $(BFCFNEMPTYBOTDOTNETWEBAPPID) + appSecret: $(BFCFNEMPTYBOTDOTNETWEBAPPSECRET) project: - directory: 'Tests/Functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot' - name: "SimpleHostBot.csproj" + generator: 'generators/generator-bot-empty' + integration: "functions" netCoreVersion: "3.1.x" + name: "EmptyBotDotNetFunctions" + platform: "dotnet" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} - version: ${{ parameters.dependenciesVersionDotNetHosts }} + version: ${{ parameters.dependenciesVersionDotNetHosts }} # JS - template: js/deploy.yml From 747a3f2f80f99eedc0893e07f41fc09a0d3ccba9 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Tue, 15 Jun 2021 21:35:45 -0700 Subject: [PATCH 37/44] fix functions typo --- .../build/yaml/deployBotResources/deployBotResources.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index 18d58b776d..119bc8cbcb 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -119,9 +119,9 @@ stages: - name: "bfcfnemptybotdotnetfunctions" dependsOn: "Prepare_DotNetGroup" type: "Host" - displayName: "DotNet Web App Empty Bot" - appId: $(BFCFNEMPTYBOTDOTNETWEBAPPID) - appSecret: $(BFCFNEMPTYBOTDOTNETWEBAPPSECRET) + displayName: "DotNet Functions Empty Bot" + appId: $(BFCFNEMPTYBOTDOTNETFUNCTIONSID) + appSecret: $(BFCFNEMPTYBOTDOTNETFUNCTIONSSECRET) project: generator: 'generators/generator-bot-empty' integration: "functions" From 7ec45d0922e98acae50692d9e78f6109cfe92ee6 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 12:18:36 -0700 Subject: [PATCH 38/44] Remove the dotnet test bots --- .../AdapterWithErrorHandler.cs | 155 - .../AllowedSkillsClaimsValidator.cs | 55 - .../SimpleHostBot-2.1/Bots/HostBot.cs | 241 - .../Controllers/BotController.cs | 42 - .../Controllers/SkillController.cs | 28 - .../SimpleHostBot-2.1/Dialogs/SetupDialog.cs | 119 - .../CodeFirst/SimpleHostBot-2.1/Program.cs | 29 - .../Properties/launchSettings.json | 28 - .../SimpleHostBot-2.1.csproj | 26 - .../SimpleHostBot-2.1/SkillsConfiguration.cs | 51 - .../CodeFirst/SimpleHostBot-2.1/Startup.cs | 99 - .../SimpleHostBot-2.1/appsettings.json | 43 - .../SimpleHostBot-2.1/wwwroot/default.htm | 420 - .../SimpleHostBot/AdapterWithErrorHandler.cs | 155 - .../AllowedSkillsClaimsValidator.cs | 55 - .../CodeFirst/SimpleHostBot/Bots/HostBot.cs | 242 - .../Controllers/BotController.cs | 42 - .../Controllers/SkillController.cs | 28 - .../SimpleHostBot/Dialogs/SetupDialog.cs | 119 - .../CodeFirst/SimpleHostBot/Program.cs | 32 - .../Properties/launchSettings.json | 28 - .../SimpleHostBot/SimpleHostBot.csproj | 29 - .../SimpleHostBot/SkillsConfiguration.cs | 55 - .../CodeFirst/SimpleHostBot/Startup.cs | 99 - .../CodeFirst/SimpleHostBot/appsettings.json | 43 - .../SimpleHostBot/wwwroot/default.htm | 420 - .../AdapterWithErrorHandler.cs | 124 - .../AllowedSkillsClaimsValidator.cs | 47 - .../WaterfallHostBot/Bots/RootBot.cs | 80 - .../WaterfallHostBot/Cards/welcomeCard.json | 29 - .../Controllers/BotController.cs | 48 - .../Controllers/SkillController.cs | 83 - .../WaterfallHostBot/Dialogs/MainDialog.cs | 345 - .../WaterfallHostBot/Dialogs/Sso/SsoDialog.cs | 141 - .../Dialogs/Sso/SsoSignInDialog.cs | 48 - .../WaterfallHostBot/Dialogs/TangentDialog.cs | 51 - .../Middleware/LoggerMiddleware.cs | 55 - .../CodeFirst/WaterfallHostBot/Program.cs | 23 - .../Properties/launchSettings.json | 28 - .../WaterfallHostBot/Skills/EchoSkill.cs | 37 - .../Skills/SkillDefinition.cs | 33 - .../WaterfallHostBot/Skills/TeamsSkill.cs | 45 - .../WaterfallHostBot/Skills/WaterfallSkill.cs | 42 - .../WaterfallHostBot/SkillsConfiguration.cs | 68 - .../CodeFirst/WaterfallHostBot/Startup.cs | 98 - .../TeamsAppManifest/icon-color.png | Bin 1229 -> 0 bytes .../TeamsAppManifest/icon-outline.png | Bin 383 -> 0 bytes .../TeamsAppManifest/manifest.json | 50 - .../TokenExchangeSkillHandler.cs | 178 - .../WaterfallHostBot/WaterfallHostBot.csproj | 24 - .../WaterfallHostBot/appsettings.json | 90 - .../WaterfallHostBot/wwwroot/default.htm | 420 - .../Consumers/Composer/Directory.Build.props | 15 - .../Composer/SimpleHostBotComposer/.gitignore | 5 - .../Controllers/BotController.cs | 76 - .../Controllers/SkillController.cs | 62 - .../Composer/SimpleHostBotComposer/Program.cs | 33 - .../Properties/launchSettings.json | 27 - .../Composer/SimpleHostBotComposer/README.md | 27 - .../SimpleHostBotComposer.botproj | 41 - .../SimpleHostBotComposer.csproj | 19 - .../Composer/SimpleHostBotComposer/Startup.cs | 56 - .../CallEchoSkill/CallEchoSkill.dialog | 244 - .../en-us/CallEchoSkill.en-us.qna | 0 .../en-us/CallEchoSkill.en-us.lg | 56 - .../en-us/CallEchoSkill.en-us.lu | 0 .../recognizers/CallEchoSkill.en-us.lu.dialog | 8 - .../recognizers/CallEchoSkill.lu.dialog | 5 - .../recognizers/CallEchoSkill.lu.qna.dialog | 4 - .../knowledge-base/en-us/emptyBot.en-us.qna | 0 .../interruption/CallEchoSkill.en-us.lu | 0 .../interruption/CallEchoSkill.en-us.qna | 0 .../SimpleHostBotComposer.en-us.lu | 0 .../SimpleHostBotComposer.en-us.qna | 0 .../en-us/simplehostbotcomposer.en-us.qna | 0 .../language-generation/en-us/common.en-us.lg | 0 .../en-us/simplehostbotcomposer.en-us.lg | 26 - .../en-us/simplehostbotcomposer.en-us.lu | 0 .../create-azure-resource-command-line.png | Bin 13842 -> 0 bytes .../media/publish-az-login.png | Bin 16726 -> 0 bytes .../SimpleHostBotComposer.en-us.lu.dialog | 8 - .../SimpleHostBotComposer.lu.dialog | 5 - .../SimpleHostBotComposer.lu.qna.dialog | 4 - .../SimpleHostBotComposer/schemas/sdk.schema | 10312 ---------------- .../schemas/sdk.uischema | 1409 --- .../schemas/update-schema.ps1 | 27 - .../schemas/update-schema.sh | 31 - .../settings/appsettings.json | 109 - .../simplehostbotcomposer.dialog | 104 - .../SimpleHostBotComposer/wwwroot/default.htm | 364 - .../Bots/DotNet/FunctionalTestsBots.sln | 106 - .../AllowedCallersClaimsValidator.cs | 70 - .../EchoSkillBot-2.1/Bots/EchoBot.cs | 50 - .../Controllers/BotController.cs | 43 - .../EchoSkillBot-2.1/EchoSkillBot-2.1.csproj | 25 - .../CodeFirst/EchoSkillBot-2.1/Program.cs | 29 - .../Properties/launchSettings.json | 28 - .../SkillAdapterWithErrorHandler.cs | 63 - .../CodeFirst/EchoSkillBot-2.1/Startup.cs | 76 - .../EchoSkillBot-2.1/appsettings.json | 11 - .../EchoSkillBot-2.1/wwwroot/default.htm | 420 - .../manifests/echoskillbot-manifest-1.0.json | 23 - ...ControllerActionInvokerWithErrorHandler.cs | 41 - .../EchoSkillBot-v3/App_Start/WebApiConfig.cs | 39 - .../CustomAllowedCallersClaimsValidator.cs | 72 - .../CustomSkillAuthenticationConfiguration.cs | 20 - .../Controllers/MessagesController.cs | 93 - .../EchoSkillBot-v3/Dialogs/RootDialog.cs | 88 - .../EchoSkillBot-v3/EchoSkillBot-v3.csproj | 232 - .../CodeFirst/EchoSkillBot-v3/Global.asax | 1 - .../CodeFirst/EchoSkillBot-v3/Global.asax.cs | 42 - .../Properties/AssemblyInfo.cs | 35 - .../EchoSkillBot-v3/Web.Debug.config | 30 - .../EchoSkillBot-v3/Web.Release.config | 31 - .../CodeFirst/EchoSkillBot-v3/Web.config | 57 - .../CodeFirst/EchoSkillBot-v3/default.htm | 12 - .../echoskillbotv3-manifest-1.0.json | 30 - .../CodeFirst/EchoSkillBot-v3/packages.config | 37 - .../AllowedCallersClaimsValidator.cs | 70 - .../CodeFirst/EchoSkillBot/Bots/EchoBot.cs | 50 - .../EchoSkillBot/Controllers/BotController.cs | 43 - .../EchoSkillBot/EchoSkillBot.csproj | 25 - .../Skills/CodeFirst/EchoSkillBot/Program.cs | 32 - .../Properties/launchSettings.json | 28 - .../SkillAdapterWithErrorHandler.cs | 62 - .../Skills/CodeFirst/EchoSkillBot/Startup.cs | 75 - .../CodeFirst/EchoSkillBot/appsettings.json | 11 - .../EchoSkillBot/wwwroot/default.htm | 420 - .../manifests/echoskillbot-manifest-1.0.json | 23 - .../AllowedCallersClaimsValidator.cs | 60 - .../WaterfallSkillBot/Bots/SkillBot.cs | 61 - .../Controllers/BotController.cs | 48 - .../Controllers/CardsController.cs | 28 - .../Controllers/ProactiveController.cs | 86 - .../Controllers/SkillController.cs | 53 - .../Dialogs/ActivityRouterDialog.cs | 148 - .../Dialogs/Auth/AuthDialog.cs | 83 - .../Dialogs/Cards/AdaptiveCardExtensions.cs | 75 - .../Dialogs/Cards/CardDialog.cs | 340 - .../Dialogs/Cards/CardOptions.cs | 88 - .../Dialogs/Cards/CardSampleHelper.cs | 508 - .../Dialogs/Cards/ChannelSupportedCards.cs | 57 - .../Cards/Files/buildreactionbotframework.jpg | Bin 65992 -> 0 bytes .../Dialogs/Cards/Files/music.mp3 | Bin 647055 -> 0 bytes .../Dialogs/Cards/Files/teams-logo.png | Bin 6412 -> 0 bytes .../Dialogs/Cards/SampleData.cs | 23 - .../Dialogs/Delete/DeleteDialog.cs | 46 - .../Dialogs/FileUpload/FileUploadDialog.cs | 83 - .../MessageWithAttachmentDialog.cs | 118 - .../Proactive/ContinuationParameters.cs | 20 - .../Proactive/WaitForProactiveDialog.cs | 76 - .../Dialogs/Sso/SsoSkillDialog.cs | 119 - .../Dialogs/Sso/SsoSkillSignInDialog.cs | 47 - .../Dialogs/Update/UpdateDialog.cs | 85 - .../Middleware/SsoSaveStateMiddleware.cs | 55 - .../CodeFirst/WaterfallSkillBot/Program.cs | 23 - .../Properties/launchSettings.json | 28 - .../SkillAdapterWithErrorHandler.cs | 100 - .../CodeFirst/WaterfallSkillBot/Startup.cs | 103 - .../WaterfallSkillBot.csproj | 46 - .../WaterfallSkillBot/appsettings.json | 20 - .../WaterfallSkillBot/wwwroot/default.htm | 420 - .../wwwroot/images/architecture-resize.png | Bin 137666 -> 0 bytes .../waterfallskillbot-manifest-1.0.json | 105 - .../Skills/Composer/Directory.Build.props | 15 - .../Composer/EchoSkillBotComposer/.gitignore | 5 - .../Controllers/BotController.cs | 76 - .../Controllers/SkillController.cs | 62 - .../EchoSkillBotComposer.botproj | 5 - .../EchoSkillBotComposer.csproj | 19 - .../Composer/EchoSkillBotComposer/Program.cs | 33 - .../Properties/launchSettings.json | 27 - .../Composer/EchoSkillBotComposer/README.md | 27 - .../Composer/EchoSkillBotComposer/Startup.cs | 56 - .../knowledge-base/en-us/emptyBot.en-us.qna | 0 .../echoskillbotcomposer.dialog | 115 - .../EchoSkillBotComposer.en-us.lu | 0 .../EchoSkillBotComposer.en-us.qna | 0 .../en-us/echoskillbotcomposer.en-us.qna | 0 .../language-generation/en-us/common.en-us.lg | 0 .../en-us/echoskillbotcomposer.en-us.lg | 31 - .../en-us/echoskillbotcomposer.en-us.lu | 0 .../echoskillbotcomposer-manifest.json | 23 - .../create-azure-resource-command-line.png | Bin 13842 -> 0 bytes .../media/publish-az-login.png | Bin 16726 -> 0 bytes .../EchoSkillBotComposer/schemas/sdk.schema | 10312 ---------------- .../EchoSkillBotComposer/schemas/sdk.uischema | 1409 --- .../schemas/update-schema.ps1 | 27 - .../schemas/update-schema.sh | 31 - .../settings/appsettings.json | 76 - .../EchoSkillBotComposer/wwwroot/default.htm | 364 - .../echoskillbotcomposer-manifest.json | 23 - 192 files changed, 36478 deletions(-) delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/AdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Authentication/AllowedSkillsClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Bots/HostBot.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Dialogs/SetupDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SimpleHostBot-2.1.csproj delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SkillsConfiguration.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/AdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Authentication/AllowedSkillsClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Bots/HostBot.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Dialogs/SetupDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SimpleHostBot.csproj delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SkillsConfiguration.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/AdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Authentication/AllowedSkillsClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Bots/RootBot.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Cards/welcomeCard.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/MainDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoSignInDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/TangentDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Middleware/LoggerMiddleware.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/EchoSkill.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/SkillDefinition.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/TeamsSkill.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/WaterfallSkill.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/SkillsConfiguration.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TeamsAppManifest/icon-color.png delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TeamsAppManifest/icon-outline.png delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TeamsAppManifest/manifest.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TokenExchangeSkillHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/WaterfallHostBot.csproj delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/Directory.Build.props delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/.gitignore delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/README.md delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.botproj delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.csproj delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/CallEchoSkill.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/knowledge-base/en-us/CallEchoSkill.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-generation/en-us/CallEchoSkill.en-us.lg delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-understanding/en-us/CallEchoSkill.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.en-us.lu.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.qna.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/knowledge-base/en-us/simplehostbotcomposer.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/common.en-us.lg delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/simplehostbotcomposer.en-us.lg delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-understanding/en-us/simplehostbotcomposer.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/create-azure-resource-command-line.png delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/publish-az-login.png delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/recognizers/SimpleHostBotComposer.en-us.lu.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/recognizers/SimpleHostBotComposer.lu.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/recognizers/SimpleHostBotComposer.lu.qna.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/sdk.schema delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/sdk.uischema delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.ps1 delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.sh delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/settings/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/simplehostbotcomposer.dialog delete mode 100644 tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/FunctionalTestsBots.sln delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Authentication/AllowedCallersClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Bots/EchoBot.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/EchoSkillBot-2.1.csproj delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/SkillAdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/manifests/echoskillbot-manifest-1.0.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/ApiControllerActionInvokerWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/App_Start/WebApiConfig.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomAllowedCallersClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomSkillAuthenticationConfiguration.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Controllers/MessagesController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Dialogs/RootDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/EchoSkillBot-v3.csproj delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Properties/AssemblyInfo.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Debug.config delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Release.config delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.config delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/default.htm delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/manifests/echoskillbotv3-manifest-1.0.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/packages.config delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Authentication/AllowedCallersClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Bots/EchoBot.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/EchoSkillBot.csproj delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/SkillAdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/manifests/echoskillbot-manifest-1.0.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Authentication/AllowedCallersClaimsValidator.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Bots/SkillBot.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/CardsController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/ProactiveController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/ActivityRouterDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Auth/AuthDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/AdaptiveCardExtensions.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardOptions.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardSampleHelper.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/ChannelSupportedCards.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/buildreactionbotframework.jpg delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/music.mp3 delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/teams-logo.png delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/SampleData.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Delete/DeleteDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/FileUpload/FileUploadDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/MessageWithAttachment/MessageWithAttachmentDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/ContinuationParameters.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/WaitForProactiveDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillSignInDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Update/UpdateDialog.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Middleware/SsoSaveStateMiddleware.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/SkillAdapterWithErrorHandler.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/WaterfallSkillBot.csproj delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/images/architecture-resize.png delete mode 100644 tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/manifests/waterfallskillbot-manifest-1.0.json delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/Directory.Build.props delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/.gitignore delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/BotController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/SkillController.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.botproj delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.csproj delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Program.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Properties/launchSettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/README.md delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Startup.cs delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/echoskillbotcomposer.dialog delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/knowledge-base/en-us/echoskillbotcomposer.en-us.qna delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/common.en-us.lg delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/echoskillbotcomposer.en-us.lg delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-understanding/en-us/echoskillbotcomposer.en-us.lu delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/manifests/echoskillbotcomposer-manifest.json delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/create-azure-resource-command-line.png delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/publish-az-login.png delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/sdk.schema delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/sdk.uischema delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.ps1 delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.sh delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/settings/appsettings.json delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/default.htm delete mode 100644 tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/manifests/echoskillbotcomposer-manifest.json diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/AdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/AdapterWithErrorHandler.cs deleted file mode 100644 index 091f3062ab..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/AdapterWithErrorHandler.cs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Bots; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 -{ - public class AdapterWithErrorHandler : BotFrameworkHttpAdapter - { - private readonly ConversationState _conversationState; - private readonly IConfiguration _configuration; - private readonly ILogger _logger; - private readonly SkillHttpClient _skillClient; - private readonly SkillsConfiguration _skillsConfig; - - /// - /// Initializes a new instance of the class to handle errors. - /// - /// The configuration properties. - /// An instance of a logger. - /// A state management object for the conversation. - /// The HTTP client for the skills. - /// The skills configuration. - public AdapterWithErrorHandler(IConfiguration configuration, ILogger logger, ConversationState conversationState = null, SkillHttpClient skillClient = null, SkillsConfiguration skillsConfig = null) - : base(configuration, logger) - { - _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - _conversationState = conversationState; - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _skillClient = skillClient; - _skillsConfig = skillsConfig; - - OnTurnError = HandleTurnErrorAsync; - } - - /// - /// Handles the error by sending a message to the user and ending the conversation with the skill. - /// - /// Context for the current turn of conversation. - /// The handled exception. - /// A representing the result of the asynchronous operation. - private async Task HandleTurnErrorAsync(ITurnContext turnContext, Exception exception) - { - // Log any leaked exception from the application. - _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - await SendErrorMessageAsync(turnContext, exception, default); - await EndSkillConversationAsync(turnContext, default); - await ClearConversationStateAsync(turnContext, default); - } - - /// - /// Sends an error message to the user and a trace activity to be displayed in the Bot Framework Emulator. - /// - /// Context for the current turn of conversation. - /// The exception to be sent in the message. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception, CancellationToken cancellationToken) - { - try - { - // Send a message to the user - var errorMessageText = "The bot encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage, cancellationToken); - - await turnContext.SendActivityAsync($"Exception: {exception.Message}"); - await turnContext.SendActivityAsync(exception.ToString()); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage, cancellationToken); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError", cancellationToken); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught in SendErrorMessageAsync : {ex}"); - } - } - - /// - /// Informs to the active skill that the conversation is ended so that it has a chance to clean up. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task EndSkillConversationAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_conversationState == null || _skillClient == null || _skillsConfig == null) - { - return; - } - - try - { - // Note: ActiveSkillPropertyName is set by the HostBot while messages are being - // forwarded to a Skill. - var activeSkill = await _conversationState.CreateProperty(HostBot.ActiveSkillPropertyName).GetAsync(turnContext, () => null, cancellationToken); - if (activeSkill != null) - { - var botId = _configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "HostSkillError"; - endOfConversation.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true); - - await _conversationState.SaveChangesAsync(turnContext, true, cancellationToken); - await _skillClient.PostActivityAsync(botId, activeSkill, _skillsConfig.SkillHostEndpoint, (Activity)endOfConversation, cancellationToken); - } - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to send EndOfConversation : {ex}"); - } - } - - /// - /// Deletes the conversationState for the current conversation to prevent the bot from getting stuck in an error-loop caused by being in a bad state. - /// ConversationState should be thought of as similar to "cookie-state" in a Web pages. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task ClearConversationStateAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_conversationState != null) - { - try - { - await _conversationState.DeleteAsync(turnContext, cancellationToken); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to Delete ConversationState : {ex}"); - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Authentication/AllowedSkillsClaimsValidator.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Authentication/AllowedSkillsClaimsValidator.cs deleted file mode 100644 index 31ec04cb31..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Authentication/AllowedSkillsClaimsValidator.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that responses are coming from configured skills. - /// - public class AllowedSkillsClaimsValidator : ClaimsValidator - { - private readonly List _allowedSkills; - - /// - /// Initializes a new instance of the class. - /// Loads the appIds for the configured skills. Only allows responses from skills it has configured. - /// - /// The list of configured skills. - public AllowedSkillsClaimsValidator(SkillsConfiguration skillsConfig) - { - if (skillsConfig == null) - { - throw new ArgumentNullException(nameof(skillsConfig)); - } - - _allowedSkills = (from skill in skillsConfig.Skills.Values select skill.AppId).ToList(); - } - - /// - /// Checks that the appId claim in the skill request is in the list of skills configured for this bot. - /// - /// The list of claims to validate. - /// A task that represents the work queued to execute. - public override Task ValidateClaimsAsync(IList claims) - { - if (SkillValidation.IsSkillClaim(claims)) - { - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedSkills.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from an application with an appID of \"{appId}\". To enable requests from this skill, add the skill to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Bots/HostBot.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Bots/HostBot.cs deleted file mode 100644 index 79d4c150a7..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Bots/HostBot.cs +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Dialogs; -using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Bots -{ - public class HostBot : ActivityHandler - { - public const string DeliveryModePropertyName = "deliveryModeProperty"; - public const string ActiveSkillPropertyName = "activeSkillProperty"; - - private readonly IStatePropertyAccessor _deliveryModeProperty; - private readonly IStatePropertyAccessor _activeSkillProperty; - private readonly IStatePropertyAccessor _dialogStateProperty; - private readonly string _botId; - private readonly ConversationState _conversationState; - private readonly SkillHttpClient _skillClient; - private readonly SkillsConfiguration _skillsConfig; - private readonly Dialog _dialog; - - /// - /// Initializes a new instance of the class. - /// - /// A state management object for the conversation. - /// The skills configuration. - /// The HTTP client for the skills. - /// The configuration properties. - /// The dialog to use. - public HostBot(ConversationState conversationState, SkillsConfiguration skillsConfig, SkillHttpClient skillClient, IConfiguration configuration, SetupDialog dialog) - { - _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState)); - _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig)); - _skillClient = skillClient ?? throw new ArgumentNullException(nameof(skillClient)); - _dialog = dialog ?? throw new ArgumentNullException(nameof(dialog)); - _dialogStateProperty = _conversationState.CreateProperty("DialogState"); - if (configuration == null) - { - throw new ArgumentNullException(nameof(configuration)); - } - - _botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - // Create state properties to track the delivery mode and active skill. - _deliveryModeProperty = conversationState.CreateProperty(DeliveryModePropertyName); - _activeSkillProperty = conversationState.CreateProperty(ActiveSkillPropertyName); - } - - /// - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) - { - // Forward all activities except EndOfConversation to the active skill. - if (turnContext.Activity.Type != ActivityTypes.EndOfConversation) - { - // Try to get the active skill - var activeSkill = await _activeSkillProperty.GetAsync(turnContext, () => null, cancellationToken); - - if (activeSkill != null) - { - var deliveryMode = await _deliveryModeProperty.GetAsync(turnContext, () => null, cancellationToken); - - // Send the activity to the skill - await SendToSkillAsync(turnContext, deliveryMode, activeSkill, cancellationToken); - return; - } - } - - await base.OnTurnAsync(turnContext, cancellationToken); - - // Save any state changes that might have occurred during the turn. - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - /// - /// Processes a message activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_skillsConfig.Skills.ContainsKey(turnContext.Activity.Text)) - { - var deliveryMode = await _deliveryModeProperty.GetAsync(turnContext, () => null, cancellationToken); - var selectedSkill = _skillsConfig.Skills[turnContext.Activity.Text]; - var v3Bots = new List { "EchoSkillBotDotNetV3", "EchoSkillBotJSV3" }; - - if (selectedSkill != null && deliveryMode == DeliveryModes.ExpectReplies && v3Bots.Contains(selectedSkill.Id)) - { - var message = MessageFactory.Text("V3 Bots do not support 'expectReplies' delivery mode."); - await turnContext.SendActivityAsync(message, cancellationToken); - - // Forget delivery mode and skill invocation. - await _deliveryModeProperty.DeleteAsync(turnContext, cancellationToken); - await _activeSkillProperty.DeleteAsync(turnContext, cancellationToken); - - // Restart setup dialog - await _conversationState.DeleteAsync(turnContext, cancellationToken); - } - } - - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - } - - /// - /// Processes an end of conversation activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnEndOfConversationActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await EndConversation((Activity)turnContext.Activity, turnContext, cancellationToken); - } - - /// - /// Processes a member added event. - /// - /// The list of members added to the conversation. - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - if (member.Id != turnContext.Activity.Recipient.Id) - { - await turnContext.SendActivityAsync(MessageFactory.Text("Hello and welcome!"), cancellationToken); - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - } - } - } - - /// - /// Clears storage variables and sends the end of conversation activities. - /// - /// End of conversation activity. - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task EndConversation(Activity activity, ITurnContext turnContext, CancellationToken cancellationToken) - { - // Forget delivery mode and skill invocation. - await _deliveryModeProperty.DeleteAsync(turnContext, cancellationToken); - await _activeSkillProperty.DeleteAsync(turnContext, cancellationToken); - - // Show status message, text and value returned by the skill - var eocActivityMessage = $"Received {ActivityTypes.EndOfConversation}.\n\nCode: {activity.Code}."; - if (!string.IsNullOrWhiteSpace(activity.Text)) - { - eocActivityMessage += $"\n\nText: {activity.Text}"; - } - - if (activity.Value != null) - { - eocActivityMessage += $"\n\nValue: {JsonConvert.SerializeObject(activity.Value)}"; - } - - await turnContext.SendActivityAsync(MessageFactory.Text(eocActivityMessage), cancellationToken); - - // We are back at the host. - await turnContext.SendActivityAsync(MessageFactory.Text("Back in the host bot."), cancellationToken); - - // Restart setup dialog. - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - /// - /// Sends an activity to the skill bot. - /// - /// Context for the current turn of conversation. - /// The delivery mode to use when communicating to the skill. - /// The skill that will receive the activity. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task SendToSkillAsync(ITurnContext turnContext, string deliveryMode, BotFrameworkSkill targetSkill, CancellationToken cancellationToken) - { - // NOTE: Always SaveChanges() before calling a skill so that any activity generated by the skill - // will have access to current accurate state. - await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken); - - if (deliveryMode == DeliveryModes.ExpectReplies) - { - // Clone activity and update its delivery mode. - var activity = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(turnContext.Activity)); - activity.DeliveryMode = deliveryMode; - - // Route the activity to the skill. - var expectRepliesResponse = await _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, activity, cancellationToken); - - // Check response status. - if (!expectRepliesResponse.IsSuccessStatusCode()) - { - throw new HttpRequestException($"Error invoking the skill id: \"{targetSkill.Id}\" at \"{targetSkill.SkillEndpoint}\" (status is {expectRepliesResponse.Status}). \r\n {expectRepliesResponse.Body}"); - } - - // Route response activities back to the channel. - var responseActivities = expectRepliesResponse.Body?.Activities; - - foreach (var responseActivity in responseActivities) - { - if (responseActivity.Type == ActivityTypes.EndOfConversation) - { - await EndConversation(responseActivity, turnContext, cancellationToken); - } - else - { - await turnContext.SendActivityAsync(responseActivity, cancellationToken); - } - } - } - else - { - // Route the activity to the skill. - var response = await _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, (Activity)turnContext.Activity, cancellationToken); - - // Check response status - if (!response.IsSuccessStatusCode()) - { - throw new HttpRequestException($"Error invoking the skill id: \"{targetSkill.Id}\" at \"{targetSkill.SkillEndpoint}\" (status is {response.Status}). \r\n {response.Body}"); - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/BotController.cs deleted file mode 100644 index 9b199e8ac7..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/BotController.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Controllers -{ - /// - /// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot implementation at runtime. - /// - [Route("api/messages")] - [ApiController] - public class BotController : ControllerBase - { - private readonly BotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - - /// - /// Initializes a new instance of the class. - /// - /// Adapter for the BotController. - /// Bot for the BotController. - public BotController(BotFrameworkHttpAdapter adapter, IBot bot) - { - _adapter = adapter; - _bot = bot; - } - - /// - /// Processes an HttpPost request. - /// - /// A representing the result of the asynchronous operation. - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/SkillController.cs deleted file mode 100644 index 4b6a1c7736..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Controllers/SkillController.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Skills; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Controllers -{ - /// - /// A controller that handles skill replies to the bot. - /// This example uses the that is registered as a in startup.cs. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - /// - /// Initializes a new instance of the class. - /// - /// The skill handler registered as ChannelServiceHandler. - public SkillController(ChannelServiceHandler handler) - : base(handler) - { - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Dialogs/SetupDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Dialogs/SetupDialog.cs deleted file mode 100644 index 2ae8f6aea5..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Dialogs/SetupDialog.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Bots; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Dialogs -{ - /// - /// The setup dialog for this bot. - /// - public class SetupDialog : ComponentDialog - { - private readonly IStatePropertyAccessor _deliveryModeProperty; - private readonly IStatePropertyAccessor _activeSkillProperty; - private readonly SkillsConfiguration _skillsConfig; - private string _deliveryMode; - - public SetupDialog(ConversationState conversationState, SkillsConfiguration skillsConfig) - : base(nameof(SetupDialog)) - { - _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig)); - - _deliveryModeProperty = conversationState.CreateProperty(HostBot.DeliveryModePropertyName); - _activeSkillProperty = conversationState.CreateProperty(HostBot.ActiveSkillPropertyName); - - // Define the setup dialog and its related components. - // Add ChoicePrompt to render available skills. - AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); - - // Add main waterfall dialog for this bot. - var waterfallSteps = new WaterfallStep[] - { - SelectDeliveryModeStepAsync, - SelectSkillStepAsync, - FinalStepAsync - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - InitialDialogId = nameof(WaterfallDialog); - } - - // Render a prompt to select the delivery mode to use. - private async Task SelectDeliveryModeStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Create the PromptOptions with the delivery modes supported. - const string messageText = "What delivery mode would you like to use?"; - const string repromptMessageText = "That was not a valid choice, please select a valid delivery mode."; - var choices = new List(); - choices.Add(new Choice(DeliveryModes.Normal)); - choices.Add(new Choice(DeliveryModes.ExpectReplies)); - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = choices - }; - - // Prompt the user to select a delivery mode. - return await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); - } - - // Render a prompt to select the skill to call. - private async Task SelectSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Set delivery mode. - _deliveryMode = ((FoundChoice)stepContext.Result).Value; - await _deliveryModeProperty.SetAsync(stepContext.Context, ((FoundChoice)stepContext.Result).Value, cancellationToken); - - // Create the PromptOptions from the skill configuration which contains the list of configured skills. - const string messageText = "What skill would you like to call?"; - const string repromptMessageText = "That was not a valid choice, please select a valid skill."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = _skillsConfig.Skills.Select(skill => new Choice(skill.Key)).ToList(), - Style = ListStyle.SuggestedAction - }; - - // Prompt the user to select a skill. - return await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); - } - - // The SetupDialog has ended, we go back to the HostBot to connect with the selected skill. - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var selectedSkillKey = ((FoundChoice)stepContext.Result).Value; - var selectedSkill = _skillsConfig.Skills.FirstOrDefault(skill => skill.Key == selectedSkillKey); - - var v3Bots = new List { "EchoSkillBotDotNetV3", "EchoSkillBotJSV3" }; - - if (_deliveryMode == DeliveryModes.ExpectReplies && v3Bots.Contains(selectedSkillKey)) - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text("V3 Bots do not support 'expectReplies' delivery mode."), cancellationToken); - - // Restart setup dialog - return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken); - } - - // Set active skill - await _activeSkillProperty.SetAsync(stepContext.Context, selectedSkill.Value, cancellationToken); - - var message = MessageFactory.Text("Type anything to send to the skill.", "Type anything to send to the skill.", InputHints.ExpectingInput); - await stepContext.Context.SendActivityAsync(message, cancellationToken); - - return await stepContext.EndDialogAsync(stepContext.Values, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Program.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Program.cs deleted file mode 100644 index 992a1b61a9..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Program.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 -{ - public class Program - { - /// - /// The entry point of the application. - /// - /// The command line args. - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - /// - /// Creates a new instance of the class with pre-configured defaults. - /// - /// The command line args. - /// The initialized . - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Properties/launchSettings.json deleted file mode 100644 index cbde6fb474..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35005", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "SimpleHostBotDotNet21": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35005", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SimpleHostBot-2.1.csproj b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SimpleHostBot-2.1.csproj deleted file mode 100644 index c0924fb1cc..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SimpleHostBot-2.1.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - netcoreapp2.1 - latest - Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 - Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 - - - - DEBUG;TRACE - - - - - - - - - - - Always - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SkillsConfiguration.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SkillsConfiguration.cs deleted file mode 100644 index ee3ef40abb..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/SkillsConfiguration.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 -{ - /// - /// A helper class that loads Skills information from configuration. - /// - public class SkillsConfiguration - { - /// - /// Initializes a new instance of the class to load skills information from configuration. - /// - /// The configuration properties. - public SkillsConfiguration(IConfiguration configuration) - { - var section = configuration?.GetSection("BotFrameworkSkills"); - var skills = section?.Get(); - if (skills != null) - { - foreach (var skill in skills) - { - Skills.Add(skill.Id, skill); - } - } - - var skillHostEndpoint = configuration?.GetValue(nameof(SkillHostEndpoint)); - if (!string.IsNullOrWhiteSpace(skillHostEndpoint)) - { - SkillHostEndpoint = new Uri(skillHostEndpoint); - } - } - - /// - /// Gets the URI representing the endpoint of the host bot. - /// - /// The host bot endpoint URI. - public Uri SkillHostEndpoint { get; } - - /// - /// Gets the key-value pairs with the skills bots. - /// - /// The key-value pairs with the skills bots. - public Dictionary Skills { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Startup.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Startup.cs deleted file mode 100644 index afafc6d9b2..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/Startup.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Authentication; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Bots; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21.Dialogs; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot21 -{ - public class Startup - { - public Startup(IConfiguration config) - { - Configuration = config; - } - - public IConfiguration Configuration { get; } - - /// - /// This method gets called by the runtime. Use this method to add services to the container. - /// - /// The collection of services to add to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); - - // Configure credentials - services.AddSingleton(); - - // Register the skills configuration class - services.AddSingleton(); - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new AllowedSkillsClaimsValidator(sp.GetService()) }); - - // Register the Bot Framework Adapter with error handling enabled. - // Note: some classes use the base BotAdapter so we add an extra registration that pulls the same instance. - services.AddSingleton(); - services.AddSingleton(sp => sp.GetService()); - - // Register the skills client and skills request handler. - services.AddSingleton(); - services.AddHttpClient(); - services.AddSingleton(); - - // Register the storage we'll be using for User and Conversation state. (Memory is great for testing purposes.) - services.AddSingleton(); - - // Register Conversation state (used by the Dialog system itself). - services.AddSingleton(); - - // Create SetupDialog - services.AddSingleton(); - - // Register the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient(); - - if (!string.IsNullOrEmpty(Configuration["ChannelService"])) - { - // Register a ConfigurationChannelProvider -- this is only for Azure Gov. - services.AddSingleton(); - } - } - - /// - /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - /// - /// The application request pipeline to be configured. - /// The web hosting environment. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseHsts(); - } - - app.UseDefaultFiles(); - app.UseStaticFiles(); - - // app.UseHttpsRedirection(); - app.UseMvc(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/appsettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/appsettings.json deleted file mode 100644 index 65cb14456e..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/appsettings.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "ChannelService": "", - "SkillHostEndpoint": "http://localhost:35005/api/skills/", - "BotFrameworkSkills": [ - { - "Id": "EchoSkillBotComposerDotNet", - "AppId": "", - "SkillEndpoint": "http://localhost:35410/api/messages" - }, - { - "Id": "EchoSkillBotDotNet", - "AppId": "", - "SkillEndpoint": "http://localhost:35400/api/messages" - }, - { - "Id": "EchoSkillBotDotNet21", - "AppId": "", - "SkillEndpoint": "http://localhost:35405/api/messages" - }, - { - "Id": "EchoSkillBotDotNetV3", - "AppId": "", - "SkillEndpoint": "http://localhost:35407/api/messages" - }, - { - "Id": "EchoSkillBotJS", - "AppId": "", - "SkillEndpoint": "http://localhost:36400/api/messages" - }, - { - "Id": "EchoSkillBotJSV3", - "AppId": "", - "SkillEndpoint": "http://localhost:36407/api/messages" - }, - { - "Id": "EchoSkillBotPython", - "AppId": "", - "SkillEndpoint": "http://localhost:37400/api/messages" - } - ] -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/wwwroot/default.htm b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/wwwroot/default.htm deleted file mode 100644 index 39a369dfe8..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot-2.1/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - SimpleHostBot-2.1DotNet - - - - - -
-
-
-
SimpleRootBotDotNet21 Bot
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
- -
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/AdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/AdapterWithErrorHandler.cs deleted file mode 100644 index a358155fed..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/AdapterWithErrorHandler.cs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Bots; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot -{ - public class AdapterWithErrorHandler : BotFrameworkHttpAdapter - { - private readonly ConversationState _conversationState; - private readonly IConfiguration _configuration; - private readonly ILogger _logger; - private readonly SkillHttpClient _skillClient; - private readonly SkillsConfiguration _skillsConfig; - - /// - /// Initializes a new instance of the class to handle errors. - /// - /// The configuration properties. - /// An instance of a logger. - /// A state management object for the conversation. - /// The HTTP client for the skills. - /// The skills configuration. - public AdapterWithErrorHandler(IConfiguration configuration, ILogger logger, ConversationState conversationState = null, SkillHttpClient skillClient = null, SkillsConfiguration skillsConfig = null) - : base(configuration, logger) - { - _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - _conversationState = conversationState; - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _skillClient = skillClient; - _skillsConfig = skillsConfig; - - OnTurnError = HandleTurnErrorAsync; - } - - /// - /// Handles the error by sending a message to the user and ending the conversation with the skill. - /// - /// Context for the current turn of conversation. - /// The handled exception. - /// A representing the result of the asynchronous operation. - private async Task HandleTurnErrorAsync(ITurnContext turnContext, Exception exception) - { - // Log any leaked exception from the application. - _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - await SendErrorMessageAsync(turnContext, exception, default); - await EndSkillConversationAsync(turnContext, default); - await ClearConversationStateAsync(turnContext, default); - } - - /// - /// Sends an error message to the user and a trace activity to be displayed in the Bot Framework Emulator. - /// - /// Context for the current turn of conversation. - /// The exception to be sent in the message. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception, CancellationToken cancellationToken) - { - try - { - // Send a message to the user - var errorMessageText = "The bot encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage, cancellationToken); - - await turnContext.SendActivityAsync($"Exception: {exception.Message}"); - await turnContext.SendActivityAsync(exception.ToString()); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage, cancellationToken); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError", cancellationToken); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught in SendErrorMessageAsync : {ex}"); - } - } - - /// - /// Informs to the active skill that the conversation is ended so that it has a chance to clean up. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task EndSkillConversationAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_conversationState == null || _skillClient == null || _skillsConfig == null) - { - return; - } - - try - { - // Note: ActiveSkillPropertyName is set by the HostBot while messages are being - // forwarded to a Skill. - var activeSkill = await _conversationState.CreateProperty(HostBot.ActiveSkillPropertyName).GetAsync(turnContext, () => null, cancellationToken); - if (activeSkill != null) - { - var botId = _configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "HostSkillError"; - endOfConversation.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true); - - await _conversationState.SaveChangesAsync(turnContext, true, cancellationToken); - await _skillClient.PostActivityAsync(botId, activeSkill, _skillsConfig.SkillHostEndpoint, (Activity)endOfConversation, cancellationToken); - } - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to send EndOfConversation : {ex}"); - } - } - - /// - /// Deletes the conversationState for the current conversation to prevent the bot from getting stuck in an error-loop caused by being in a bad state. - /// ConversationState should be thought of as similar to "cookie-state" in a Web pages. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task ClearConversationStateAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_conversationState != null) - { - try - { - await _conversationState.DeleteAsync(turnContext, cancellationToken); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to Delete ConversationState : {ex}"); - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Authentication/AllowedSkillsClaimsValidator.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Authentication/AllowedSkillsClaimsValidator.cs deleted file mode 100644 index 178a1c0a47..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Authentication/AllowedSkillsClaimsValidator.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that responses are coming from configured skills. - /// - public class AllowedSkillsClaimsValidator : ClaimsValidator - { - private readonly List _allowedSkills; - - /// - /// Initializes a new instance of the class. - /// Loads the appIds for the configured skills. Only allows responses from skills it has configured. - /// - /// The list of configured skills. - public AllowedSkillsClaimsValidator(SkillsConfiguration skillsConfig) - { - if (skillsConfig == null) - { - throw new ArgumentNullException(nameof(skillsConfig)); - } - - _allowedSkills = (from skill in skillsConfig.Skills.Values select skill.AppId).ToList(); - } - - /// - /// Checks that the appId claim in the skill request is in the list of skills configured for this bot. - /// - /// The list of claims to validate. - /// A task that represents the work queued to execute. - public override Task ValidateClaimsAsync(IList claims) - { - if (SkillValidation.IsSkillClaim(claims)) - { - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedSkills.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from an application with an appID of \"{appId}\". To enable requests from this skill, add the skill to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Bots/HostBot.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Bots/HostBot.cs deleted file mode 100644 index 566610aed0..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Bots/HostBot.cs +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Dialogs; -using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Bots -{ - public class HostBot : ActivityHandler - { - public const string DeliveryModePropertyName = "deliveryModeProperty"; - public const string ActiveSkillPropertyName = "activeSkillProperty"; - - private readonly IStatePropertyAccessor _deliveryModeProperty; - private readonly IStatePropertyAccessor _activeSkillProperty; - private readonly IStatePropertyAccessor _dialogStateProperty; - private readonly string _botId; - private readonly ConversationState _conversationState; - private readonly SkillHttpClient _skillClient; - private readonly SkillsConfiguration _skillsConfig; - private readonly Dialog _dialog; - - /// - /// Initializes a new instance of the class. - /// - /// A state management object for the conversation. - /// The skills configuration. - /// The HTTP client for the skills. - /// The configuration properties. - /// The dialog to use. - public HostBot(ConversationState conversationState, SkillsConfiguration skillsConfig, SkillHttpClient skillClient, IConfiguration configuration, SetupDialog dialog) - { - _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState)); - _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig)); - _skillClient = skillClient ?? throw new ArgumentNullException(nameof(skillClient)); - _dialog = dialog ?? throw new ArgumentNullException(nameof(dialog)); - _dialogStateProperty = _conversationState.CreateProperty("DialogState"); - if (configuration == null) - { - throw new ArgumentNullException(nameof(configuration)); - } - - _botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - // Create state properties to track the delivery mode and active skill. - _deliveryModeProperty = conversationState.CreateProperty(DeliveryModePropertyName); - _activeSkillProperty = conversationState.CreateProperty(ActiveSkillPropertyName); - } - - /// - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) - { - // Forward all activities except EndOfConversation to the active skill. - if (turnContext.Activity.Type != ActivityTypes.EndOfConversation) - { - // Try to get the active skill - var activeSkill = await _activeSkillProperty.GetAsync(turnContext, () => null, cancellationToken); - - if (activeSkill != null) - { - var deliveryMode = await _deliveryModeProperty.GetAsync(turnContext, () => null, cancellationToken); - - // Send the activity to the skill - await SendToSkillAsync(turnContext, deliveryMode, activeSkill, cancellationToken); - return; - } - } - - await base.OnTurnAsync(turnContext, cancellationToken); - - // Save any state changes that might have occurred during the turn. - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - /// - /// Processes a message activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (_skillsConfig.Skills.ContainsKey(turnContext.Activity.Text)) - { - var deliveryMode = await _deliveryModeProperty.GetAsync(turnContext, () => null, cancellationToken); - var selectedSkill = _skillsConfig.Skills[turnContext.Activity.Text]; - var v3Bots = new List { "EchoSkillBotDotNetV3", "EchoSkillBotJSV3" }; - - if (selectedSkill != null && deliveryMode == DeliveryModes.ExpectReplies && v3Bots.Contains(selectedSkill.Id)) - { - var message = MessageFactory.Text("V3 Bots do not support 'expectReplies' delivery mode."); - await turnContext.SendActivityAsync(message, cancellationToken); - - // Forget delivery mode and skill invocation. - await _deliveryModeProperty.DeleteAsync(turnContext, cancellationToken); - await _activeSkillProperty.DeleteAsync(turnContext, cancellationToken); - - // Restart setup dialog - await _conversationState.DeleteAsync(turnContext, cancellationToken); - } - } - - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - } - - /// - /// Processes an end of conversation activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnEndOfConversationActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await EndConversation((Activity)turnContext.Activity, turnContext, cancellationToken); - } - - /// - /// Processes a member added event. - /// - /// The list of members added to the conversation. - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - if (member.Id != turnContext.Activity.Recipient.Id) - { - await turnContext.SendActivityAsync(MessageFactory.Text("Hello and welcome!"), cancellationToken); - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - } - } - } - - /// - /// Clears storage variables and sends the end of conversation activities. - /// - /// End of conversation activity. - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task EndConversation(Activity activity, ITurnContext turnContext, CancellationToken cancellationToken) - { - // Forget delivery mode and skill invocation. - await _deliveryModeProperty.DeleteAsync(turnContext, cancellationToken); - await _activeSkillProperty.DeleteAsync(turnContext, cancellationToken); - - // Show status message, text and value returned by the skill - var eocActivityMessage = $"Received {ActivityTypes.EndOfConversation}.\n\nCode: {activity.Code}."; - if (!string.IsNullOrWhiteSpace(activity.Text)) - { - eocActivityMessage += $"\n\nText: {activity.Text}"; - } - - if (activity.Value != null) - { - eocActivityMessage += $"\n\nValue: {JsonConvert.SerializeObject(activity.Value)}"; - } - - await turnContext.SendActivityAsync(MessageFactory.Text(eocActivityMessage), cancellationToken); - - // We are back at the host. - await turnContext.SendActivityAsync(MessageFactory.Text("Back in the host bot."), cancellationToken); - - // Restart setup dialog. - await _dialog.RunAsync(turnContext, _dialogStateProperty, cancellationToken); - - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - /// - /// Sends an activity to the skill bot. - /// - /// Context for the current turn of conversation. - /// The delivery mode to use when communicating to the skill. - /// The skill that will receive the activity. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - private async Task SendToSkillAsync(ITurnContext turnContext, string deliveryMode, BotFrameworkSkill targetSkill, CancellationToken cancellationToken) - { - // NOTE: Always SaveChanges() before calling a skill so that any activity generated by the skill - // will have access to current accurate state. - await _conversationState.SaveChangesAsync(turnContext, force: true, cancellationToken: cancellationToken); - - if (deliveryMode == DeliveryModes.ExpectReplies) - { - // Clone activity and update its delivery mode. - var activity = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(turnContext.Activity)); - activity.DeliveryMode = deliveryMode; - - // Route the activity to the skill. - var expectRepliesResponse = await _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, activity, cancellationToken); - - // Check response status. - if (!expectRepliesResponse.IsSuccessStatusCode()) - { - throw new HttpRequestException($"Error invoking the skill id: \"{targetSkill.Id}\" at \"{targetSkill.SkillEndpoint}\" (status is {expectRepliesResponse.Status}). \r\n {expectRepliesResponse.Body}"); - } - - // Route response activities back to the channel. - var responseActivities = expectRepliesResponse.Body?.Activities; - - foreach (var responseActivity in responseActivities) - { - if (responseActivity.Type == ActivityTypes.EndOfConversation) - { - await EndConversation(responseActivity, turnContext, cancellationToken); - } - else - { - await turnContext.SendActivityAsync(responseActivity, cancellationToken); - } - } - } - else - { - // Route the activity to the skill. - var response = await _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, (Activity)turnContext.Activity, cancellationToken); - - // Check response status - if (!response.IsSuccessStatusCode()) - { - throw new HttpRequestException($"Error invoking the skill id: \"{targetSkill.Id}\" at \"{targetSkill.SkillEndpoint}\" (status is {response.Status}). \r\n {response.Body}"); - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/BotController.cs deleted file mode 100644 index e0a80d0dc0..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/BotController.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Controllers -{ - /// - /// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot implementation at runtime. - /// - [Route("api/messages")] - [ApiController] - public class BotController : ControllerBase - { - private readonly BotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - - /// - /// Initializes a new instance of the class. - /// - /// Adapter for the BotController. - /// Bot for the BotController. - public BotController(BotFrameworkHttpAdapter adapter, IBot bot) - { - _adapter = adapter; - _bot = bot; - } - - /// - /// Processes an HttpPost request. - /// - /// A representing the result of the asynchronous operation. - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/SkillController.cs deleted file mode 100644 index 9f270318f6..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Controllers/SkillController.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Skills; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Controllers -{ - /// - /// A controller that handles skill replies to the bot. - /// This example uses the that is registered as a in startup.cs. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - /// - /// Initializes a new instance of the class. - /// - /// The skill handler registered as ChannelServiceHandler. - public SkillController(ChannelServiceHandler handler) - : base(handler) - { - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Dialogs/SetupDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Dialogs/SetupDialog.cs deleted file mode 100644 index 86b6c6787c..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Dialogs/SetupDialog.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Bots; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Dialogs -{ - /// - /// The setup dialog for this bot. - /// - public class SetupDialog : ComponentDialog - { - private readonly IStatePropertyAccessor _deliveryModeProperty; - private readonly IStatePropertyAccessor _activeSkillProperty; - private readonly SkillsConfiguration _skillsConfig; - private string _deliveryMode; - - public SetupDialog(ConversationState conversationState, SkillsConfiguration skillsConfig) - : base(nameof(SetupDialog)) - { - _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig)); - - _deliveryModeProperty = conversationState.CreateProperty(HostBot.DeliveryModePropertyName); - _activeSkillProperty = conversationState.CreateProperty(HostBot.ActiveSkillPropertyName); - - // Define the setup dialog and its related components. - // Add ChoicePrompt to render available skills. - AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); - - // Add main waterfall dialog for this bot. - var waterfallSteps = new WaterfallStep[] - { - SelectDeliveryModeStepAsync, - SelectSkillStepAsync, - FinalStepAsync - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - InitialDialogId = nameof(WaterfallDialog); - } - - // Render a prompt to select the delivery mode to use. - private async Task SelectDeliveryModeStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Create the PromptOptions with the delivery modes supported. - const string messageText = "What delivery mode would you like to use?"; - const string repromptMessageText = "That was not a valid choice, please select a valid delivery mode."; - var choices = new List(); - choices.Add(new Choice(DeliveryModes.Normal)); - choices.Add(new Choice(DeliveryModes.ExpectReplies)); - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = choices - }; - - // Prompt the user to select a delivery mode. - return await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); - } - - // Render a prompt to select the skill to call. - private async Task SelectSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Set delivery mode. - _deliveryMode = ((FoundChoice)stepContext.Result).Value; - await _deliveryModeProperty.SetAsync(stepContext.Context, ((FoundChoice)stepContext.Result).Value, cancellationToken); - - // Create the PromptOptions from the skill configuration which contains the list of configured skills. - const string messageText = "What skill would you like to call?"; - const string repromptMessageText = "That was not a valid choice, please select a valid skill."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = _skillsConfig.Skills.Select(skill => new Choice(skill.Key)).ToList(), - Style = ListStyle.SuggestedAction - }; - - // Prompt the user to select a skill. - return await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); - } - - // The SetupDialog has ended, we go back to the HostBot to connect with the selected skill. - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var selectedSkillKey = ((FoundChoice)stepContext.Result).Value; - var selectedSkill = _skillsConfig.Skills.FirstOrDefault(skill => skill.Key == selectedSkillKey); - - var v3Bots = new List { "EchoSkillBotDotNetV3", "EchoSkillBotJSV3" }; - - if (_deliveryMode == DeliveryModes.ExpectReplies && v3Bots.Contains(selectedSkillKey)) - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text("V3 Bots do not support 'expectReplies' delivery mode."), cancellationToken); - - // Restart setup dialog - return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken); - } - - // Set active skill - await _activeSkillProperty.SetAsync(stepContext.Context, selectedSkill.Value, cancellationToken); - - var message = MessageFactory.Text("Type anything to send to the skill.", "Type anything to send to the skill.", InputHints.ExpectingInput); - await stepContext.Context.SendActivityAsync(message, cancellationToken); - - return await stepContext.EndDialogAsync(stepContext.Values, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Program.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Program.cs deleted file mode 100644 index fb92b18353..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot -{ - public class Program - { - /// - /// The entry point of the application. - /// - /// The command line args. - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - /// - /// Creates a new instance of the class with pre-configured defaults. - /// - /// The command line args. - /// The initialized . - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Properties/launchSettings.json deleted file mode 100644 index e660cda730..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35000", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "SimpleHostBotDotNet": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SimpleHostBot.csproj b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SimpleHostBot.csproj deleted file mode 100644 index 5f112edd07..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SimpleHostBot.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - netcoreapp3.1 - latest - Microsoft.BotFrameworkFunctionalTests.SimpleHostBot - Microsoft.BotFrameworkFunctionalTests.SimpleHostBot - - - - DEBUG;TRACE - - - - - - - - - - - Always - - - Always - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SkillsConfiguration.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SkillsConfiguration.cs deleted file mode 100644 index aa1989900b..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/SkillsConfiguration.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot -{ - /// - /// A helper class that loads Skills information from configuration. - /// - public class SkillsConfiguration - { - /// - /// Initializes a new instance of the class to load skills information from configuration. - /// - /// The configuration properties. - public SkillsConfiguration(IConfiguration configuration) - { - var section = configuration?.GetSection("BotFrameworkSkills"); - var skills = section?.Get(); - if (skills != null) - { - foreach (var skill in skills) - { - Skills.Add(skill.Id, skill); - } - } - - var skillHostEndpoint = configuration?.GetValue(nameof(SkillHostEndpoint)); - if (!string.IsNullOrWhiteSpace(skillHostEndpoint)) - { - SkillHostEndpoint = new Uri(skillHostEndpoint); - } - } - - /// - /// Gets the URI representing the endpoint of the host bot. - /// - /// - /// The URI representing the endpoint of the host bot. - /// - public Uri SkillHostEndpoint { get; } - - /// - /// Gets the key-value pairs with the skills bots. - /// - /// - /// The key-value pairs with the skills bots. - /// - public Dictionary Skills { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Startup.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Startup.cs deleted file mode 100644 index 42879f11f9..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/Startup.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Authentication; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Bots; -using Microsoft.BotFrameworkFunctionalTests.SimpleHostBot.Dialogs; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.SimpleHostBot -{ - public class Startup - { - public Startup(IConfiguration config) - { - Configuration = config; - } - - public IConfiguration Configuration { get; } - - /// - /// This method gets called by the runtime. Use this method to add services to the container. - /// - /// The collection of services to add to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers().AddNewtonsoftJson(); - - // Configure credentials - services.AddSingleton(); - - // Register the skills configuration class - services.AddSingleton(); - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new AllowedSkillsClaimsValidator(sp.GetService()) }); - - // Register the Bot Framework Adapter with error handling enabled. - // Note: some classes use the base BotAdapter so we add an extra registration that pulls the same instance. - services.AddSingleton(); - services.AddSingleton(sp => sp.GetService()); - - // Register the skills client and skills request handler. - services.AddSingleton(); - services.AddHttpClient(); - services.AddSingleton(); - - // Register the storage we'll be using for User and Conversation state. (Memory is great for testing purposes.) - services.AddSingleton(); - - // Register Conversation state (used by the Dialog system itself). - services.AddSingleton(); - - // Create SetupDialog - services.AddSingleton(); - - // Register the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient(); - - if (!string.IsNullOrEmpty(Configuration["ChannelService"])) - { - // Register a ConfigurationChannelProvider -- this is only for Azure Gov. - services.AddSingleton(); - } - } - - /// - /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - /// - /// The application request pipeline to be configured. - /// The web hosting environment. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles() - .UseStaticFiles() - .UseRouting() - .UseAuthorization() - .UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/appsettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/appsettings.json deleted file mode 100644 index ba463c7c36..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/appsettings.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "ChannelService": "", - "SkillHostEndpoint": "http://localhost:35000/api/skills/", - "BotFrameworkSkills": [ - { - "Id": "EchoSkillBotComposerDotNet", - "AppId": "", - "SkillEndpoint": "http://localhost:35410/api/messages" - }, - { - "Id": "EchoSkillBotDotNet", - "AppId": "", - "SkillEndpoint": "http://localhost:35400/api/messages" - }, - { - "Id": "EchoSkillBotDotNet21", - "AppId": "", - "SkillEndpoint": "http://localhost:35405/api/messages" - }, - { - "Id": "EchoSkillBotDotNetV3", - "AppId": "", - "SkillEndpoint": "http://localhost:35407/api/messages" - }, - { - "Id": "EchoSkillBotJS", - "AppId": "", - "SkillEndpoint": "http://localhost:36400/api/messages" - }, - { - "Id": "EchoSkillBotJSV3", - "AppId": "", - "SkillEndpoint": "http://localhost:36407/api/messages" - }, - { - "Id": "EchoSkillBotPython", - "AppId": "", - "SkillEndpoint": "http://localhost:37400/api/messages" - } - ] -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/wwwroot/default.htm b/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/wwwroot/default.htm deleted file mode 100644 index 8d163da5a0..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/SimpleHostBot/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - SimpleHostBotDotNet - - - - - -
-
-
-
SimpleRootBotDotNet Bot
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
- -
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/AdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/AdapterWithErrorHandler.cs deleted file mode 100644 index 1658551aea..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/AdapterWithErrorHandler.cs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Middleware; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot -{ - public class AdapterWithErrorHandler : BotFrameworkHttpAdapter - { - private readonly IConfiguration _configuration; - private readonly ConversationState _conversationState; - private readonly ILogger _logger; - private readonly SkillHttpClient _skillClient; - private readonly SkillsConfiguration _skillsConfig; - - public AdapterWithErrorHandler(IConfiguration configuration, ILogger logger, ConversationState conversationState, SkillHttpClient skillClient = null, SkillsConfiguration skillsConfig = null) - : base(configuration, logger) - { - _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _skillClient = skillClient; - _skillsConfig = skillsConfig; - - OnTurnError = HandleTurnError; - Use(new LoggerMiddleware(logger)); - } - - private async Task HandleTurnError(ITurnContext turnContext, Exception exception) - { - // Log any leaked exception from the application. - _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - await SendErrorMessageAsync(turnContext, exception); - await EndSkillConversationAsync(turnContext); - await ClearConversationStateAsync(turnContext); - } - - private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception) - { - try - { - // Send a message to the user. - var errorMessageText = "The bot encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage); - - await turnContext.SendActivityAsync($"Exception: {exception.Message}"); - await turnContext.SendActivityAsync(exception.ToString()); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator. - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError"); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught in SendErrorMessageAsync : {ex}"); - } - } - - private async Task EndSkillConversationAsync(ITurnContext turnContext) - { - if (_skillClient == null || _skillsConfig == null) - { - return; - } - - try - { - // Inform the active skill that the conversation is ended so that it has a chance to clean up. - // Note: the root bot manages the ActiveSkillPropertyName, which has a value while the root bot - // has an active conversation with a skill. - var activeSkill = await _conversationState.CreateProperty(MainDialog.ActiveSkillPropertyName).GetAsync(turnContext, () => null); - if (activeSkill != null) - { - var botId = _configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "RootSkillError"; - endOfConversation.ApplyConversationReference(turnContext.Activity.GetConversationReference(), true); - - await _conversationState.SaveChangesAsync(turnContext, true); - await _skillClient.PostActivityAsync(botId, activeSkill, _skillsConfig.SkillHostEndpoint, (Activity)endOfConversation, CancellationToken.None); - } - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to send EndOfConversation : {ex}"); - } - } - - private async Task ClearConversationStateAsync(ITurnContext turnContext) - { - try - { - // Delete the conversationState for the current conversation to prevent the - // bot from getting stuck in a error-loop caused by being in a bad state. - // ConversationState should be thought of as similar to "cookie-state" for a Web page. - await _conversationState.DeleteAsync(turnContext); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to Delete ConversationState : {ex}"); - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Authentication/AllowedSkillsClaimsValidator.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Authentication/AllowedSkillsClaimsValidator.cs deleted file mode 100644 index 42594c3c85..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Authentication/AllowedSkillsClaimsValidator.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that responses are coming from configured skills. - /// - public class AllowedSkillsClaimsValidator : ClaimsValidator - { - private readonly List _allowedSkills; - - public AllowedSkillsClaimsValidator(SkillsConfiguration skillsConfig) - { - if (skillsConfig == null) - { - throw new ArgumentNullException(nameof(skillsConfig)); - } - - // Load the appIds for the configured skills (we will only allow responses from skills we have configured). - _allowedSkills = (from skill in skillsConfig.Skills.Values select skill.AppId).ToList(); - } - - public override Task ValidateClaimsAsync(IList claims) - { - if (SkillValidation.IsSkillClaim(claims)) - { - // Check that the appId claim in the skill request is in the list of skills configured for this bot. - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedSkills.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from an application with an appID of \"{appId}\". To enable requests from this skill, add the skill to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Bots/RootBot.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Bots/RootBot.cs deleted file mode 100644 index 75b20d5c30..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Bots/RootBot.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Newtonsoft.Json; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Bots -{ - public class RootBot : ActivityHandler - where T : Dialog - { - private readonly ConversationState _conversationState; - private readonly Dialog _mainDialog; - - public RootBot(ConversationState conversationState, T mainDialog) - { - _conversationState = conversationState; - _mainDialog = mainDialog; - } - - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) - { - if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate) - { - // Let the base class handle the activity (this will trigger OnMembersAdded). - await base.OnTurnAsync(turnContext, cancellationToken); - } - else - { - // Run the Dialog with the Activity. - await _mainDialog.RunAsync(turnContext, _conversationState.CreateProperty("DialogState"), cancellationToken); - } - - // Save any state changes that might have occurred during the turn. - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - // Greet anyone that was not the target (recipient) of this message. - // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards. - if (member.Id != turnContext.Activity.Recipient.Id) - { - var welcomeCard = CreateAdaptiveCardAttachment(); - var activity = MessageFactory.Attachment(welcomeCard); - activity.Speak = "Welcome to the waterfall host bot"; - await turnContext.SendActivityAsync(activity, cancellationToken); - await _mainDialog.RunAsync(turnContext, _conversationState.CreateProperty("DialogState"), cancellationToken); - } - } - } - - // Load attachment from embedded resource. - private Attachment CreateAdaptiveCardAttachment() - { - var cardResourcePath = "Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Cards.welcomeCard.json"; - - using (var stream = GetType().Assembly.GetManifestResourceStream(cardResourcePath)) - { - using (var reader = new StreamReader(stream)) - { - var adaptiveCard = reader.ReadToEnd(); - return new Attachment - { - ContentType = "application/vnd.microsoft.card.adaptive", - Content = JsonConvert.DeserializeObject(adaptiveCard) - }; - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Cards/welcomeCard.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Cards/welcomeCard.json deleted file mode 100644 index 1fc98a2237..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Cards/welcomeCard.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "Medium", - "size": "Medium", - "weight": "Bolder", - "text": "Welcome to the Skill Dialog Sample!", - "wrap": true, - "maxLines": 0, - "color": "Accent" - }, - { - "type": "TextBlock", - "size": "default", - "text": "This sample allows you to connect to a skill using a SkillDialog and invoke several actions.", - "wrap": true, - "maxLines": 0 - } - ] -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/BotController.cs deleted file mode 100644 index dcf63dabd6..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/BotController.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Controllers -{ - // This ASP Controller is created to handle a request. Dependency injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [Route("api/messages")] - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - private readonly ILogger _logger; - - public BotController(BotFrameworkHttpAdapter adapter, IBot bot, ILogger logger) - { - _adapter = adapter; - _bot = bot; - _logger = logger; - } - - [HttpPost] - [HttpGet] - public async Task PostAsync() - { - try - { - // Delegate the processing of the HTTP POST to the adapter. - // The adapter will invoke the bot. - await _adapter.ProcessAsync(Request, Response, _bot); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/SkillController.cs deleted file mode 100644 index 82e404550b..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Controllers/SkillController.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Controllers -{ - /// - /// A controller that handles skill replies to the bot. - /// This example uses the that is registered as a in startup.cs. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - private readonly ILogger _logger; - - public SkillController(ChannelServiceHandler handler, ILogger logger) - : base(handler) - { - _logger = logger; - } - - public override Task ReplyToActivityAsync(string conversationId, string activityId, Activity activity) - { - try - { - return base.ReplyToActivityAsync(conversationId, activityId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - - public override Task SendToConversationAsync(string conversationId, Activity activity) - { - try - { - return base.SendToConversationAsync(conversationId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - - public override Task UpdateActivityAsync(string conversationId, string activityId, Activity activity) - { - try - { - return base.UpdateActivityAsync(conversationId, activityId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - - public override Task DeleteActivityAsync(string conversationId, string activityId) - { - try - { - return base.DeleteActivityAsync(conversationId, activityId); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/MainDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/MainDialog.cs deleted file mode 100644 index 17b08d3f58..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/MainDialog.cs +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs.Sso; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills; -using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs -{ - /// - /// The main dialog for this bot. It uses a to call skills. - /// - public class MainDialog : ComponentDialog - { - // State property key that stores the active skill (used in AdapterWithErrorHandler to terminate the skills on error). - public static readonly string ActiveSkillPropertyName = $"{typeof(MainDialog).FullName}.ActiveSkillProperty"; - - private const string SsoDialogPrefix = "Sso"; - private readonly IStatePropertyAccessor _activeSkillProperty; - private readonly string _deliveryMode = $"{typeof(MainDialog).FullName}.DeliveryMode"; - private readonly string _selectedSkillKey = $"{typeof(MainDialog).FullName}.SelectedSkillKey"; - private readonly SkillsConfiguration _skillsConfig; - private readonly IConfiguration _configuration; - - // Dependency injection uses this constructor to instantiate MainDialog. - public MainDialog(ConversationState conversationState, SkillConversationIdFactoryBase conversationIdFactory, SkillHttpClient skillClient, SkillsConfiguration skillsConfig, IConfiguration configuration) - : base(nameof(MainDialog)) - { - _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - - var botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - _skillsConfig = skillsConfig ?? throw new ArgumentNullException(nameof(skillsConfig)); - - if (skillClient == null) - { - throw new ArgumentNullException(nameof(skillClient)); - } - - if (conversationState == null) - { - throw new ArgumentNullException(nameof(conversationState)); - } - - // Create state property to track the active skill. - _activeSkillProperty = conversationState.CreateProperty(ActiveSkillPropertyName); - - // Register the tangent dialog for testing tangents and resume - AddDialog(new TangentDialog()); - - // Create and add SkillDialog instances for the configured skills. - AddSkillDialogs(conversationState, conversationIdFactory, skillClient, skillsConfig, botId); - - // Add ChoicePrompt to render available delivery modes. - AddDialog(new ChoicePrompt("DeliveryModePrompt")); - - // Add ChoicePrompt to render available groups of skills. - AddDialog(new ChoicePrompt("SkillGroupPrompt")); - - // Add ChoicePrompt to render available skills. - AddDialog(new ChoicePrompt("SkillPrompt")); - - // Add ChoicePrompt to render skill actions. - AddDialog(new ChoicePrompt("SkillActionPrompt")); - - // Special case: register SSO dialogs for skills that support SSO actions. - AddSsoDialogs(configuration); - - // Add main waterfall dialog for this bot. - var waterfallSteps = new WaterfallStep[] - { - SelectDeliveryModeStepAsync, - SelectSkillGroupStepAsync, - SelectSkillStepAsync, - SelectSkillActionStepAsync, - CallSkillActionStepAsync, - FinalStepAsync - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - /// - /// This override is used to test the "abort" command to interrupt skills from the parent and - /// also to test the "tangent" command to start a tangent and resume a skill. - /// - /// The inner for the current turn of conversation. - /// A cancellation token that can be used by other objects - /// or threads to receive notice of cancellation. - /// A representing the asynchronous operation. - protected override async Task OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default) - { - // This is an example on how to cancel a SkillDialog that is currently in progress from the parent bot. - var activeSkill = await _activeSkillProperty.GetAsync(innerDc.Context, () => null, cancellationToken); - var activity = innerDc.Context.Activity; - if (activeSkill != null && activity.Type == ActivityTypes.Message && !string.IsNullOrWhiteSpace(activity.Text) && activity.Text.Equals("abort", StringComparison.CurrentCultureIgnoreCase)) - { - // Cancel all dialogs when the user says abort. - // The SkillDialog automatically sends an EndOfConversation message to the skill to let the - // skill know that it needs to end its current dialogs, too. - await innerDc.CancelAllDialogsAsync(cancellationToken); - return await innerDc.ReplaceDialogAsync(InitialDialogId, "Canceled! \n\n What delivery mode would you like to use?", cancellationToken); - } - - // Sample to test a tangent when in the middle of a skill conversation. - if (activeSkill != null && activity.Type == ActivityTypes.Message && !string.IsNullOrWhiteSpace(activity.Text) && activity.Text.Equals("tangent", StringComparison.CurrentCultureIgnoreCase)) - { - // Start tangent. - return await innerDc.BeginDialogAsync(nameof(TangentDialog), cancellationToken: cancellationToken); - } - - return await base.OnContinueDialogAsync(innerDc, cancellationToken); - } - - // Render a prompt to select the delivery mode to use. - private async Task SelectDeliveryModeStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Create the PromptOptions with the delivery modes supported. - var messageText = stepContext.Options?.ToString() ?? "What delivery mode would you like to use?"; - const string retryMessageText = "That was not a valid choice, please select a valid delivery mode."; - var choices = new List - { - new Choice(DeliveryModes.Normal), - new Choice(DeliveryModes.ExpectReplies) - }; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(retryMessageText, retryMessageText, InputHints.ExpectingInput), - Choices = choices - }; - - // Prompt the user to select a delivery mode. - return await stepContext.PromptAsync("DeliveryModePrompt", options, cancellationToken); - } - - // Render a prompt to select the group of skills to use. - private async Task SelectSkillGroupStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Remember the delivery mode selected by the user. - stepContext.Values[_deliveryMode] = ((FoundChoice)stepContext.Result).Value; - - // Create the PromptOptions with the types of supported skills. - const string messageText = "What group of skills would you like to use?"; - const string retryMessageText = "That was not a valid choice, please select a valid skill group."; - - // Use linq to get a list of the groups for the skills in skillsConfig. - var choices = _skillsConfig.Skills - .GroupBy(skill => skill.Value.Group) - .Select(skillGroup => new Choice(skillGroup.First().Value.Group)) - .ToList(); - - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(retryMessageText, retryMessageText, InputHints.ExpectingInput), - Choices = choices - }; - - // Prompt the user to select a type of skill. - return await stepContext.PromptAsync("SkillGroupPrompt", options, cancellationToken); - } - - // Render a prompt to select the skill to call. - private async Task SelectSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var skillGroup = ((FoundChoice)stepContext.Result).Value; - - // Create the PromptOptions from the skill configuration which contain the list of configured skills. - const string messageText = "What skill would you like to call?"; - const string retryMessageText = "That was not a valid choice, please select a valid skill."; - - // Use linq to return the skills for the selected group. - var choices = _skillsConfig.Skills - .Where(skill => skill.Value.Group == skillGroup) - .Select(skill => new Choice(skill.Value.Id)) - .ToList(); - - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(retryMessageText, retryMessageText, InputHints.ExpectingInput), - Choices = choices - }; - - // Prompt the user to select a skill. - return await stepContext.PromptAsync("SkillPrompt", options, cancellationToken); - } - - // Render a prompt to select the begin action for the skill. - private async Task SelectSkillActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Get the skill info based on the selected skill. - var selectedSkillId = ((FoundChoice)stepContext.Result).Value; - var deliveryMode = stepContext.Values[_deliveryMode].ToString(); - var v3Bots = new List { "EchoSkillBotDotNetV3", "EchoSkillBotJSV3" }; - - // Exclude v3 bots from ExpectReplies - if (deliveryMode == DeliveryModes.ExpectReplies && v3Bots.Contains(selectedSkillId)) - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text("V3 Bots do not support 'expectReplies' delivery mode."), cancellationToken); - - // Restart setup dialog - return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken); - } - - var selectedSkill = _skillsConfig.Skills.FirstOrDefault(keyValuePair => keyValuePair.Value.Id == selectedSkillId).Value; - - // Remember the skill selected by the user. - stepContext.Values[_selectedSkillKey] = selectedSkill; - - var skillActionChoices = selectedSkill.GetActions().Select(action => new Choice(action)).ToList(); - if (skillActionChoices.Count == 1) - { - // The skill only supports one action (e.g. Echo), skip the prompt. - return await stepContext.NextAsync(new FoundChoice { Value = skillActionChoices[0].Value }, cancellationToken); - } - - // Create the PromptOptions with the actions supported by the selected skill. - var messageText = $"Select an action to send to **{selectedSkill.Id}**."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - Choices = skillActionChoices - }; - - // Prompt the user to select a skill action. - return await stepContext.PromptAsync("SkillActionPrompt", options, cancellationToken); - } - - // Starts the SkillDialog based on the user's selections. - private async Task CallSkillActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var selectedSkill = (SkillDefinition)stepContext.Values[_selectedSkillKey]; - - // Save active skill in state. - await _activeSkillProperty.SetAsync(stepContext.Context, selectedSkill, cancellationToken); - - // Create the initial activity to call the skill. - var skillActivity = selectedSkill.CreateBeginActivity(((FoundChoice)stepContext.Result).Value); - if (skillActivity.Name == "Sso") - { - // Special case, we start the SSO dialog to prepare the host to call the skill. - return await stepContext.BeginDialogAsync($"{SsoDialogPrefix}{selectedSkill.Id}", cancellationToken: cancellationToken); - } - - // We are manually creating the activity to send to the skill; ensure we add the ChannelData and Properties - // from the original activity so the skill gets them. - // Note: this is not necessary if we are just forwarding the current activity from context. - skillActivity.ChannelData = stepContext.Context.Activity.ChannelData; - skillActivity.Properties = stepContext.Context.Activity.Properties; - - // Create the BeginSkillDialogOptions and assign the activity to send. - var skillDialogArgs = new BeginSkillDialogOptions { Activity = skillActivity }; - - if (stepContext.Values[_deliveryMode].ToString() == DeliveryModes.ExpectReplies) - { - skillDialogArgs.Activity.DeliveryMode = DeliveryModes.ExpectReplies; - } - - // Start the skillDialog instance with the arguments. - return await stepContext.BeginDialogAsync(selectedSkill.Id, skillDialogArgs, cancellationToken); - } - - // The SkillDialog has ended, render the results (if any) and restart MainDialog. - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var activeSkill = await _activeSkillProperty.GetAsync(stepContext.Context, () => null, cancellationToken); - - // Check if the skill returned any results and display them. - if (stepContext.Result != null) - { - var message = $"Skill \"{activeSkill.Id}\" invocation complete."; - message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}"; - await stepContext.Context.SendActivityAsync(MessageFactory.Text(message, message, inputHint: InputHints.IgnoringInput), cancellationToken: cancellationToken); - } - - // Clear the delivery mode selected by the user. - stepContext.Values[_deliveryMode] = null; - - // Clear the skill selected by the user. - stepContext.Values[_selectedSkillKey] = null; - - // Clear active skill in state. - await _activeSkillProperty.DeleteAsync(stepContext.Context, cancellationToken); - - // Restart the main dialog with a different message the second time around. - return await stepContext.ReplaceDialogAsync(InitialDialogId, $"Done with \"{activeSkill.Id}\". \n\n What delivery mode would you like to use?", cancellationToken); - } - - // Helper method that creates and adds SkillDialog instances for the configured skills. - private void AddSkillDialogs(ConversationState conversationState, SkillConversationIdFactoryBase conversationIdFactory, SkillHttpClient skillClient, SkillsConfiguration skillsConfig, string botId) - { - foreach (var skillInfo in _skillsConfig.Skills.Values) - { - // Create the dialog options. - var skillDialogOptions = new SkillDialogOptions - { - BotId = botId, - ConversationIdFactory = conversationIdFactory, - SkillClient = skillClient, - SkillHostEndpoint = skillsConfig.SkillHostEndpoint, - ConversationState = conversationState, - Skill = skillInfo - }; - - // Add a SkillDialog for the selected skill. - AddDialog(new SkillDialog(skillDialogOptions, skillInfo.Id)); - } - } - - // Special case. - // SSO needs a dialog in the host to allow the user to sign in. - // We create and several SsoDialog instances for each skill that supports SSO. - private void AddSsoDialogs(IConfiguration configuration) - { - var connectionName = configuration.GetSection("SsoConnectionName")?.Value; - foreach (var ssoSkillDialog in Dialogs.GetDialogs().Where(dialog => dialog.Id.StartsWith("WaterfallSkillBot")).ToList()) - { - AddDialog(new SsoDialog($"{SsoDialogPrefix}{ssoSkillDialog.Id}", ssoSkillDialog, connectionName)); - } - - connectionName = configuration.GetSection("SsoConnectionNameTeams")?.Value; - foreach (var ssoSkillDialog in Dialogs.GetDialogs().Where(dialog => dialog.Id.StartsWith("TeamsSkillBot")).ToList()) - { - AddDialog(new SsoDialog($"{SsoDialogPrefix}{ssoSkillDialog.Id}", ssoSkillDialog, connectionName)); - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoDialog.cs deleted file mode 100644 index 9e88adc417..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoDialog.cs +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs.Sso -{ - /// - /// Helps prepare the host for SSO operations and provides helpers to check the status and invoke the skill. - /// - public class SsoDialog : ComponentDialog - { - private readonly string _connectionName; - private readonly string _skillDialogId; - - public SsoDialog(string dialogId, Dialog ssoSkillDialog, string connectionName) - : base(dialogId) - { - _connectionName = connectionName; - _skillDialogId = ssoSkillDialog.Id; - - AddDialog(new ChoicePrompt("ActionStepPrompt")); - AddDialog(new SsoSignInDialog(_connectionName)); - AddDialog(ssoSkillDialog); - - var waterfallSteps = new WaterfallStep[] - { - PromptActionStepAsync, - HandleActionStepAsync, - PromptFinalStepAsync, - }; - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var messageText = "What SSO action do you want to perform?"; - var repromptMessageText = "That was not a valid choice, please select a valid choice."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = await GetPromptChoicesAsync(stepContext, cancellationToken) - }; - - // Prompt the user to select a skill. - return await stepContext.PromptAsync("ActionStepPrompt", options, cancellationToken); - } - - // Create the prompt choices based on the current sign in status - private async Task> GetPromptChoicesAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var promptChoices = new List(); - var adapter = (IUserTokenProvider)stepContext.Context.Adapter; - var token = await adapter.GetUserTokenAsync(stepContext.Context, _connectionName, null, cancellationToken); - - if (token == null) - { - promptChoices.Add(new Choice("Login")); - - // Token exchange will fail when the host is not logged on and the skill should - // show a regular OAuthPrompt - promptChoices.Add(new Choice("Call Skill (without SSO)")); - } - else - { - promptChoices.Add(new Choice("Logout")); - promptChoices.Add(new Choice("Show token")); - promptChoices.Add(new Choice("Call Skill (with SSO)")); - } - - promptChoices.Add(new Choice("Back")); - - return promptChoices; - } - - private async Task HandleActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var action = ((FoundChoice)stepContext.Result).Value.ToLowerInvariant(); - - switch (action) - { - case "login": - return await stepContext.BeginDialogAsync(nameof(SsoSignInDialog), null, cancellationToken); - - case "logout": - var adapter = (IUserTokenProvider)stepContext.Context.Adapter; - await adapter.SignOutUserAsync(stepContext.Context, _connectionName, cancellationToken: cancellationToken); - await stepContext.Context.SendActivityAsync("You have been signed out.", cancellationToken: cancellationToken); - return await stepContext.NextAsync(cancellationToken: cancellationToken); - - case "show token": - var tokenProvider = (IUserTokenProvider)stepContext.Context.Adapter; - var token = await tokenProvider.GetUserTokenAsync(stepContext.Context, _connectionName, null, cancellationToken); - if (token == null) - { - await stepContext.Context.SendActivityAsync("User has no cached token.", cancellationToken: cancellationToken); - } - else - { - await stepContext.Context.SendActivityAsync($"Here is your current SSO token: {token.Token}", cancellationToken: cancellationToken); - } - - return await stepContext.NextAsync(cancellationToken: cancellationToken); - - case "call skill (with sso)": - case "call skill (without sso)": - var beginSkillActivity = new Activity - { - Type = ActivityTypes.Event, - Name = "Sso" - }; - - return await stepContext.BeginDialogAsync(_skillDialogId, new BeginSkillDialogOptions { Activity = beginSkillActivity }, cancellationToken); - - case "back": - return new DialogTurnResult(DialogTurnStatus.Complete); - - default: - // This should never be hit since the previous prompt validates the choice - throw new InvalidOperationException($"Unrecognized action: {action}"); - } - } - - private async Task PromptFinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Restart the dialog (we will exit when the user says end) - return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoSignInDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoSignInDialog.cs deleted file mode 100644 index 9529a192d5..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/Sso/SsoSignInDialog.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs.Sso -{ - public class SsoSignInDialog : ComponentDialog - { - public SsoSignInDialog(string connectionName) - : base(nameof(SsoSignInDialog)) - { - AddDialog(new OAuthPrompt( - nameof(OAuthPrompt), - new OAuthPromptSettings - { - ConnectionName = connectionName, - Text = $"Sign in to the host bot using AAD for SSO and connection {connectionName}", - Title = "Sign In", - Timeout = 60000 - })); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { SignInStepAsync, DisplayTokenAsync })); - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task SignInStepAsync(WaterfallStepContext context, CancellationToken cancellationToken) - { - return await context.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken); - } - - private async Task DisplayTokenAsync(WaterfallStepContext context, CancellationToken cancellationToken) - { - if (!(context.Result is TokenResponse result)) - { - await context.Context.SendActivityAsync("No token was provided.", cancellationToken: cancellationToken); - } - else - { - await context.Context.SendActivityAsync($"Here is your token: {result.Token}", cancellationToken: cancellationToken); - } - - return await context.EndDialogAsync(null, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/TangentDialog.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/TangentDialog.cs deleted file mode 100644 index 1962319bab..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Dialogs/TangentDialog.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs -{ - /// - /// A simple waterfall dialog used to test triggering tangents from . - /// - public class TangentDialog : ComponentDialog - { - public TangentDialog(string dialogId = nameof(TangentDialog)) - : base(dialogId) - { - AddDialog(new TextPrompt(nameof(TextPrompt))); - var waterfallSteps = new WaterfallStep[] - { - Step1Async, - Step2Async, - EndStepAsync - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task Step1Async(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var messageText = "Tangent step 1 of 2, say something."; - var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput); - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken); - } - - private async Task Step2Async(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var messageText = "Tangent step 2 of 2, say something."; - var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput); - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken); - } - - private async Task EndStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - return await stepContext.EndDialogAsync(cancellationToken: cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Middleware/LoggerMiddleware.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Middleware/LoggerMiddleware.cs deleted file mode 100644 index 9485dffbda..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Middleware/LoggerMiddleware.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Middleware -{ - /// - /// Uses an ILogger instance to log user and bot messages. It filters out ContinueConversation events coming from skill responses. - /// - public class LoggerMiddleware : IMiddleware - { - private readonly ILogger _logger; - - public LoggerMiddleware(ILogger logger) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default) - { - // Note: skill responses will show as ContinueConversation events; we don't log those. - // We only log incoming messages from users. - if (!(turnContext.Activity.Type == ActivityTypes.Event && turnContext.Activity.Name == ActivityEventNames.ContinueConversation)) - { - var message = $"User said: {turnContext.Activity.Text} Type: \"{turnContext.Activity.Type}\" Name: \"{turnContext.Activity.Name}\""; - _logger.LogInformation(message); - } - - // Register outgoing handler. - turnContext.OnSendActivities(OutgoingHandler); - - // Continue processing messages. - await next(cancellationToken); - } - - private async Task OutgoingHandler(ITurnContext turnContext, List activities, Func> next) - { - foreach (var activity in activities) - { - var message = $"Bot said: {activity.Text} Type: \"{activity.Type}\" Name: \"{activity.Name}\""; - _logger.LogInformation(message); - } - - return await next(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Program.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Program.cs deleted file mode 100644 index 306d8a19a4..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Properties/launchSettings.json deleted file mode 100644 index dafa6f0bc2..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35020", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "WaterfallHostBot": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35020", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/EchoSkill.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/EchoSkill.cs deleted file mode 100644 index 7ff87fa16c..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/EchoSkill.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills -{ - public class EchoSkill : SkillDefinition - { - private enum SkillAction - { - Message - } - - public override IList GetActions() - { - return new List { SkillAction.Message.ToString() }; - } - - public override Activity CreateBeginActivity(string actionId) - { - if (!Enum.TryParse(actionId, true, out _)) - { - throw new InvalidOperationException($"Unable to create begin activity for \"{actionId}\"."); - } - - // We only support one activity for Echo so no further checks are needed - return new Activity(ActivityTypes.Message) - { - Name = SkillAction.Message.ToString(), - Text = "Begin the Echo Skill." - }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/SkillDefinition.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/SkillDefinition.cs deleted file mode 100644 index e150259058..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/SkillDefinition.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills -{ - /// - /// Extends and provides methods to return the actions and the begin activity to start a skill. - /// This class also exposes a group property to render skill groups and narrow down the available options. - /// - /// - /// This is just a temporary implementation, ideally, this should be replaced by logic that parses a manifest and creates - /// what's needed. - /// - public class SkillDefinition : BotFrameworkSkill - { - public string Group { get; set; } - - public virtual IList GetActions() - { - throw new NotImplementedException(); - } - - public virtual Activity CreateBeginActivity(string actionId) - { - throw new NotImplementedException(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/TeamsSkill.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/TeamsSkill.cs deleted file mode 100644 index 3975757a47..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/TeamsSkill.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills -{ - public class TeamsSkill : SkillDefinition - { - private enum SkillAction - { - TeamsTaskModule, - TeamsCardAction, - TeamsConversation, - Cards, - Proactive, - Attachment, - Auth, - Sso, - Echo, - FileUpload, - Delete, - Update, - } - - public override IList GetActions() - { - return Enum.GetNames(typeof(SkillAction)); - } - - public override Activity CreateBeginActivity(string actionId) - { - if (!Enum.TryParse(actionId, true, out var skillAction)) - { - throw new InvalidOperationException($"Unable to create begin activity for \"{actionId}\"."); - } - - // We don't support special parameters in these skills so a generic event with the right name - // will do in this case. - return new Activity(ActivityTypes.Event) { Name = skillAction.ToString() }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/WaterfallSkill.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/WaterfallSkill.cs deleted file mode 100644 index 9725c05217..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Skills/WaterfallSkill.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills -{ - public class WaterfallSkill : SkillDefinition - { - private enum SkillAction - { - Cards, - Proactive, - Auth, - MessageWithAttachment, - Sso, - FileUpload, - Echo, - Delete, - Update - } - - public override IList GetActions() - { - return Enum.GetNames(typeof(SkillAction)); - } - - public override Activity CreateBeginActivity(string actionId) - { - if (!Enum.TryParse(actionId, true, out var skillAction)) - { - throw new InvalidOperationException($"Unable to create begin activity for \"{actionId}\"."); - } - - // We don't support special parameters in these skills so a generic event with the right name - // will do in this case. - return new Activity(ActivityTypes.Event) { Name = skillAction.ToString() }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/SkillsConfiguration.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/SkillsConfiguration.cs deleted file mode 100644 index 2c80655e23..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/SkillsConfiguration.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Skills; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot -{ - /// - /// A helper class that loads Skills information from configuration. - /// - /// - /// This class loads the skill settings from config and casts them into derived types of - /// so we can render prompts with the skills and in their groups. - /// - public class SkillsConfiguration - { - public SkillsConfiguration(IConfiguration configuration) - { - var section = configuration?.GetSection("BotFrameworkSkills"); - var skills = section?.Get(); - if (skills != null) - { - foreach (var skill in skills) - { - Skills.Add(skill.Id, CreateSkillDefinition(skill)); - } - } - - var skillHostEndpoint = configuration?.GetValue(nameof(SkillHostEndpoint)); - if (!string.IsNullOrWhiteSpace(skillHostEndpoint)) - { - SkillHostEndpoint = new Uri(skillHostEndpoint); - } - } - - public Uri SkillHostEndpoint { get; } - - public Dictionary Skills { get; } = new Dictionary(); - - private static SkillDefinition CreateSkillDefinition(SkillDefinition skill) - { - // Note: we hard code this for now, we should dynamically create instances based on the manifests. - // For now, this code creates a strong typed version of the SkillDefinition based on the skill group - // and copies the info from settings into it. - SkillDefinition skillDefinition; - switch (skill.Group) - { - case "Echo": - skillDefinition = ObjectPath.Assign(new EchoSkill(), skill); - break; - case "Waterfall": - skillDefinition = ObjectPath.Assign(new WaterfallSkill(), skill); - break; - case "Teams": - skillDefinition = ObjectPath.Assign(new TeamsSkill(), skill); - break; - default: - throw new Exception($"Unable to find definition class for {skill.Id}."); - } - - return skillDefinition; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Startup.cs b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Startup.cs deleted file mode 100644 index 3795f176d8..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/Startup.cs +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Authentication; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Bots; -using Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot.Dialogs; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers() - .AddNewtonsoftJson(); - - // Register credential provider. - services.AddSingleton(); - - // Register the skills configuration class. - services.AddSingleton(); - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new AllowedSkillsClaimsValidator(sp.GetService()) }); - - // Register the Bot Framework Adapter with error handling enabled. - // Note: some classes expect a BotAdapter and some expect a BotFrameworkHttpAdapter, so - // register the same adapter instance for both types. - services.AddSingleton(); - services.AddSingleton(sp => sp.GetService()); - - // Register the skills conversation ID factory, the client and the request handler. - services.AddSingleton(); - services.AddHttpClient(); - - //services.AddSingleton(); - services.AddSingleton(); - - // Register the storage we'll be using for User and Conversation state. (Memory is great for testing purposes.) - services.AddSingleton(); - - // Register Conversation state (used by the Dialog system itself). - services.AddSingleton(); - services.AddSingleton(); - - // Register the MainDialog that will be run by the bot. - services.AddSingleton(); - - // Register the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient>(); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles(); - app.UseStaticFiles(); - - // Uncomment this to support HTTPS. - // app.UseHttpsRedirection(); - - app.UseRouting(); - - app.UseWebSockets(); - - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TeamsAppManifest/icon-color.png b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/TeamsAppManifest/icon-color.png deleted file mode 100644 index 48a2de13303e1e8a25f76391f4a34c7c4700fd3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1229 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCe1|JzX3_D&pSWuFnWfl{x;g|9jrEYf8Vqrkk2Ba|%ol3OT){=#|7ID~|e{ zODQ{kU&ME#@`*-tm%Tukt_gFr+`F?$dx9wg-jad`^gsMn2_%Kh%WH91&SjKq5 zgkdI|!exdOVgw@>>=!Tjnk6q)zV*T8$FdgRFYC{kQ7``NOcl@R(_%_8e5e0E;>v0G zEM9kb)2itgOTSfH7M=b3-S61B?PiazMdwXZwrS)^5UUS#HQjaoua5h_{Gx*_Zz|XK z$tf0mZ&=tpf2!!Q)!A_l&o_$g*|JM$VZa~F^0{x1T{=QFu*x$`=V%~jUW=G`iqqp=lquB-`P{Qjw`=zEu3cMc_x7m2f#9m}uoFBMMQ^+%cOL)F_)N@JZ}Axoxi1y= zeebq`y==e!nl+?cK-PhOec!3%|IupShHrcjW8sSt)F1>NW*{ zW%ljk2)nk%-}+F&?gi=7^$L#VeX3@kp%f{n}fR z`}uZPx$IY~r8R5%gMlrc`jP!L3IloKFoq~sFFH5|cdklX=R08T)}71BhaN8$`AsNf0_ zq>WNhAtCd|-nBlTU=y5zl_vXlXZ~bkuaYENMp>3QSQ_#zuYZ+eQh*OIHRxP~s(}ic zN2J4$u=AQcPt)|>F3zZLsjtP;Tajkugx;NcYED2~JVBlVO>{`uAY?Q4O|AA z=16}CJieK^5P_TKnou!zGR`$!PUC)DqtkO;?!`p!+9v3lP_mu=%Vt3BkoWsq%;FN1sp58w*zfr-z^7tIb*q>!yncCjrzLuOk3N+d&~^Cxd| z - /// A specialized to support SSO Token exchanges. - /// - public class TokenExchangeSkillHandler : SkillHandler - { - private const string WaterfallSkillBot = "WaterfallSkillBot"; - - private readonly BotAdapter _adapter; - private readonly SkillsConfiguration _skillsConfig; - private readonly SkillHttpClient _skillClient; - private readonly string _botId; - private readonly SkillConversationIdFactoryBase _conversationIdFactory; - private readonly ILogger _logger; - private readonly IExtendedUserTokenProvider _tokenExchangeProvider; - private readonly IConfiguration _configuration; - - public TokenExchangeSkillHandler( - BotAdapter adapter, - IBot bot, - IConfiguration configuration, - SkillConversationIdFactoryBase conversationIdFactory, - SkillsConfiguration skillsConfig, - SkillHttpClient skillClient, - ICredentialProvider credentialProvider, - AuthenticationConfiguration authConfig, - IChannelProvider channelProvider = null, - ILogger logger = null) - : base(adapter, bot, conversationIdFactory, credentialProvider, authConfig, channelProvider, logger) - { - _adapter = adapter; - _tokenExchangeProvider = adapter as IExtendedUserTokenProvider; - if (_tokenExchangeProvider == null) - { - throw new ArgumentException($"{nameof(adapter)} does not support token exchange"); - } - - _configuration = configuration; - _skillsConfig = skillsConfig; - _skillClient = skillClient; - _conversationIdFactory = conversationIdFactory; - _logger = logger ?? NullLogger.Instance; - _botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - } - - protected override async Task OnSendToConversationAsync(ClaimsIdentity claimsIdentity, string conversationId, Activity activity, CancellationToken cancellationToken = default(CancellationToken)) - { - if (await InterceptOAuthCards(claimsIdentity, activity).ConfigureAwait(false)) - { - return new ResourceResponse(Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture)); - } - - return await base.OnSendToConversationAsync(claimsIdentity, conversationId, activity, cancellationToken).ConfigureAwait(false); - } - - protected override async Task OnReplyToActivityAsync(ClaimsIdentity claimsIdentity, string conversationId, string activityId, Activity activity, CancellationToken cancellationToken = default(CancellationToken)) - { - if (await InterceptOAuthCards(claimsIdentity, activity).ConfigureAwait(false)) - { - return new ResourceResponse(Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture)); - } - - return await base.OnReplyToActivityAsync(claimsIdentity, conversationId, activityId, activity, cancellationToken).ConfigureAwait(false); - } - - private BotFrameworkSkill GetCallingSkill(ClaimsIdentity claimsIdentity) - { - var appId = JwtTokenValidation.GetAppIdFromClaims(claimsIdentity.Claims); - - if (string.IsNullOrWhiteSpace(appId)) - { - return null; - } - - return _skillsConfig.Skills.Values.FirstOrDefault(s => string.Equals(s.AppId, appId, StringComparison.InvariantCultureIgnoreCase)); - } - - private async Task InterceptOAuthCards(ClaimsIdentity claimsIdentity, Activity activity) - { - var oauthCardAttachment = activity.Attachments?.FirstOrDefault(a => a?.ContentType == OAuthCard.ContentType); - if (oauthCardAttachment != null) - { - var targetSkill = GetCallingSkill(claimsIdentity); - if (targetSkill != null) - { - var oauthCard = ((JObject)oauthCardAttachment.Content).ToObject(); - - if (!string.IsNullOrWhiteSpace(oauthCard?.TokenExchangeResource?.Uri)) - { - using (var context = new TurnContext(_adapter, activity)) - { - context.TurnState.Add("BotIdentity", claimsIdentity); - - // We need to know what connection name to use for the token exchange so we figure that out here - var connectionName = targetSkill.Id.Contains(WaterfallSkillBot) ? _configuration.GetSection("SsoConnectionName").Value : _configuration.GetSection("SsoConnectionNameTeams").Value; - - if (string.IsNullOrEmpty(connectionName)) - { - throw new ArgumentNullException("The connection name cannot be null."); - } - - // AAD token exchange - try - { - var result = await _tokenExchangeProvider.ExchangeTokenAsync( - context, - connectionName, - activity.Recipient.Id, - new TokenExchangeRequest() { Uri = oauthCard.TokenExchangeResource.Uri }).ConfigureAwait(false); - - if (!string.IsNullOrEmpty(result?.Token)) - { - // If token above is null, then SSO has failed and hence we return false. - // If not, send an invoke to the skill with the token. - return await SendTokenExchangeInvokeToSkillAsync(activity, oauthCard.TokenExchangeResource.Id, result.Token, oauthCard.ConnectionName, targetSkill, default).ConfigureAwait(false); - } - } - catch (Exception ex) - { - // Show oauth card if token exchange fails. - _logger.LogWarning("Unable to exchange token.", ex); - return false; - } - - return false; - } - } - } - } - - return false; - } - - private async Task SendTokenExchangeInvokeToSkillAsync(Activity incomingActivity, string id, string token, string connectionName, BotFrameworkSkill targetSkill, CancellationToken cancellationToken) - { - var activity = incomingActivity.CreateReply(); - activity.Type = ActivityTypes.Invoke; - activity.Name = SignInConstants.TokenExchangeOperationName; - activity.Value = new TokenExchangeInvokeRequest() - { - Id = id, - Token = token, - ConnectionName = connectionName, - }; - - var skillConversationReference = await _conversationIdFactory.GetSkillConversationReferenceAsync(incomingActivity.Conversation.Id, cancellationToken).ConfigureAwait(false); - activity.Conversation = skillConversationReference.ConversationReference.Conversation; - activity.ServiceUrl = skillConversationReference.ConversationReference.ServiceUrl; - - // route the activity to the skill - var response = await _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, activity, cancellationToken); - - // Check response status: true if success, false if failure - return response.Status >= 200 && response.Status <= 299; - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/WaterfallHostBot.csproj b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/WaterfallHostBot.csproj deleted file mode 100644 index e1954961e8..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/WaterfallHostBot.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - netcoreapp3.1 - latest - Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot - Microsoft.BotFrameworkFunctionalTests.WaterfallHostBot - - - - - - - - - - - - - - - - - diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/appsettings.json b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/appsettings.json deleted file mode 100644 index da8a447b35..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/appsettings.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*", - - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "SsoConnectionName": "", - "SsoConnectionNameTeams": "", - "SkillHostEndpoint": "http://localhost:35020/api/skills/", - "BotFrameworkSkills": [ - { - "Id": "EchoSkillBotDotNet", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:35400/api/messages" - }, - { - "Id": "EchoSkillBotDotNet21", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:35405/api/messages" - }, - { - "Id": "EchoSkillBotDotNetV3", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:35407/api/messages" - }, - { - "Id": "EchoSkillBotJS", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:36400/api/messages" - }, - { - "Id": "EchoSkillBotJSV3", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:36407/api/messages" - }, - { - "Id": "EchoSkillBotPython", - "Group": "Echo", - "AppId": "", - "SkillEndpoint": "http://localhost:37400/api/messages" - }, - { - "Id": "WaterfallSkillBotDotNet", - "Group": "Waterfall", - "AppId": "", - "SkillEndpoint": "http://localhost:35420/api/messages" - }, - { - "Id": "WaterfallSkillBotJS", - "Group": "Waterfall", - "AppId": "", - "SkillEndpoint": "http://localhost:36420/api/messages" - }, - { - "Id": "WaterfallSkillBotPython", - "Group": "Waterfall", - "AppId": "", - "SkillEndpoint": "http://localhost:37420/api/messages" - }, - { - "Id": "TeamsSkillBotDotNet", - "Group": "Teams", - "AppId": "", - "SkillEndpoint": "http://localhost:35430/api/messages" - }, - { - "Id": "TeamsSkillBotJS", - "Group": "Teams", - "AppId": "", - "SkillEndpoint": "http://localhost:36430/api/messages" - }, - { - "Id": "TeamsSkillBotPython", - "Group": "Teams", - "AppId": "", - "SkillEndpoint": "http://localhost:37430/api/messages" - } - ] -} diff --git a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/wwwroot/default.htm b/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/wwwroot/default.htm deleted file mode 100644 index 4f00a9a6d4..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - WaterfallHostBot - - - - - -
-
-
-
WaterfallHostBot Bot
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
- -
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/Directory.Build.props b/tests/functional/Bots/DotNet/Consumers/Composer/Directory.Build.props deleted file mode 100644 index d4378dfc87..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/Directory.Build.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - true - - - - - $(NoWarn);SA1412;NU1701 - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/.gitignore b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/.gitignore deleted file mode 100644 index eaa9cf70cc..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# files generated during the lubuild process -# IMPORTANT: In regular composer bots the generated folder should be excluded and regenerated on the build server -# or by the dev running composer locally. But in this case we include it so we don't have to run bf luis:cross-train -# in the build server -# generated/ diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/BotController.cs deleted file mode 100644 index c87f3cba5e..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/BotController.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Settings; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace SimpleHostBotComposer.Controllers -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [ApiController] - public class BotController : ControllerBase - { - private readonly Dictionary _adapters = new Dictionary(); - private readonly IBot _bot; - private readonly ILogger _logger; - - public BotController( - IConfiguration configuration, - IEnumerable adapters, - IBot bot, - ILogger logger) - { - _bot = bot ?? throw new ArgumentNullException(nameof(bot)); - _logger = logger; - - var adapterSettings = configuration.GetSection(AdapterSettings.AdapterSettingsKey).Get>() ?? new List(); - adapterSettings.Add(AdapterSettings.CoreBotAdapterSettings); - - foreach (var adapter in adapters ?? throw new ArgumentNullException(nameof(adapters))) - { - var settings = adapterSettings.FirstOrDefault(s => s.Enabled && s.Type == adapter.GetType().FullName); - - if (settings != null) - { - _adapters.Add(settings.Route, adapter); - } - } - } - - [HttpPost] - [HttpGet] - [Route("api/{route}")] - public async Task PostAsync(string route) - { - if (string.IsNullOrEmpty(route)) - { - _logger.LogError($"PostAsync: No route provided."); - throw new ArgumentNullException(nameof(route)); - } - - if (_adapters.TryGetValue(route, out IBotFrameworkHttpAdapter adapter)) - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogInformation($"PostAsync: routed '{route}' to {adapter.GetType().Name}"); - } - - // Delegate the processing of the HTTP POST to the appropriate adapter. - // The adapter will invoke the bot. - await adapter.ProcessAsync(Request, Response, _bot).ConfigureAwait(false); - } - else - { - _logger.LogError($"PostAsync: No adapter registered and enabled for route {route}."); - throw new KeyNotFoundException($"No adapter registered and enabled for route {route}."); - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/SkillController.cs deleted file mode 100644 index 4f90bad170..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Controllers/SkillController.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace SimpleHostBotComposer.Controllers -{ - /// - /// A controller that handles skill replies to the bot. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - private readonly ILogger _logger; - - public SkillController(ChannelServiceHandlerBase handler, ILogger logger) - : base(handler) - { - _logger = logger; - } - - public override Task ReplyToActivityAsync(string conversationId, string activityId, Activity activity) - { - try - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug($"ReplyToActivityAsync: conversationId={conversationId}, activityId={activityId}"); - } - - return base.ReplyToActivityAsync(conversationId, activityId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, $"ReplyToActivityAsync: {ex}"); - throw; - } - } - - public override Task SendToConversationAsync(string conversationId, Activity activity) - { - try - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug($"SendToConversationAsync: conversationId={conversationId}"); - } - - return base.SendToConversationAsync(conversationId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, $"SendToConversationAsync: {ex}"); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Program.cs b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Program.cs deleted file mode 100644 index 2fd91a9203..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Program.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; - -namespace SimpleHostBotComposer -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureAppConfiguration((hostingContext, builder) => - { - var applicationRoot = AppDomain.CurrentDomain.BaseDirectory; - var environmentName = hostingContext.HostingEnvironment.EnvironmentName; - var settingsDirectory = "settings"; - - builder.AddBotRuntimeConfiguration(applicationRoot, settingsDirectory, environmentName); - - builder.AddCommandLine(args); - }) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Properties/launchSettings.json deleted file mode 100644 index a9a6d4673c..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35010/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "SimpleHostBotComposerDotNet": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35010", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/README.md b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/README.md deleted file mode 100644 index b48822a762..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Welcome to your new bot - -This bot project was created using the Empty Bot template, and contains a minimal set of files necessary to have a working bot. - -## Next steps - -### Start building your bot - -Composer can help guide you through getting started building your bot. From your bot settings page (the wrench icon on the left navigation rail), click on the rocket-ship icon on the top right for some quick navigation links. - -Another great resource if you're just getting started is the **[guided tutorial](https://docs.microsoft.com/en-us/composer/tutorial/tutorial-introduction)** in our documentation. - -### Connect with your users - -Your bot comes pre-configured to connect to our Web Chat and DirectLine channels, but there are many more places you can connect your bot to - including Microsoft Teams, Telephony, DirectLine Speech, Slack, Facebook, Outlook and more. Check out all of the places you can connect to on the bot settings page. - -### Publish your bot to Azure from Composer - -Composer can help you provision the Azure resources necessary for your bot, and publish your bot to them. To get started, create a publishing profile from your bot settings page in Composer (the wrench icon on the left navigation rail). Make sure you only provision the optional Azure resources you need! - -### Extend your bot with packages - -From Package Manager in Composer you can find useful packages to help add additional pre-built functionality you can add to your bot - everything from simple dialogs & custom actions for working with specific scenarios to custom adapters for connecting your bot to users on clients like Facebook or Slack. - -### Extend your bot with code - -You can also extend your bot with code - simply open up the folder that was generated for you in the location you chose during the creation process with your favorite IDE (like Visual Studio). You can do things like create custom actions that can be used during dialog flows, create custom middleware to pre-process (or post-process) messages, and more. See [our documentation](https://aka.ms/bf-extend-with-code) for more information. diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.botproj b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.botproj deleted file mode 100644 index 12ebc0273a..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.botproj +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/main/Composer/packages/server/schemas/botproject.schema", - "name": "SimpleHostBotComposer", - "skills": { - "echoSkillBotComposerDotNet": { - "manifest": "http://localhost:35410/manifests/echoskillbotcomposer-manifest.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotDotNet": { - "manifest": "http://localhost:35400/manifests/echoskillbot-manifest-1.0.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotDotNet21": { - "manifest": "http://localhost:35405/manifests/echoskillbot-manifest-1.0.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotDotNetV3": { - "manifest": "http://localhost:35407/manifests/echoskillbotv3-manifest-1.0.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotJs": { - "manifest": "http://localhost:36400/manifests/echoskillbot-manifest-1.0.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotJsv3": { - "manifest": "http://localhost:36407/manifests/echoskillbotv3-manifest-1.0.json", - "remote": true, - "endpointName": "default" - }, - "echoSkillBotPython": { - "manifest": "http://localhost:37400/manifests/echoskillbot-manifest-1.0.json", - "remote": true, - "endpointName": "default" - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.csproj b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.csproj deleted file mode 100644 index 796e4f6f76..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/SimpleHostBotComposer.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netcoreapp3.1 - OutOfProcess - c7eabc4e-9c9c-4b56-82d5-23e24f20ee24 - - - - PreserveNewest - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Startup.cs b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Startup.cs deleted file mode 100644 index f9c021bb07..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/Startup.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.StaticFiles; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace SimpleHostBotComposer -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers().AddNewtonsoftJson(); - services.AddBotRuntime(Configuration); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles(); - - // Set up custom content types - associating file extension to MIME type. - var provider = new FileExtensionContentTypeProvider(); - provider.Mappings[".lu"] = "application/vnd.microsoft.lu"; - provider.Mappings[".qna"] = "application/vnd.microsoft.qna"; - - // Expose static files in manifests folder for skill scenarios. - app.UseStaticFiles(new StaticFileOptions - { - ContentTypeProvider = provider - }); - app.UseWebSockets(); - app.UseRouting(); - app.UseAuthorization(); - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/CallEchoSkill.dialog b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/CallEchoSkill.dialog deleted file mode 100644 index 2967ebdbc8..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/CallEchoSkill.dialog +++ /dev/null @@ -1,244 +0,0 @@ -{ - "$kind": "Microsoft.AdaptiveDialog", - "$designer": { - "id": "950uG3", - "name": "CallEchoSkill", - "description": "" - }, - "autoEndDialog": true, - "defaultResultProperty": "dialog.result", - "triggers": [ - { - "$kind": "Microsoft.OnBeginDialog", - "$designer": { - "name": "BeginDialog", - "description": "", - "id": "XuIGWc" - }, - "actions": [ - { - "$kind": "Microsoft.ChoiceInput", - "$designer": { - "id": "AtuOWj" - }, - "defaultLocale": "en-us", - "disabled": false, - "maxTurnCount": 3, - "alwaysPrompt": false, - "allowInterruptions": false, - "unrecognizedPrompt": "", - "invalidPrompt": "", - "defaultValueResponse": "", - "prompt": "${ChoiceInput_Prompt_AtuOWj()}", - "choiceOptions": { - "includeNumbers": true - }, - "property": "dialog.deliveryMode", - "style": "suggestedAction", - "choices": [ - "normal", - "expectReplies" - ] - }, - { - "$kind": "Microsoft.ChoiceInput", - "$designer": { - "id": "DIABs2" - }, - "defaultLocale": "en-us", - "disabled": false, - "maxTurnCount": 3, - "alwaysPrompt": false, - "allowInterruptions": false, - "unrecognizedPrompt": "", - "invalidPrompt": "", - "defaultValueResponse": "", - "prompt": "${ChoiceInput_Prompt_DIABs2()}", - "choiceOptions": { - "includeNumbers": true - }, - "style": "suggestedAction", - "property": "dialog.selectedSkill", - "choices": [ - "EchoSkillBotComposerDotNet", - "EchoSkillBotDotNet", - "EchoSkillBotDotNet21", - "EchoSkillBotDotNetV3", - "EchoSkillBotJS", - "EchoSkillBotJSV3", - "EchoSkillBotPython" - ] - }, - { - "$kind": "Microsoft.TextInput", - "$designer": { - "id": "nJf5rj" - }, - "disabled": false, - "maxTurnCount": 3, - "alwaysPrompt": false, - "allowInterruptions": false, - "unrecognizedPrompt": "", - "invalidPrompt": "", - "defaultValueResponse": "", - "prompt": "${TextInput_Prompt_nJf5rj()}", - "property": "dialog.firstUtterance" - }, - { - "$kind": "Microsoft.SwitchCondition", - "$designer": { - "id": "b3M6yt" - }, - "condition": "dialog.selectedSkill", - "cases": [ - { - "value": "EchoSkillBotComposerDotNet", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "KKS0wY" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotComposerDotNet'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotComposerDotNet'].msAppId", - "activity": "${BeginSkill_Activity_KKS0wY()}" - } - ] - }, - { - "value": "EchoSkillBotDotNet", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "92WLGJ" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotDotNet'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotDotNet'].msAppId", - "activity": "${BeginSkill_Activity_92WLGJ()}" - } - ] - }, - { - "value": "EchoSkillBotDotNet21", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "9zIod8" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotDotNet21'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotDotNet21'].msAppId", - "activity": "${BeginSkill_Activity_9zIod8()}" - } - ] - }, - { - "value": "EchoSkillBotDotNetV3", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "GHbR47" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotDotNetV3'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotDotNetV3'].msAppId", - "activity": "${BeginSkill_Activity_GHbR47()}" - } - ] - }, - { - "value": "EchoSkillBotJS", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "fXOB92" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotJs'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotJs'].msAppId", - "activity": "${BeginSkill_Activity_fXOB92()}" - } - ] - }, - { - "value": "EchoSkillBotJSV3", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "aEVlOJ" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotJsv3'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotJsv3'].msAppId", - "activity": "${BeginSkill_Activity_aEVlOJ()}" - } - ] - }, - { - "value": "EchoSkillBotPython", - "actions": [ - { - "$kind": "Microsoft.BeginSkill", - "$designer": { - "id": "WnhW7c" - }, - "activityProcessed": true, - "botId": "=settings.MicrosoftAppId", - "skillHostEndpoint": "=settings.skillHostEndpoint", - "connectionName": "=settings.connectionName", - "allowInterruptions": true, - "skillEndpoint": "=settings.skill['echoSkillBotPython'].endpointUrl", - "skillAppId": "=settings.skill['echoSkillBotPython'].msAppId", - "activity": "${BeginSkill_Activity_WnhW7c()}" - } - ] - } - ], - "default": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "3NY1Ax" - }, - "activity": "${SendActivity_3NY1Ax()}" - } - ] - } - ] - } - ], - "generator": "CallEchoSkill.lg", - "recognizer": "CallEchoSkill.lu.qna", - "id": "CallEchoSkill" -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/knowledge-base/en-us/CallEchoSkill.en-us.qna b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/knowledge-base/en-us/CallEchoSkill.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-generation/en-us/CallEchoSkill.en-us.lg b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-generation/en-us/CallEchoSkill.en-us.lg deleted file mode 100644 index 8b5225cfbc..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-generation/en-us/CallEchoSkill.en-us.lg +++ /dev/null @@ -1,56 +0,0 @@ -[import](common.lg) - -# ChoiceInput_Prompt_AtuOWj() -[Activity - Text = What delivery mode would you like to use? -] - -# ChoiceInput_Prompt_DIABs2() -[Activity - Text = What skill would you like to call? -] - -# SendActivity_3NY1Ax() -[Activity - Text = We shouldn't hit this because we have validation in the prompt -] - -# BeginSkill_Activity_KKS0wY() -[Activity - Text = ${dialog.firstUtterance} -] - -# TextInput_Prompt_nJf5rj() -[Activity - Text = Type anything to send to the skill. -] - -# BeginSkill_Activity_92WLGJ() -[Activity - Text = ${dialog.firstUtterance} -] - -# BeginSkill_Activity_9zIod8() -[Activity - Text = ${dialog.firstUtterance} -] - -# BeginSkill_Activity_GHbR47() -[Activity - Text = ${dialog.firstUtterance} -] - -# BeginSkill_Activity_fXOB92() -[Activity - Text = ${dialog.firstUtterance} -] - -# BeginSkill_Activity_aEVlOJ() -[Activity - Text = ${dialog.firstUtterance} -] - -# BeginSkill_Activity_WnhW7c() -[Activity - Text = ${dialog.firstUtterance} -] diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-understanding/en-us/CallEchoSkill.en-us.lu b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/language-understanding/en-us/CallEchoSkill.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.en-us.lu.dialog b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.en-us.lu.dialog deleted file mode 100644 index 9980d2dd76..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.en-us.lu.dialog +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$kind": "Microsoft.LuisRecognizer", - "id": "LUIS_CallEchoSkill", - "applicationId": "=settings.luis.CallEchoSkill_en_us_lu.appId", - "version": "=settings.luis.CallEchoSkill_en_us_lu.version", - "endpoint": "=settings.luis.endpoint", - "endpointKey": "=settings.luis.endpointKey" -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.dialog b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.dialog deleted file mode 100644 index e07dee15ef..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.dialog +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$kind": "Microsoft.MultiLanguageRecognizer", - "id": "LUIS_CallEchoSkill", - "recognizers": {} -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.qna.dialog b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.qna.dialog deleted file mode 100644 index 80b77f0d0d..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/CallEchoSkill/recognizers/CallEchoSkill.lu.qna.dialog +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$kind": "Microsoft.CrossTrainedRecognizerSet", - "recognizers": [] -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.lu b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.qna b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/CallEchoSkill.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.lu b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.qna b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/generated/interruption/SimpleHostBotComposer.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/knowledge-base/en-us/simplehostbotcomposer.en-us.qna b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/knowledge-base/en-us/simplehostbotcomposer.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/common.en-us.lg b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/common.en-us.lg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/simplehostbotcomposer.en-us.lg b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/simplehostbotcomposer.en-us.lg deleted file mode 100644 index 333bea8b5e..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-generation/en-us/simplehostbotcomposer.en-us.lg +++ /dev/null @@ -1,26 +0,0 @@ -[import](common.lg) - -# SendActivity_Greeting() -[Activity - Text = Hello and welcome! - InputHint = acceptingInput -] - -# SendActivity_DidNotUnderstand() -[Activity - Text = ${SendActivity_DidNotUnderstand_text()} -] - -# SendActivity_DidNotUnderstand_text() -- Sorry, I didn't get that. -# SendActivity_M2LqJr() -[Activity - Text = Received endOfConversation.\n\nCode: ${turn.activity.code}. - InputHint = acceptingInput -] - -# SendActivity_bgTcyn() -[Activity - Text = Back in the host bot. - InputHint = acceptingInput -] diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-understanding/en-us/simplehostbotcomposer.en-us.lu b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/language-understanding/en-us/simplehostbotcomposer.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/create-azure-resource-command-line.png b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/create-azure-resource-command-line.png deleted file mode 100644 index 497eb8e649d4f1d2d456d337246d01805132ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13842 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 VJv|35z<=2CX{u{u@3nB{{{s`&K;i%Z diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/publish-az-login.png b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/media/publish-az-login.png deleted file mode 100644 index 4e721354bccb6d4a83aa70ca55da1b571c2886db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16726 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 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" - ] - } - ] - }, - "Microsoft.ActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft activity template", - "type": "object", - "required": [ - "template", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "pattern": "^(?!(=)).*", - "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" - }, - "dialogs": { - "type": "array", - "title": "Dialogs", - "description": "Dialogs added to DialogSet.", - "items": { - "$kind": "Microsoft.IDialog", - "title": "Dialog", - "description": "Dialog to add to DialogSet.", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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" - } - ], - "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.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/stringExpression" - } - ] - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.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.13.2" - }, - "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.ConfirmInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Confirm input dialog", - "description": "Collect information - Ask for confirmation (yes or no).", - "type": "object", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/stringExpression" - } - ] - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.ContinueConversation": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue conversation (Queue)", - "description": "Continue a specific conversation (via StorageQueue implementation).", - "type": "object", - "required": [ - "conversationReference", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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" - ] - }, - "conversationReference": { - "$ref": "#/definitions/objectExpression", - "title": "Conversation Reference", - "description": "A conversation reference. (NOTE: Minimum required values or channelId, conversation).", - "examples": [ - { - "channelId": "skype", - "serviceUrl": "http://smba.skype.com", - "conversation": { - "id": "11111" - }, - "bot": { - "id": "22222" - }, - "user": { - "id": "33333" - }, - "locale": "en-us" - } - ] - }, - "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.ContinueConversation" - }, - "$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 StorageQueue implementation).", - "type": "object", - "required": [ - "date", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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" - }, - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.13.2" - }, - "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": [ - "=turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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": [ - "turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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.GetConversationReference": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get ConversationReference", - "description": "Gets the ConversationReference from current context and stores it in property so it can be used to with ContinueConversation action.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.GetConversationReference" - }, - "$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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.", - "default": "turn.results", - "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.13.2" - } - }, - "Microsoft.IAdapter": { - "$role": "interface", - "title": "Bot adapter", - "description": "Component that enables connecting bots to chat clients and applications.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime", - "version": "4.13.2" - }, - "properties": { - "route": { - "type": "string", - "title": "Adapter http route", - "description": "Route where to expose the adapter." - }, - "type": { - "type": "string", - "title": "Adapter type name", - "description": "Adapter type name" - } - } - }, - "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.ContinueConversation" - }, - { - "$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.GetConversationReference" - }, - { - "$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.SendHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEventAction" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - }, - { - "$ref": "#/definitions/Microsoft.ThrowException" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "type": "string", - "pattern": "^(?!(=)).*" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.13.2" - } - }, - "Microsoft.IEntityRecognizer": { - "$role": "interface", - "title": "Entity recognizers", - "description": "Components which derive from EntityRecognizer.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.IfCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "If condition", - "description": "Two-way branch the conversation flow based on a condition.", - "type": "object", - "required": [ - "condition", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.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.13.2" - } - }, - "Microsoft.InputDialog": { - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.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.13.2" - } - }, - "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.13.2" - } - }, - "Microsoft.ITrigger": { - "$role": "interface", - "title": "Microsoft Triggers", - "description": "Components which derive from OnCondition class.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.OnCommandActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnCommandResultActivity" - }, - { - "$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.13.2" - }, - "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.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.13.2" - }, - "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.13.2" - }, - "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": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Text", - "description": "Information to log.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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 before each request.", - "type": "object", - "required": [ - "connectionName", - "$kind" - ], - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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. WARNING: Changing this location is not recommended as you should call OAuthInput immediately before each use of the token.", - "default": "turn.token", - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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 apply an operation on a property and value.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation filter on event." - }, - "property": { - "type": "string", - "title": "Property", - "description": "Property filter on event." - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value filter on 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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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 value is ambiguous for operator and property.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation filter on event." - }, - "property": { - "type": "string", - "title": "Property", - "description": "Property filter on event." - }, - "value": { - "type": "string", - "title": "Ambiguous value", - "description": "Ambiguous value filter on 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/numberExpression", - "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 ambiguous intent", - "description": "Actions to perform on when an intent is ambiguous.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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 and operations.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "type": "object", - "required": [ - "$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/numberExpression", - "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.OnCommandActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Command activity", - "description": "Actions to perform on receipt of an activity with type 'Command'. Overrides Intent trigger.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.OnCommandActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCommandResultActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Command Result activity", - "description": "Actions to perform on receipt of an activity with type 'CommandResult'. Overrides Intent trigger.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.OnCommandResultActivity" - }, - "$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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "event", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "type": "object", - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$policies": { - "nonInteractive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.SendHandoffActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send a handoff activity", - "description": "Sends a handoff activity to trigger a handoff request.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "context": { - "$ref": "#/definitions/objectExpression", - "title": "Context", - "description": "Context to send with the handoff request" - }, - "transcript": { - "$ref": "#/definitions/objectExpression", - "title": "transcript", - "description": "Transcript to send with the handoff request" - }, - "$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.SendHandoffActivity" - }, - "$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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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" - ], - "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.TelemetryTrackEventAction": { - "$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.13.2" - }, - "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.TelemetryTrackEventAction" - }, - "$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.13.2" - }, - "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.13.2" - }, - "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.", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TrueSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UpdateActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Update an activity", - "description": "Respond with an activity.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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": [ - "=turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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." - } - } - }, - "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/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/sdk.uischema b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/sdk.uischema deleted file mode 100644 index 9cf19c6919..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/sdk.uischema +++ /dev/null @@ -1,1409 +0,0 @@ -{ - "$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": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "footer": { - "description": "= Default operation", - "property": "=action.defaultOperation", - "widget": "PropertyDescription" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "hideFooter": "=!action.defaultOperation", - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response to ask a question", - "order": [ - "activity", - "*" - ], - "subtitle": "Ask Activity" - } - }, - "Microsoft.AttachmentInput": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "dialog": "=action.dialog", - "widget": "DialogRef" - }, - "footer": { - "description": "= Return value", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "operation": "Host", - "resource": "=coalesce(action.skillEndpoint, \"?\")", - "singleline": true, - "widget": "ResourceOperation" - }, - "colors": { - "color": "#FFFFFF", - "icon": "#FFFFFF", - "theme": "#004578" - }, - "footer": { - "description": "= Result", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "icon": "Library", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "description": "(Event)", - "property": "=coalesce(action.eventName, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Cancel all active dialogs", - "subtitle": "Cancel All Dialogs" - } - }, - "Microsoft.ChoiceInput": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "items": "=action.properties", - "widget": "ListOverview" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete properties", - "properties": { - "properties": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Properties" - } - }, - "Microsoft.DeleteProperty": { - "flow": { - "body": "=action.property", - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete a property", - "properties": { - "property": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Property" - } - }, - "Microsoft.EditActions": { - "flow": { - "body": "=action.changeType", - "widget": "ActionCard" - }, - "form": { - "label": "Modify active dialog", - "subtitle": "Edit Actions" - } - }, - "Microsoft.EditArray": { - "flow": { - "body": { - "operation": "=coalesce(action.changeType, \"?\")", - "resource": "=coalesce(action.itemsProperty, \"?\")", - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Result", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "description": "(Event)", - "property": "=coalesce(action.eventName, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "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": { - "flow": { - "loop": { - "body": "=concat(\"Each value in \", coalesce(action.itemsProperty, \"?\"))", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "ForeachWidget" - }, - "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": { - "flow": { - "loop": { - "body": "=concat(\"Each page of \", coalesce(action.pageSize, \"?\"), \" in \", coalesce(action.page, \"?\"))", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "ForeachWidget" - }, - "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.GetActivityMembers": { - "flow": { - "body": { - "description": "= ActivityId", - "property": "=coalesce(action.activityId, \"?\")", - "widget": "PropertyDescription" - }, - "footer": { - "description": "= Result property", - "property": "=coalesce(action.property, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - } - }, - "Microsoft.GetConversationMembers": { - "flow": { - "footer": { - "description": "= Result property", - "property": "=action.property", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - } - }, - "Microsoft.HttpRequest": { - "flow": { - "body": { - "operation": "=action.method", - "resource": "=action.url", - "singleline": true, - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Result property", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "judgement": { - "body": "=coalesce(action.condition, \"\")", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "IfConditionWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "operation": "Connection", - "resource": "=coalesce(action.connectionName, \"?\")", - "singleline": true, - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Token property", - "property": "=action.property", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.property", - "widget": "ActionCard" - }, - "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" - }, - "trigger": { - "label": "Activities (Activity received)", - "order": 5.1, - "submenu": { - "label": "Activities", - "placeholder": "Select an activity type", - "prompt": "Which activity type?" - } - } - }, - "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" - }, - "trigger": { - "label": "Dialog started (Begin dialog event)", - "order": 4.1, - "submenu": { - "label": "Dialog events", - "placeholder": "Select an event type", - "prompt": "Which event?" - } - } - }, - "Microsoft.OnCancelDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog cancelled", - "order": [ - "condition", - "*" - ], - "subtitle": "Cancel dialog event" - }, - "trigger": { - "label": "Dialog cancelled (Cancel dialog event)", - "order": 4.2, - "submenu": "Dialog events" - } - }, - "Microsoft.OnChooseEntity": { - "form": { - "hidden": [ - "actions" - ], - "order": [ - "condition", - "*" - ] - } - }, - "Microsoft.OnChooseIntent": { - "form": { - "hidden": [ - "actions" - ], - "order": [ - "condition", - "*" - ] - }, - "trigger": { - "label": "Duplicated intents recognized", - "order": 6 - } - }, - "Microsoft.OnCommandActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Command received", - "order": [ - "condition", - "*" - ], - "subtitle": "Command activity received" - }, - "trigger": { - "label": "Command received (Command activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "Microsoft.OnCommandResultActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Command Result received", - "order": [ - "condition", - "*" - ], - "subtitle": "Command Result activity received" - }, - "trigger": { - "label": "Command Result received (Command Result activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "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" - }, - "trigger": { - "label": "Greeting (ConversationUpdate activity)", - "order": 5.2, - "submenu": "Activities" - } - }, - "Microsoft.OnDialogEvent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog events", - "order": [ - "condition", - "*" - ], - "subtitle": "Dialog event" - }, - "trigger": { - "label": "Custom events", - "order": 7 - } - }, - "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" - }, - "trigger": { - "label": "Conversation ended (EndOfConversation activity)", - "order": 5.3, - "submenu": "Activities" - } - }, - "Microsoft.OnError": { - "form": { - "hidden": [ - "actions" - ], - "label": "Error occurred", - "order": [ - "condition", - "*" - ], - "subtitle": "Error event" - }, - "trigger": { - "label": "Error occurred (Error event)", - "order": 4.3, - "submenu": "Dialog events" - } - }, - "Microsoft.OnEventActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Event received", - "order": [ - "condition", - "*" - ], - "subtitle": "Event activity" - }, - "trigger": { - "label": "Event received (Event activity)", - "order": 5.4, - "submenu": "Activities" - } - }, - "Microsoft.OnHandoffActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handover to human", - "order": [ - "condition", - "*" - ], - "subtitle": "Handoff activity" - }, - "trigger": { - "label": "Handover to human (Handoff activity)", - "order": 5.5, - "submenu": "Activities" - } - }, - "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" - }, - "trigger": { - "label": "Intent recognized", - "order": 1 - } - }, - "Microsoft.OnInvokeActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Conversation invoked", - "order": [ - "condition", - "*" - ], - "subtitle": "Invoke activity" - }, - "trigger": { - "label": "Conversation invoked (Invoke activity)", - "order": 5.6, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message received", - "order": [ - "condition", - "*" - ], - "subtitle": "Message activity received" - }, - "trigger": { - "label": "Message received (Message activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageDeleteActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message deleted", - "order": [ - "condition", - "*" - ], - "subtitle": "Message deleted activity" - }, - "trigger": { - "label": "Message deleted (Message deleted activity)", - "order": 5.82, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageReactionActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message reaction", - "order": [ - "condition", - "*" - ], - "subtitle": "Message reaction activity" - }, - "trigger": { - "label": "Message reaction (Message reaction activity)", - "order": 5.83, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageUpdateActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message updated", - "order": [ - "condition", - "*" - ], - "subtitle": "Message updated activity" - }, - "trigger": { - "label": "Message updated (Message updated activity)", - "order": 5.84, - "submenu": "Activities" - } - }, - "Microsoft.OnQnAMatch": { - "trigger": { - "label": "QnA Intent recognized", - "order": 2 - } - }, - "Microsoft.OnRepromptDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Re-prompt for input", - "order": [ - "condition", - "*" - ], - "subtitle": "Reprompt dialog event" - }, - "trigger": { - "label": "Re-prompt for input (Reprompt dialog event)", - "order": 4.4, - "submenu": "Dialog events" - } - }, - "Microsoft.OnTypingActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "User is typing", - "order": [ - "condition", - "*" - ], - "subtitle": "Typing activity" - }, - "trigger": { - "label": "User is typing (Typing activity)", - "order": 5.7, - "submenu": "Activities" - } - }, - "Microsoft.OnUnknownIntent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Unknown intent", - "order": [ - "condition", - "*" - ], - "subtitle": "Unknown intent recognized" - }, - "trigger": { - "label": "Unknown intent", - "order": 3 - } - }, - "Microsoft.QnAMakerDialog": { - "flow": { - "body": "=action.hostname", - "widget": "ActionCard" - } - }, - "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": { - "flow": { - "body": { - "dialog": "=action.dialog", - "widget": "DialogRef" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Replace this dialog", - "order": [ - "dialog", - "options", - "*" - ], - "subtitle": "Replace Dialog" - } - }, - "Microsoft.SendActivity": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response", - "order": [ - "activity", - "*" - ], - "subtitle": "Send Activity" - } - }, - "Microsoft.SendHandoffActivity": { - "flow": { - "widget": "ActionHeader" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-handoff-activity", - "label": "Send a handoff request", - "subtitle": "Send Handoff Activity" - }, - "menu": { - "label": "Send Handoff Event", - "submenu": [ - "Access external resources" - ] - } - }, - "Microsoft.SetProperties": { - "flow": { - "body": { - "items": "=foreach(action.assignments, x => concat(coalesce(x.property, \"?\"), \" : \", coalesce(x.value, \"?\")))", - "widget": "ListOverview" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Set properties", - "properties": { - "assignments": { - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - } - } - }, - "subtitle": "Set Properties" - } - }, - "Microsoft.SetProperty": { - "flow": { - "body": "${coalesce(action.property, \"?\")} : ${coalesce(action.value, \"?\")}", - "widget": "ActionCard" - }, - "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": { - "flow": { - "judgement": { - "body": "=coalesce(action.condition, \"\")", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "SwitchConditionWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for text", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Text Input" - } - }, - "Microsoft.ThrowException": { - "flow": { - "body": { - "description": "= ErrorValue", - "property": "=coalesce(action.errorValue, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "form": { - "label": "Throw an exception", - "subtitle": "Throw an exception" - } - }, - "Microsoft.TraceActivity": { - "form": { - "helpLink": "https://aka.ms/composer-telemetry", - "label": "Emit a trace event", - "subtitle": "Trace Activity" - } - }, - "Microsoft.UpdateActivity": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#656565", - "theme": "#D7D7D7" - }, - "icon": "MessageBot", - "title": "Update activity", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "form": { - "label": "Update an activity", - "subtitle": "Update Activity" - } - } -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.ps1 b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.ps1 deleted file mode 100644 index 67715586e4..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -$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." - -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" "!**/generated" "../*.csproj" "../package.json" -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/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.sh b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.sh deleted file mode 100644 index 50beec9c4c..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/schemas/update-schema.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -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." -[ -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" "!**/generated" "../*.csproj" "../package.json" -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/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/settings/appsettings.json b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/settings/appsettings.json deleted file mode 100644 index 5743912bbc..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/settings/appsettings.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "customFunctions": [], - "defaultLanguage": "en-us", - "defaultLocale": "en-us", - "importedLibraries": [], - "languages": [ - "en-us" - ], - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "luFeatures": { - "enableCompositeEntities": true, - "enableListEntities": true, - "enableMLEntities": true, - "enablePattern": true, - "enablePhraseLists": true, - "enablePrebuiltEntities": true, - "enableRegexEntities": true - }, - "luis": { - "authoringEndpoint": "", - "authoringRegion": "", - "defaultLanguage": "en-us", - "endpoint": "", - "environment": "composer", - "name": "SimpleHostBotComposer" - }, - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "publishTargets": [], - "qna": { - "hostname": "", - "knowledgebaseid": "", - "qnaRegion": "westus" - }, - "runtime": { - "command": "dotnet run --project SimpleHostBotComposer.csproj", - "customRuntime": true, - "key": "adaptive-runtime-dotnet-webapp", - "path": "../" - }, - "runtimeSettings": { - "adapters": [], - "features": { - "removeRecipientMentions": false, - "showTyping": false, - "traceTranscript": false, - "useInspection": false, - "setSpeak": { - "voiceFontName": "en-US-AriaNeural", - "fallbackToTextForSpeechIfEmpty": true - } - }, - "components": [], - "skills": { - "allowedCallers": [ - "*" - ] - }, - "storage": "", - "telemetry": { - "logActivities": true, - "logPersonalInformation": false, - "options": { - "connectionString": "" - } - } - }, - "downsampling": { - "maxImbalanceRatio": -1 - }, - "skillConfiguration": {}, - "skillHostEndpoint": "http://localhost:35010/api/skills", - "skill": { - "echoSkillBotComposerDotNet": { - "endpointUrl": "http://localhost:35410/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotDotNet": { - "endpointUrl": "http://localhost:35400/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotDotNet21": { - "endpointUrl": "http://localhost:35405/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotDotNetV3": { - "endpointUrl": "http://localhost:35407/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotJs": { - "endpointUrl": "http://localhost:36400/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotJsv3": { - "endpointUrl": "http://localhost:36407/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - }, - "echoSkillBotPython": { - "endpointUrl": "http://localhost:37400/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/simplehostbotcomposer.dialog b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/simplehostbotcomposer.dialog deleted file mode 100644 index d72a4dcbd3..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/simplehostbotcomposer.dialog +++ /dev/null @@ -1,104 +0,0 @@ -{ - "$kind": "Microsoft.AdaptiveDialog", - "$designer": { - "name": "SimpleHostBotComposer", - "description": "", - "id": "A79tBe" - }, - "autoEndDialog": true, - "defaultResultProperty": "dialog.result", - "triggers": [ - { - "$kind": "Microsoft.OnConversationUpdateActivity", - "$designer": { - "id": "376720" - }, - "actions": [ - { - "$kind": "Microsoft.Foreach", - "$designer": { - "id": "518944", - "name": "Loop: for each item" - }, - "itemsProperty": "turn.Activity.membersAdded", - "actions": [ - { - "$kind": "Microsoft.IfCondition", - "$designer": { - "id": "641773", - "name": "Branch: if/else" - }, - "condition": "string(dialog.foreach.value.id) != string(turn.Activity.Recipient.id)", - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "859266", - "name": "Send a response" - }, - "activity": "${SendActivity_Greeting()}" - }, - { - "$kind": "Microsoft.BeginDialog", - "$designer": { - "id": "fTvoh5" - }, - "activityProcessed": true, - "dialog": "CallEchoSkill" - } - ] - } - ] - } - ] - }, - { - "$kind": "Microsoft.OnUnknownIntent", - "$designer": { - "id": "mb2n1u" - }, - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "kMjqz1" - }, - "activity": "${SendActivity_DidNotUnderstand()}" - } - ] - }, - { - "$kind": "Microsoft.OnEndOfConversationActivity", - "$designer": { - "id": "xPU1pB" - }, - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "M2LqJr" - }, - "activity": "${SendActivity_M2LqJr()}" - }, - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "bgTcyn" - }, - "activity": "${SendActivity_bgTcyn()}" - }, - { - "$kind": "Microsoft.BeginDialog", - "$designer": { - "id": "s9BrZr" - }, - "activityProcessed": true, - "dialog": "CallEchoSkill" - } - ] - } - ], - "generator": "SimpleHostBotComposer.lg", - "id": "SimpleHostBotComposer", - "recognizer": "SimpleHostBotComposer.lu.qna" -} diff --git a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/wwwroot/default.htm b/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/wwwroot/default.htm deleted file mode 100644 index 8ddd3ef885..0000000000 --- a/tests/functional/Bots/DotNet/Consumers/Composer/SimpleHostBotComposer/wwwroot/default.htm +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - - SimpleHostBotComposer - - - - - -
-
-
-
SimpleHostBotComposer
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
-
-
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/FunctionalTestsBots.sln b/tests/functional/Bots/DotNet/FunctionalTestsBots.sln deleted file mode 100644 index ea5591067b..0000000000 --- a/tests/functional/Bots/DotNet/FunctionalTestsBots.sln +++ /dev/null @@ -1,106 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30621.155 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Consumers", "Consumers", "{12088D79-235C-4387-9DA8-69AB93D52A8E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skills", "Skills", "{39117C87-FD02-40CD-A9A9-9A4C0A630521}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeFirst", "CodeFirst", "{C7A60083-78C8-4CEF-A358-4E53CBF0D12A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleHostBot", "Consumers\CodeFirst\SimpleHostBot\SimpleHostBot.csproj", "{AAE978F8-D22B-41E8-B445-872FF4194713}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleHostBot-2.1", "Consumers\CodeFirst\SimpleHostBot-2.1\SimpleHostBot-2.1.csproj", "{0443C38C-A0DF-4A1A-8931-4A4BFFEEB386}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeFirst", "CodeFirst", "{6EF38D8C-7953-4D54-BA31-FFF055B7B217}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EchoSkillBot-2.1", "Skills\CodeFirst\EchoSkillBot-2.1\EchoSkillBot-2.1.csproj", "{56864219-785B-4600-9849-43CAF90F37E9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EchoSkillBot", "Skills\CodeFirst\EchoSkillBot\EchoSkillBot.csproj", "{692F26DD-F7BA-49F3-AC6D-73047C1E5D61}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Composer", "Composer", "{33FA275E-9E5D-4582-BFF7-24B2C5DB2962}" - ProjectSection(SolutionItems) = preProject - Consumers\Composer\Directory.Build.props = Consumers\Composer\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Composer", "Composer", "{33E2281F-C6A7-40EC-961A-FF9FF254FDDC}" - ProjectSection(SolutionItems) = preProject - Skills\Composer\Directory.Build.props = Skills\Composer\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WaterfallHostBot", "Consumers\CodeFirst\WaterfallHostBot\WaterfallHostBot.csproj", "{15A946BE-39F9-4945-9895-0019ED3392FC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WaterfallSkillBot", "Skills\CodeFirst\WaterfallSkillBot\WaterfallSkillBot.csproj", "{E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EchoSkillBot-v3", "Skills\CodeFirst\EchoSkillBot-v3\EchoSkillBot-v3.csproj", "{41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleHostBotComposer", "Consumers\Composer\SimpleHostBotComposer\SimpleHostBotComposer.csproj", "{FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EchoSkillBotComposer", "Skills\Composer\EchoSkillBotComposer\EchoSkillBotComposer.csproj", "{9BA47CF9-7D90-4B5C-A9FA-01797A435D53}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AAE978F8-D22B-41E8-B445-872FF4194713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AAE978F8-D22B-41E8-B445-872FF4194713}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AAE978F8-D22B-41E8-B445-872FF4194713}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AAE978F8-D22B-41E8-B445-872FF4194713}.Release|Any CPU.Build.0 = Release|Any CPU - {0443C38C-A0DF-4A1A-8931-4A4BFFEEB386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0443C38C-A0DF-4A1A-8931-4A4BFFEEB386}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0443C38C-A0DF-4A1A-8931-4A4BFFEEB386}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0443C38C-A0DF-4A1A-8931-4A4BFFEEB386}.Release|Any CPU.Build.0 = Release|Any CPU - {56864219-785B-4600-9849-43CAF90F37E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56864219-785B-4600-9849-43CAF90F37E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56864219-785B-4600-9849-43CAF90F37E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56864219-785B-4600-9849-43CAF90F37E9}.Release|Any CPU.Build.0 = Release|Any CPU - {692F26DD-F7BA-49F3-AC6D-73047C1E5D61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {692F26DD-F7BA-49F3-AC6D-73047C1E5D61}.Debug|Any CPU.Build.0 = Debug|Any CPU - {692F26DD-F7BA-49F3-AC6D-73047C1E5D61}.Release|Any CPU.ActiveCfg = Release|Any CPU - {692F26DD-F7BA-49F3-AC6D-73047C1E5D61}.Release|Any CPU.Build.0 = Release|Any CPU - {15A946BE-39F9-4945-9895-0019ED3392FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15A946BE-39F9-4945-9895-0019ED3392FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15A946BE-39F9-4945-9895-0019ED3392FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {15A946BE-39F9-4945-9895-0019ED3392FC}.Release|Any CPU.Build.0 = Release|Any CPU - {E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3}.Release|Any CPU.Build.0 = Release|Any CPU - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3}.Release|Any CPU.Build.0 = Release|Any CPU - {FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6}.Release|Any CPU.Build.0 = Release|Any CPU - {9BA47CF9-7D90-4B5C-A9FA-01797A435D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BA47CF9-7D90-4B5C-A9FA-01797A435D53}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BA47CF9-7D90-4B5C-A9FA-01797A435D53}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BA47CF9-7D90-4B5C-A9FA-01797A435D53}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {C7A60083-78C8-4CEF-A358-4E53CBF0D12A} = {12088D79-235C-4387-9DA8-69AB93D52A8E} - {AAE978F8-D22B-41E8-B445-872FF4194713} = {C7A60083-78C8-4CEF-A358-4E53CBF0D12A} - {0443C38C-A0DF-4A1A-8931-4A4BFFEEB386} = {C7A60083-78C8-4CEF-A358-4E53CBF0D12A} - {6EF38D8C-7953-4D54-BA31-FFF055B7B217} = {39117C87-FD02-40CD-A9A9-9A4C0A630521} - {56864219-785B-4600-9849-43CAF90F37E9} = {6EF38D8C-7953-4D54-BA31-FFF055B7B217} - {692F26DD-F7BA-49F3-AC6D-73047C1E5D61} = {6EF38D8C-7953-4D54-BA31-FFF055B7B217} - {33FA275E-9E5D-4582-BFF7-24B2C5DB2962} = {12088D79-235C-4387-9DA8-69AB93D52A8E} - {33E2281F-C6A7-40EC-961A-FF9FF254FDDC} = {39117C87-FD02-40CD-A9A9-9A4C0A630521} - {15A946BE-39F9-4945-9895-0019ED3392FC} = {C7A60083-78C8-4CEF-A358-4E53CBF0D12A} - {E3BECBEF-E41F-48D1-9EEB-A4D7E1CD34E3} = {6EF38D8C-7953-4D54-BA31-FFF055B7B217} - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3} = {6EF38D8C-7953-4D54-BA31-FFF055B7B217} - {FDC53B3A-0E15-4FDF-A587-05C8F90BC2B6} = {33FA275E-9E5D-4582-BFF7-24B2C5DB2962} - {9BA47CF9-7D90-4B5C-A9FA-01797A435D53} = {33E2281F-C6A7-40EC-961A-FF9FF254FDDC} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {2B77A921-EEA6-4006-ABD2-159C92F9F874} - EndGlobalSection -EndGlobal diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Authentication/AllowedCallersClaimsValidator.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Authentication/AllowedCallersClaimsValidator.cs deleted file mode 100644 index 5b0b053639..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Authentication/AllowedCallersClaimsValidator.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that requests are coming from allowed parent bots. - /// - public class AllowedCallersClaimsValidator : ClaimsValidator - { - private const string ConfigKey = "AllowedCallers"; - private readonly List _allowedCallers; - - /// - /// Initializes a new instance of the class. - /// Loads the appIds for the configured callers. Only allows access to callers it has configured. - /// - /// The list of configured callers. - public AllowedCallersClaimsValidator(IConfiguration config) - { - if (config == null) - { - throw new ArgumentNullException(nameof(config)); - } - - // AllowedCallers is the setting in the appsettings.json file - // that consists of the list of parent bot IDs that are allowed to access the skill. - // To add a new parent bot, simply edit the AllowedCallers and add - // the parent bot's Microsoft app ID to the list. - // In this sample, we allow all callers if AllowedCallers contains an "*". - var section = config.GetSection(ConfigKey); - var appsList = section.Get(); - if (appsList == null) - { - throw new ArgumentNullException($"\"{ConfigKey}\" not found in configuration."); - } - - _allowedCallers = new List(appsList); - } - - /// - /// Checks that the appId claim in the skill request is in the list of callers configured for this bot. - /// - /// The list of claims to validate. - /// A task that represents the work queued to execute. - public override Task ValidateClaimsAsync(IList claims) - { - // If _allowedCallers contains an "*", we allow all callers. - if (SkillValidation.IsSkillClaim(claims) && !_allowedCallers.Contains("*")) - { - // Check that the appId claim in the skill request is in the list of callers configured for this bot. - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedCallers.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from a bot with an app ID of \"{appId}\". To enable requests from this caller, add the app ID to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Bots/EchoBot.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Bots/EchoBot.cs deleted file mode 100644 index 14cccdbc7a..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Bots/EchoBot.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21.Bots -{ - public class EchoBot : ActivityHandler - { - /// - /// Processes a message activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (turnContext.Activity.Text.Contains("end") || turnContext.Activity.Text.Contains("stop")) - { - // Send End of conversation at the end. - await turnContext.SendActivityAsync(MessageFactory.Text($"Ending conversation from the skill..."), cancellationToken); - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully; - await turnContext.SendActivityAsync(endOfConversation, cancellationToken); - } - else - { - await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); - await turnContext.SendActivityAsync(MessageFactory.Text("Say \"end\" or \"stop\" and I'll end the conversation and back to the parent."), cancellationToken); - } - } - - /// - /// Processes an end of conversation activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override Task OnEndOfConversationActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - // This will be called if the host bot is ending the conversation. Sending additional messages should be - // avoided as the conversation may have been deleted. - // Perform cleanup of resources if needed. - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Controllers/BotController.cs deleted file mode 100644 index c2fe9a198a..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Controllers/BotController.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21.Controllers -{ - /// - /// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot implementation at runtime. - /// Multiple different IBot implementations running at different endpoints can be achieved by specifying a more specific type for the bot constructor argument. - /// - [Route("api/messages")] - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - - /// - /// Initializes a new instance of the class. - /// - /// Adapter for the BotController. - /// Bot for the BotController. - public BotController(IBotFrameworkHttpAdapter adapter, IBot bot) - { - _adapter = adapter; - _bot = bot; - } - - /// - /// Processes an HttpPost request. - /// - /// A representing the result of the asynchronous operation. - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/EchoSkillBot-2.1.csproj b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/EchoSkillBot-2.1.csproj deleted file mode 100644 index 2df857a613..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/EchoSkillBot-2.1.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - netcoreapp2.1 - latest - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21 - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21 - - - - DEBUG;TRACE - - - - - - - - - - Always - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Program.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Program.cs deleted file mode 100644 index bdfda7669a..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Program.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21 -{ - public class Program - { - /// - /// The entry point of the application. - /// - /// The command line args. - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - /// - /// Creates a new instance of the class with pre-configured defaults. - /// - /// The command line args. - /// The initialized . - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Properties/launchSettings.json deleted file mode 100644 index 791f7e6a3b..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35405/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "EchoSkillBotDotNet21": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35405/", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/SkillAdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/SkillAdapterWithErrorHandler.cs deleted file mode 100644 index 76ef40f872..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/SkillAdapterWithErrorHandler.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21 -{ - public class SkillAdapterWithErrorHandler : BotFrameworkHttpAdapter - { - /// - /// Initializes a new instance of the class to handle errors. - /// - /// The configuration properties. - /// An implementation of the bots credentials. - /// The configuration setting for the authentication. - /// An instance of a logger. - /// A state management object for the conversation. - public SkillAdapterWithErrorHandler(IConfiguration configuration, ICredentialProvider credentialProvider, AuthenticationConfiguration authConfig, ILogger logger) - : base(configuration, credentialProvider, authConfig, logger: logger) - { - OnTurnError = async (turnContext, exception) => - { - try - { - // Log any leaked exception from the application. - logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - // Send a message to the user - var errorMessageText = "The skill encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText + Environment.NewLine + exception, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator - // Note: we return the entire exception in the value property to help the developer, this should not be done in prod. - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError"); - - // Send and EndOfConversation activity to the skill caller with the error to end the conversation - // and let the caller decide what to do. - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "SkillError"; - endOfConversation.Text = exception.Message; - await turnContext.SendActivityAsync(endOfConversation); - } - catch (Exception ex) - { - logger.LogError(ex, $"Exception caught in SkillAdapterWithErrorHandler : {ex}"); - } - }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Startup.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Startup.cs deleted file mode 100644 index 1c0bacc9bd..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/Startup.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21.Bots; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot21 -{ - public class Startup - { - public Startup(IConfiguration config) - { - Configuration = config; - } - - public IConfiguration Configuration { get; } - - /// - /// This method gets called by the runtime. Use this method to add services to the container. - /// - /// Method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); - - // Configure credentials - services.AddSingleton(); - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new Authentication.AllowedCallersClaimsValidator(sp.GetService()) }); - - // Create the Bot Framework Adapter with error handling enabled. - services.AddSingleton(); - - // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient(); - - if (!string.IsNullOrEmpty(Configuration["ChannelService"])) - { - // Register a ConfigurationChannelProvider -- this is only for Azure Gov. - services.AddSingleton(); - } - } - - /// - /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - /// - /// The application request pipeline to be configured. - /// The web hosting environment. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseHsts(); - } - - app.UseDefaultFiles(); - app.UseStaticFiles(); - - // app.UseHttpsRedirection(); - app.UseMvc(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/appsettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/appsettings.json deleted file mode 100644 index c61cdb4d79..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/appsettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "ChannelService": "", - // This is a comma separate list with the App IDs that will have access to the skill. - // This setting is used in AllowedCallersClaimsValidator. - // Examples: - // [ "*" ] allows all callers. - // [ "AppId1", "AppId2" ] only allows access to parent bots with "AppId1" and "AppId2". - "AllowedCallers": [ "*" ] -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/default.htm b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/default.htm deleted file mode 100644 index 56d1b43377..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - EchoSkillBot-2.1DotNet - - - - - -
-
-
-
EchoSkillBot-2.1DotNet Bot
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
- -
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/manifests/echoskillbot-manifest-1.0.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/manifests/echoskillbot-manifest-1.0.json deleted file mode 100644 index 68b6a165ff..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-2.1/wwwroot/manifests/echoskillbot-manifest-1.0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json", - "$id": "EchoSkillBotDotNet21", - "name": "EchoSkillBotDotNet21", - "version": "1.0", - "description": "This is a skill for echoing what the user sent to the bot (using .netcore 2.1).", - "publisherName": "Microsoft", - "privacyUrl": "https://microsoft.com/privacy", - "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.", - "license": "https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE", - "tags": [ - "echo" - ], - "endpoints": [ - { - "name": "default", - "protocol": "BotFrameworkV3", - "description": "Localhost endpoint for the skill (on port 35405)", - "endpointUrl": "http://localhost:35405/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - ] -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/ApiControllerActionInvokerWithErrorHandler.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/ApiControllerActionInvokerWithErrorHandler.cs deleted file mode 100644 index 4ad82c1409..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/ApiControllerActionInvokerWithErrorHandler.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; -using Newtonsoft.Json; -using System.IO; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using System.Web.Http.Controllers; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3 -{ - /// - /// Web Api Controller to intersect HTTP operations when the Action Invoker is triggered to capture exceptions and send it to the bot as an Activity. - /// - internal class ApiControllerActionInvokerWithErrorHandler : ApiControllerActionInvoker - { - public async override Task InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken) - { - var result = base.InvokeActionAsync(actionContext, cancellationToken); - - if (result.Exception != null && result.Exception.GetBaseException() != null) - { - var stream = new StreamReader(actionContext.Request.Content.ReadAsStreamAsync().Result); - stream.BaseStream.Position = 0; - var rawRequest = stream.ReadToEnd(); - var activity = JsonConvert.DeserializeObject(rawRequest); - - activity.Type = "exception"; - activity.Text = result.Exception.ToString(); - activity.Value = result.Exception; - - await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); - } - - return await result; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/App_Start/WebApiConfig.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/App_Start/WebApiConfig.cs deleted file mode 100644 index 97fc72a901..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/App_Start/WebApiConfig.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using System.Web.Http; -using System.Web.Http.Controllers; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3 -{ - public static class WebApiConfig - { - public static void Register(HttpConfiguration config) - { - // Json settings - config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; - config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); - config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; - JsonConvert.DefaultSettings = () => new JsonSerializerSettings() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - Formatting = Newtonsoft.Json.Formatting.Indented, - NullValueHandling = NullValueHandling.Ignore, - }; - - // Web API configuration and services - - // Web API routes - config.MapHttpAttributeRoutes(); - - config.Routes.MapHttpRoute( - name: "DefaultApi", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional } - ); - config.Services.Replace(typeof(IHttpActionInvoker), new ApiControllerActionInvokerWithErrorHandler()); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomAllowedCallersClaimsValidator.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomAllowedCallersClaimsValidator.cs deleted file mode 100644 index 7d3de967b2..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomAllowedCallersClaimsValidator.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.Bot.Connector.SkillAuthentication; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Threading.Tasks; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that requests are coming from allowed parent bots. - /// - public class CustomAllowedCallersClaimsValidator : ClaimsValidator - { - private readonly IList _allowedCallers; - - public CustomAllowedCallersClaimsValidator(IList allowedCallers) - { - // AllowedCallers is the setting in web.config file - // that consists of the list of parent bot IDs that are allowed to access the skill. - // To add a new parent bot simply go to the AllowedCallers and add - // the parent bot's Microsoft app ID to the list. - - _allowedCallers = allowedCallers ?? throw new ArgumentNullException(nameof(allowedCallers)); - if (!_allowedCallers.Any()) - { - throw new ArgumentNullException(nameof(allowedCallers), "AllowedCallers must contain at least one element of '*' or valid MicrosoftAppId(s)."); - } - } - - /// - /// This method is called from JwtTokenValidation.ValidateClaimsAsync - /// - /// - public override Task ValidateClaimsAsync(IList claims) - { - if (claims == null) - { - throw new ArgumentNullException(nameof(claims)); - } - - if (!claims.Any()) - { - throw new UnauthorizedAccessException("ValidateClaimsAsync.claims parameter must contain at least one element."); - } - - if (SkillValidation.IsSkillClaim(claims)) - { - // if _allowedCallers has one item of '*', allow all parent bot calls and do not validate the appid from claims - if (_allowedCallers.Count == 1 && _allowedCallers[0] == "*") - { - return Task.CompletedTask; - } - - // Check that the appId claim in the skill request is in the list of skills configured for this bot. - var appId = JwtTokenValidation.GetAppIdFromClaims(claims).ToUpperInvariant(); - if (_allowedCallers.Contains(appId)) - { - return Task.CompletedTask; - } - - throw new UnauthorizedAccessException($"Received a request from a bot with an app ID of \"{appId}\". To enable requests from this caller, add the app ID to your configuration file."); - } - - throw new UnauthorizedAccessException($"ValidateClaimsAsync called without a Skill claim in claims."); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomSkillAuthenticationConfiguration.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomSkillAuthenticationConfiguration.cs deleted file mode 100644 index 2d01093e67..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Authentication/CustomSkillAuthenticationConfiguration.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.Bot.Connector.SkillAuthentication; -using System.Configuration; -using System.Linq; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3.Authentication -{ - public class CustomSkillAuthenticationConfiguration : AuthenticationConfiguration - { - private const string AllowedCallersConfigKey = "EchoBotAllowedCallers"; - public CustomSkillAuthenticationConfiguration() - { - // Could pull this list from a DB or anywhere. - var allowedCallers = ConfigurationManager.AppSettings[AllowedCallersConfigKey].Split(',').Select(s => s.Trim().ToUpperInvariant()).ToList(); - ClaimsValidator = new CustomAllowedCallersClaimsValidator(allowedCallers); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Controllers/MessagesController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Controllers/MessagesController.cs deleted file mode 100644 index 55cc612cd5..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Controllers/MessagesController.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Diagnostics; -using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using System.Web.Http; -using Autofac; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Internals; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Connector.SkillAuthentication; -using Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3.Authentication; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3 -{ - // Specify which type provides the authentication configuration to allow for validation for skills. - [SkillBotAuthentication(AuthenticationConfigurationProviderType = typeof(CustomSkillAuthenticationConfiguration))] - public class MessagesController : ApiController - { - /// - /// POST: api/Messages - /// Receive a message from a user and reply to it - /// - public async Task Post([FromBody]Activity activity) - { - if (activity.GetActivityType() == ActivityTypes.Message) - { - await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); - } - else - { - await HandleSystemMessage(activity); - } - var response = Request.CreateResponse(HttpStatusCode.OK); - return response; - } - - private async Task HandleSystemMessage(Activity message) - { - string messageType = message.GetActivityType(); - - if (messageType == ActivityTypes.EndOfConversation) - { - Trace.TraceInformation($"EndOfConversation: {message}"); - - // This Recipient null check is required for PVA manifest validation. - // PVA will send an EOC activity with null Recipient. - if (message.Recipient != null) - { - // Clear the dialog stack if the root bot has ended the conversation. - using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) - { - var botData = scope.Resolve(); - await botData.LoadAsync(default(CancellationToken)); - - var stack = scope.Resolve(); - stack.Reset(); - - await botData.FlushAsync(default(CancellationToken)); - } - } - } - else if (messageType == ActivityTypes.DeleteUserData) - { - // Implement user deletion here - // If we handle user deletion, return a real message - } - else if (messageType == ActivityTypes.ConversationUpdate) - { - // Handle conversation state changes, like members being added and removed - // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info - // Not available in all channels - } - else if (messageType == ActivityTypes.ContactRelationUpdate) - { - // Handle add/remove from contact lists - // Activity.From + Activity.Action represent what happened - } - else if (messageType == ActivityTypes.Typing) - { - // Handle knowing that the user is typing - } - else if (messageType == ActivityTypes.Ping) - { - } - - return null; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Dialogs/RootDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Dialogs/RootDialog.cs deleted file mode 100644 index 1ae1313a31..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Dialogs/RootDialog.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3.Dialogs -{ - [Serializable] - public class RootDialog : IDialog - { - public Task StartAsync(IDialogContext context) - { - context.Wait(MessageReceivedAsync); - - return Task.CompletedTask; - } - - private async Task MessageReceivedAsync(IDialogContext context, IAwaitable result) - { - var activity = await result as Activity; - - var options = new MessageOptions - { - InputHint = InputHints.AcceptingInput - }; - - try - { - if (activity.Type == "exception") - { - await PostExceptionAsync(context, activity, activity.Value as Exception); - } - else if (activity.Text.ToLower().Contains("end") || activity.Text.ToLower().Contains("stop")) - { - // Send an `endOfconversation` activity if the user cancels the skill. - await context.SayAsync($"Ending conversation from the skill...", options: options); - var endOfConversation = activity.CreateReply(); - endOfConversation.Type = ActivityTypes.EndOfConversation; - endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully; - endOfConversation.InputHint = InputHints.AcceptingInput; - await context.PostAsync(endOfConversation); - } - else - { - await context.SayAsync($"Echo: {activity.Text}", options: options); - await context.SayAsync($"Say \"end\" or \"stop\" and I'll end the conversation and back to the parent.", options: options); - } - } - catch (Exception exception) - { - await PostExceptionAsync(context, activity, exception); - } - - context.Wait(MessageReceivedAsync); - } - - //Send exception message and trace - private static async Task PostExceptionAsync(IDialogContext context, Activity reply, Exception exception) - { - // Send a message to the user - var errorMessageText = "The skill encountered an error or bug."; - var activity = reply.CreateReply(); - activity.Text = errorMessageText + Environment.NewLine + exception; - activity.Speak = errorMessageText; - activity.InputHint = InputHints.IgnoringInput; - activity.Value = exception; - await context.PostAsync(activity); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - activity = reply.CreateReply(); - activity.Text = errorMessageText; - activity.Speak = errorMessageText; - activity.InputHint = InputHints.ExpectingInput; - await context.PostAsync(activity); - - // Send and EndOfConversation activity to the skill caller with the error to end the conversation - // and let the caller decide what to do. - activity = reply.CreateReply(); - activity.Type = ActivityTypes.EndOfConversation; - activity.Code = "SkillError"; - activity.Text = exception.Message; - await context.PostAsync(activity); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/EchoSkillBot-v3.csproj b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/EchoSkillBot-v3.csproj deleted file mode 100644 index 4f5be44f73..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/EchoSkillBot-v3.csproj +++ /dev/null @@ -1,232 +0,0 @@ - - - - - Debug - AnyCPU - - - 2.0 - {41BC9547-FD9E-40E1-B1D9-C3F25BC9A2F3} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot - - v4.7.2 - 512 - true - 3979 - enabled - disabled - false - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - MSB3276 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - $(SolutionDir)packages\Autofac.4.6.0\lib\net45\Autofac.dll - - - $(SolutionDir)packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll - - - $(SolutionDir)packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll - - - $(SolutionDir)packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll - - - $(SolutionDir)packages\Microsoft.Azure.DocumentDB.1.22.0\lib\net45\Microsoft.Azure.Documents.Client.dll - - - $(SolutionDir)packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll - - - $(SolutionDir)packages\Microsoft.Bot.Builder.3.30.0\lib\net46\Microsoft.Bot.Builder.dll - True - - - $(SolutionDir)packages\Microsoft.Bot.Builder.3.30.0\lib\net46\Microsoft.Bot.Builder.Autofac.dll - True - - - $(SolutionDir)packages\Microsoft.Bot.Builder.Azure.3.16.3.40383\lib\net46\Microsoft.Bot.Builder.Azure.dll - - - $(SolutionDir)packages\Microsoft.Bot.Builder.History.3.30.0\lib\net46\Microsoft.Bot.Builder.History.dll - True - - - $(SolutionDir)packages\Microsoft.Bot.Connector.3.30.0\lib\net46\Microsoft.Bot.Connector.dll - True - - - - ..\..\..\packages\Microsoft.Data.Edm.5.8.4\lib\net40\Microsoft.Data.Edm.dll - - - ..\..\..\packages\Microsoft.Data.OData.5.8.4\lib\net40\Microsoft.Data.OData.dll - - - ..\..\..\packages\Microsoft.Data.Services.Client.5.8.4\lib\net40\Microsoft.Data.Services.Client.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Clients.ActiveDirectory.4.4.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Logging.1.1.4\lib\net451\Microsoft.IdentityModel.Logging.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Protocols.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll - - - $(SolutionDir)packages\Microsoft.IdentityModel.Tokens.5.1.4\lib\net451\Microsoft.IdentityModel.Tokens.dll - - - $(SolutionDir)packages\Microsoft.Rest.ClientRuntime.2.3.8\lib\net452\Microsoft.Rest.ClientRuntime.dll - - - $(SolutionDir)packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.3\lib\net40\Microsoft.WindowsAzure.Configuration.dll - - - $(SolutionDir)packages\WindowsAzure.Storage.7.2.1\lib\net40\Microsoft.WindowsAzure.Storage.dll - - - $(SolutionDir)packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - $(SolutionDir)packages\System.IdentityModel.Tokens.Jwt.5.1.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll - - - - $(SolutionDir)packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - - - ..\..\..\packages\System.Spatial.5.8.4\lib\net40\System.Spatial.dll - - - - - - - - $(SolutionDir)packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - - - $(SolutionDir)packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - - - - - - - - - - Designer - - - - - - - - - - Global.asax - - - - - - - Designer - - - Web.config - - - Web.config - - - - - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - true - - - true - true - - - - - - - - - True - True - 3978 - / - http://localhost:35407 - False - False - - - False - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax deleted file mode 100644 index 745e35c7cc..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3.WebApiApplication" Language="C#" %> diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax.cs deleted file mode 100644 index 29c3e1e36f..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Global.asax.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Web.Http; -using Microsoft.Bot.Builder.Azure; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Internals; -using Autofac; -using Microsoft.Bot.Connector; -using System.Reflection; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBotv3 -{ - public class WebApiApplication : System.Web.HttpApplication - { - protected void Application_Start() - { - GlobalConfiguration.Configure(WebApiConfig.Register); - - Conversation.UpdateContainer( - builder => - { - builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly())); - - // Bot Storage: Here we register the state storage for your bot. - // Default store: volatile in-memory store - Only for prototyping! - // We provide adapters for Azure Table, CosmosDb, SQL Azure, or you can implement your own! - // For samples and documentation, see: [https://github.com/Microsoft/BotBuilder-Azure](https://github.com/Microsoft/BotBuilder-Azure) - var store = new InMemoryDataStore(); - - // Other storage options - // var store = new TableBotDataStore("...DataStorageConnectionString..."); // requires Microsoft.BotBuilder.Azure Nuget package - // var store = new DocumentDbBotDataStore("cosmos db uri", "cosmos db key"); // requires Microsoft.BotBuilder.Azure Nuget package - - builder.Register(c => store) - .Keyed>(AzureModule.Key_DataStore) - .AsSelf() - .SingleInstance(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Properties/AssemblyInfo.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Properties/AssemblyInfo.cs deleted file mode 100644 index 450505c46b..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BotApplication")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("BotApplication")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("287d6db1-a34e-44db-bbf5-e1312cd4737f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.1")] -[assembly: AssemblyFileVersion("1.0.0.1")] diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Debug.config b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Debug.config deleted file mode 100644 index fae9cfefa9..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Debug.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Release.config b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Release.config deleted file mode 100644 index da6e960b8d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.Release.config +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.config b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.config deleted file mode 100644 index e9f3490f0e..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/Web.config +++ /dev/null @@ -1,57 +0,0 @@ - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/default.htm b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/default.htm deleted file mode 100644 index 46acb6def1..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/default.htm +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -

Echo Skill bot

- This bot demonstrates a Bot Builder V3 bot as a Skill. - - - diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/manifests/echoskillbotv3-manifest-1.0.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/manifests/echoskillbotv3-manifest-1.0.json deleted file mode 100644 index c45e0fe08c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/manifests/echoskillbotv3-manifest-1.0.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json", - "$id": "EchoSkillBotDotNetV3", - "name": "EchoSkillBotDotNetV3", - "version": "1.0", - "description": "This is a skill for echoing what the user sent to the bot (using BF V3).", - "publisherName": "Microsoft", - "privacyUrl": "https://microsoft.com/privacy", - "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.", - "license": "https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE", - "tags": [ - "echo" - ], - "endpoints": [ - { - "name": "default", - "protocol": "BotFrameworkV3", - "description": "Localhost endpoint for the skill (on port 35407)", - "endpointUrl": "http://localhost:35407/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - ], - "activities": { - "EchoDotNetV3": { - "description": "Echo user responses", - "type": "message", - "name": "V3Echo" - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/packages.config b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/packages.config deleted file mode 100644 index dcb3d850a1..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot-v3/packages.config +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Authentication/AllowedCallersClaimsValidator.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Authentication/AllowedCallersClaimsValidator.cs deleted file mode 100644 index 0f5a4e3152..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Authentication/AllowedCallersClaimsValidator.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that requests are coming from allowed parent bots. - /// - public class AllowedCallersClaimsValidator : ClaimsValidator - { - private const string ConfigKey = "AllowedCallers"; - private readonly List _allowedCallers; - - /// - /// Initializes a new instance of the class. - /// Loads the appIds for the configured callers. Only allows access to callers it has configured. - /// - /// The list of configured callers. - public AllowedCallersClaimsValidator(IConfiguration config) - { - if (config == null) - { - throw new ArgumentNullException(nameof(config)); - } - - // AllowedCallers is the setting in the appsettings.json file - // that consists of the list of parent bot IDs that are allowed to access the skill. - // To add a new parent bot, simply edit the AllowedCallers and add - // the parent bot's Microsoft app ID to the list. - // In this sample, we allow all callers if AllowedCallers contains an "*". - var section = config.GetSection(ConfigKey); - var appsList = section.Get(); - if (appsList == null) - { - throw new ArgumentNullException($"\"{ConfigKey}\" not found in configuration."); - } - - _allowedCallers = new List(appsList); - } - - /// - /// Checks that the appId claim in the skill request is in the list of callers configured for this bot. - /// - /// The list of claims to validate. - /// A task that represents the work queued to execute. - public override Task ValidateClaimsAsync(IList claims) - { - // If _allowedCallers contains an "*", we allow all callers. - if (SkillValidation.IsSkillClaim(claims) && !_allowedCallers.Contains("*")) - { - // Check that the appId claim in the skill request is in the list of callers configured for this bot. - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedCallers.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from a bot with an app ID of \"{appId}\". To enable requests from this caller, add the app ID to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Bots/EchoBot.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Bots/EchoBot.cs deleted file mode 100644 index 1e740b419c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Bots/EchoBot.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot.Bots -{ - public class EchoBot : ActivityHandler - { - /// - /// Processes a message activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - if (turnContext.Activity.Text.Contains("end") || turnContext.Activity.Text.Contains("stop")) - { - // Send End of conversation at the end. - await turnContext.SendActivityAsync(MessageFactory.Text($"Ending conversation from the skill..."), cancellationToken); - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully; - await turnContext.SendActivityAsync(endOfConversation, cancellationToken); - } - else - { - await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); - await turnContext.SendActivityAsync(MessageFactory.Text("Say \"end\" or \"stop\" and I'll end the conversation and back to the parent."), cancellationToken); - } - } - - /// - /// Processes an end of conversation activity. - /// - /// Context for the current turn of conversation. - /// CancellationToken propagates notifications that operations should be cancelled. - /// A representing the result of the asynchronous operation. - protected override Task OnEndOfConversationActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - // This will be called if the host bot is ending the conversation. Sending additional messages should be - // avoided as the conversation may have been deleted. - // Perform cleanup of resources if needed. - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Controllers/BotController.cs deleted file mode 100644 index 3877bc87f3..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Controllers/BotController.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot.Controllers -{ - /// - /// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot implementation at runtime. - /// Multiple different IBot implementations running at different endpoints can be achieved by specifying a more specific type for the bot constructor argument. - /// - [Route("api/messages")] - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - - /// - /// Initializes a new instance of the class. - /// - /// Adapter for the BotController. - /// Bot for the BotController. - public BotController(IBotFrameworkHttpAdapter adapter, IBot bot) - { - _adapter = adapter; - _bot = bot; - } - - /// - /// Processes an HttpPost request. - /// - /// A representing the result of the asynchronous operation. - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/EchoSkillBot.csproj b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/EchoSkillBot.csproj deleted file mode 100644 index 75badf2f19..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/EchoSkillBot.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - netcoreapp3.1 - latest - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot - Microsoft.BotFrameworkFunctionalTests.EchoSkillBot - - - - DEBUG;TRACE - - - - - - - - - - Always - - - - diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Program.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Program.cs deleted file mode 100644 index 5a43557181..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot -{ - public class Program - { - /// - /// The entry point of the application. - /// - /// The command line args. - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - /// - /// Creates a new instance of the class with pre-configured defaults. - /// - /// The command line args. - /// The initialized . - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Properties/launchSettings.json deleted file mode 100644 index 547cc9c69d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35400/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "EchoSkillBotDotNet": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35400/", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/SkillAdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/SkillAdapterWithErrorHandler.cs deleted file mode 100644 index 340e8a68ea..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/SkillAdapterWithErrorHandler.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot -{ - public class SkillAdapterWithErrorHandler : BotFrameworkHttpAdapter - { - /// - /// Initializes a new instance of the class to handle errors. - /// - /// The configuration properties. - /// An implementation of the bots credentials. - /// The configuration setting for the authentication. - /// An instance of a logger. - public SkillAdapterWithErrorHandler(IConfiguration configuration, ICredentialProvider credentialProvider, AuthenticationConfiguration authConfig, ILogger logger) - : base(configuration, credentialProvider, authConfig, logger: logger) - { - OnTurnError = async (turnContext, exception) => - { - try - { - // Log any leaked exception from the application. - logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - // Send a message to the user - var errorMessageText = "The skill encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText + Environment.NewLine + exception, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator - // Note: we return the entire exception in the value property to help the developer, this should not be done in prod. - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError"); - - // Send and EndOfConversation activity to the skill caller with the error to end the conversation - // and let the caller decide what to do. - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "SkillError"; - endOfConversation.Text = exception.Message; - await turnContext.SendActivityAsync(endOfConversation); - } - catch (Exception ex) - { - logger.LogError(ex, $"Exception caught in SkillAdapterWithErrorHandler : {ex}"); - } - }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Startup.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Startup.cs deleted file mode 100644 index 9af686442b..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/Startup.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.EchoSkillBot.Bots; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.EchoSkillBot -{ - public class Startup - { - public Startup(IConfiguration config) - { - Configuration = config; - } - - public IConfiguration Configuration { get; } - - /// - /// This method gets called by the runtime. Use this method to add services to the container. - /// - /// Method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers().AddNewtonsoftJson(); - - // Configure credentials - services.AddSingleton(); - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new Authentication.AllowedCallersClaimsValidator(sp.GetService()) }); - - // Create the Bot Framework Adapter with error handling enabled. - services.AddSingleton(); - - // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient(); - - if (!string.IsNullOrEmpty(Configuration["ChannelService"])) - { - // Register a ConfigurationChannelProvider -- this is only for Azure Gov. - services.AddSingleton(); - } - } - - /// - /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - /// - /// The application request pipeline to be configured. - /// The web hosting environment. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles() - .UseStaticFiles() - .UseRouting() - .UseAuthorization() - .UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/appsettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/appsettings.json deleted file mode 100644 index c61cdb4d79..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/appsettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "ChannelService": "", - // This is a comma separate list with the App IDs that will have access to the skill. - // This setting is used in AllowedCallersClaimsValidator. - // Examples: - // [ "*" ] allows all callers. - // [ "AppId1", "AppId2" ] only allows access to parent bots with "AppId1" and "AppId2". - "AllowedCallers": [ "*" ] -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/default.htm b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/default.htm deleted file mode 100644 index 416365e6bc..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - EchoSkillBotDotNet - - - - - -
-
-
-
EchoSkillBotDotNet Bot
-
-
-
-
-
Your bot is ready!
-
You can test your bot in the Bot Framework Emulator
- by connecting to http://localhost:3978/api/messages.
- -
Visit Azure - Bot Service to register your bot and add it to
- various channels. The bot's endpoint URL typically looks - like this:
-
https://your_bots_hostname/api/messages
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/manifests/echoskillbot-manifest-1.0.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/manifests/echoskillbot-manifest-1.0.json deleted file mode 100644 index 974de692e4..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/EchoSkillBot/wwwroot/manifests/echoskillbot-manifest-1.0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json", - "$id": "EchoSkillBotDotNet", - "name": "EchoSkillBotDotNet", - "version": "1.0", - "description": "This is a skill for echoing what the user sent to the bot (using .netcore 3.1).", - "publisherName": "Microsoft", - "privacyUrl": "https://microsoft.com/privacy", - "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.", - "license": "https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE", - "tags": [ - "echo" - ], - "endpoints": [ - { - "name": "default", - "protocol": "BotFrameworkV3", - "description": "Localhost endpoint for the skill (on port 35400)", - "endpointUrl": "http://localhost:35400/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - ] -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Authentication/AllowedCallersClaimsValidator.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Authentication/AllowedCallersClaimsValidator.cs deleted file mode 100644 index cc811d5d82..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Authentication/AllowedCallersClaimsValidator.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Authentication -{ - /// - /// Sample claims validator that loads an allowed list from configuration if present - /// and checks that requests are coming from allowed parent bots. - /// - public class AllowedCallersClaimsValidator : ClaimsValidator - { - private const string ConfigKey = "AllowedCallers"; - private readonly List _allowedCallers; - - public AllowedCallersClaimsValidator(IConfiguration config) - { - if (config == null) - { - throw new ArgumentNullException(nameof(config)); - } - - // AllowedCallers is the setting in the appsettings.json file - // that consists of the list of parent bot IDs that are allowed to access the skill. - // To add a new parent bot, simply edit the AllowedCallers and add - // the parent bot's Microsoft app ID to the list. - // In this sample, we allow all callers if AllowedCallers contains an "*". - var section = config.GetSection(ConfigKey); - var appsList = section.Get(); - if (appsList == null) - { - throw new ArgumentNullException($"\"{ConfigKey}\" not found in configuration."); - } - - _allowedCallers = new List(appsList); - } - - public override Task ValidateClaimsAsync(IList claims) - { - // If _allowedCallers contains an "*", we allow all callers. - if (SkillValidation.IsSkillClaim(claims) && !_allowedCallers.Contains("*")) - { - // Check that the appId claim in the skill request is in the list of callers configured for this bot. - var appId = JwtTokenValidation.GetAppIdFromClaims(claims); - if (!_allowedCallers.Contains(appId)) - { - throw new UnauthorizedAccessException($"Received a request from a bot with an app ID of \"{appId}\". To enable requests from this caller, add the app ID to your configuration file."); - } - } - - return Task.CompletedTask; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Bots/SkillBot.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Bots/SkillBot.cs deleted file mode 100644 index ffad563104..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Bots/SkillBot.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Bots -{ - public class SkillBot : ActivityHandler - where T : Dialog - { - private readonly ConversationState _conversationState; - private readonly Dialog _mainDialog; - private readonly Uri _serverUrl; - - public SkillBot(ConversationState conversationState, T mainDialog, IHttpContextAccessor httpContextAccessor) - { - _conversationState = conversationState; - _mainDialog = mainDialog; - _serverUrl = new Uri($"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host.Value}"); - } - - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) - { - if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate) - { - // Let the base class handle the activity (this will trigger OnMembersAddedAsync). - await base.OnTurnAsync(turnContext, cancellationToken); - } - else - { - // Run the Dialog with the Activity. - await _mainDialog.RunAsync(turnContext, _conversationState.CreateProperty("DialogState"), cancellationToken); - } - - // Save any state changes that might have occurred during the turn. - await _conversationState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - if (member.Id != turnContext.Activity.Recipient.Id) - { - var activity = MessageFactory.Text("Welcome to the waterfall skill bot. \n\nThis is a skill, you will need to call it from another bot to use it."); - activity.Speak = "Welcome to the waterfall skill bot. This is a skill, you will need to call it from another bot to use it."; - await turnContext.SendActivityAsync(activity, cancellationToken); - - await turnContext.SendActivityAsync($"You can check the skill manifest to see what it supports here: {_serverUrl}manifests/waterfallskillbot-manifest-1.0.json", cancellationToken: cancellationToken); - } - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/BotController.cs deleted file mode 100644 index eff768c82a..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/BotController.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Controllers -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private readonly IBot _bot; - private readonly ILogger _logger; - - public BotController(BotFrameworkHttpAdapter adapter, IBot bot, ILogger logger) - { - _adapter = adapter; - _bot = bot; - _logger = logger; - } - - [Route("api/messages")] - [HttpGet] - [HttpPost] - public async Task PostAsync() - { - try - { - // Delegate the processing of the HTTP POST to the adapter. - // The adapter will invoke the bot. - await _adapter.ProcessAsync(Request, Response, _bot); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error processing request"); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/CardsController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/CardsController.cs deleted file mode 100644 index 817c197758..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/CardsController.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.IO; -using Microsoft.AspNetCore.Mvc; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Controllers -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [ApiController] - public class CardsController : ControllerBase - { - private static readonly string Music = "music.mp3"; - - [Route("api/music")] - [HttpGet] - public ActionResult ReturnFile() - { - var filename = Music; - var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Dialogs/Cards/Files", filename); - var fileData = System.IO.File.ReadAllBytes(filePath); - - return File(fileData, "audio/mp3"); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/ProactiveController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/ProactiveController.cs deleted file mode 100644 index ae96c51bbb..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/ProactiveController.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Concurrent; -using System.Net; -using System.Security.Claims; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Proactive; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Controllers -{ - [Route("api/notify")] - [ApiController] - public class ProactiveController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private readonly ConcurrentDictionary _continuationParametersStore; - private readonly ConversationState _conversationState; - private readonly ActivityRouterDialog _mainDialog; - - public ProactiveController(ConversationState conversationState, ActivityRouterDialog mainDialog, BotFrameworkHttpAdapter adapter, ConcurrentDictionary continuationParametersStore) - { - _conversationState = conversationState; - _adapter = adapter; - _continuationParametersStore = continuationParametersStore; - _mainDialog = mainDialog; - } - - // Note: in production scenarios, this controller should be secured. - public async Task Get(string user) - { - _continuationParametersStore.TryGetValue(user, out var continuationParameters); - - if (continuationParameters == null) - { - // Let the caller know a proactive messages have been sent - return new ContentResult - { - Content = $"

No messages sent


There are no conversations registered to receive proactive messages for {user}.", - ContentType = "text/html", - StatusCode = (int)HttpStatusCode.OK, - }; - } - - Exception exception = null; - try - { - async Task ContinuationBotCallback(ITurnContext context, CancellationToken cancellationToken) - { - await context.SendActivityAsync($"Got proactive message for user: {user}", cancellationToken: cancellationToken); - - // If we didn't have dialogs we could remove the code below, but we want to continue the dialog to clear the - // dialog stack. - // Run the main dialog to continue WaitForProactiveDialog and send an EndOfConversation when that one is done. - // ContinueDialogAsync in WaitForProactiveDialog will get a ContinueConversation event when this is called. - await _mainDialog.RunAsync(context, _conversationState.CreateProperty("DialogState"), cancellationToken); - - // Save any state changes so the dialog stack is persisted. - await _conversationState.SaveChangesAsync(context, false, cancellationToken); - } - - // Continue the conversation with the proactive message - await ((BotFrameworkAdapter)_adapter).ContinueConversationAsync((ClaimsIdentity)continuationParameters.ClaimsIdentity, continuationParameters.ConversationReference, continuationParameters.OAuthScope, ContinuationBotCallback, default); - } - catch (Exception ex) - { - exception = ex; - } - - // Let the caller know a proactive messages have been sent - return new ContentResult - { - Content = $"

Proactive messages have been sent


Timestamp: {DateTime.Now}
Exception: {exception}", - ContentType = "text/html", - StatusCode = (int)HttpStatusCode.OK, - }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/SkillController.cs deleted file mode 100644 index ea90b07c02..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Controllers/SkillController.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Controllers -{ - /// - /// A controller that handles skill replies to the bot. - /// This example uses the that is registered as a in startup.cs. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - public SkillController(ChannelServiceHandler handler) - : base(handler) - { - } - - public override Task ReplyToActivityAsync(string conversationId, string activityId, Activity activity) - { - try - { - return base.ReplyToActivityAsync(conversationId, activityId, activity); - } - catch (Exception ex) - { - Console.WriteLine(ex); - throw; - } - } - - public override Task SendToConversationAsync(string conversationId, Activity activity) - { - try - { - return base.SendToConversationAsync(conversationId, activity); - } - catch (Exception ex) - { - Console.WriteLine(ex); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/ActivityRouterDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/ActivityRouterDialog.cs deleted file mode 100644 index 11acef467c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/ActivityRouterDialog.cs +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Concurrent; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Auth; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Delete; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.FileUpload; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.MessageWithAttachment; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Proactive; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Sso; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Update; -using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs -{ - /// - /// A root dialog that can route activities sent to the skill to different sub-dialogs. - /// - public class ActivityRouterDialog : ComponentDialog - { - private static readonly string _echoSkill = "EchoSkill"; - - public ActivityRouterDialog(IConfiguration configuration, IHttpContextAccessor httpContextAccessor, ConversationState conversationState, SkillConversationIdFactoryBase conversationIdFactory, SkillHttpClient skillClient, ConcurrentDictionary continuationParametersStore) - : base(nameof(ActivityRouterDialog)) - { - AddDialog(new CardDialog(httpContextAccessor)); - AddDialog(new MessageWithAttachmentDialog(new Uri($"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host.Value}"))); - AddDialog(new WaitForProactiveDialog(httpContextAccessor, continuationParametersStore)); - AddDialog(new AuthDialog(configuration)); - AddDialog(new SsoSkillDialog(configuration)); - AddDialog(new FileUploadDialog()); - AddDialog(new DeleteDialog()); - AddDialog(new UpdateDialog()); - - AddDialog(CreateEchoSkillDialog(conversationState, conversationIdFactory, skillClient, configuration)); - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { ProcessActivityAsync })); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static SkillDialog CreateEchoSkillDialog(ConversationState conversationState, SkillConversationIdFactoryBase conversationIdFactory, SkillHttpClient skillClient, IConfiguration configuration) - { - var botId = configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value; - - var skillHostEndpoint = configuration.GetSection("SkillHostEndpoint")?.Value; - if (string.IsNullOrWhiteSpace(skillHostEndpoint)) - { - throw new ArgumentException("SkillHostEndpoint is not in configuration"); - } - - var skillInfo = configuration.GetSection("EchoSkillInfo").Get() ?? throw new ArgumentException("EchoSkillInfo is not set in configuration"); - - var skillDialogOptions = new SkillDialogOptions - { - BotId = botId, - ConversationIdFactory = conversationIdFactory, - SkillClient = skillClient, - SkillHostEndpoint = new Uri(skillHostEndpoint), - ConversationState = conversationState, - Skill = skillInfo - }; - var echoSkillDialog = new SkillDialog(skillDialogOptions); - - echoSkillDialog.Id = _echoSkill; - return echoSkillDialog; - } - - private async Task ProcessActivityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // A skill can send trace activities, if needed. - await stepContext.Context.TraceActivityAsync($"{GetType().Name}.ProcessActivityAsync()", label: $"Got ActivityType: {stepContext.Context.Activity.Type}", cancellationToken: cancellationToken); - - switch (stepContext.Context.Activity.Type) - { - case ActivityTypes.Event: - return await OnEventActivityAsync(stepContext, cancellationToken); - - default: - // We didn't get an activity type we can handle. - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Unrecognized ActivityType: \"{stepContext.Context.Activity.Type}\".", inputHint: InputHints.IgnoringInput), cancellationToken); - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } - - // This method performs different tasks based on the event name. - private async Task OnEventActivityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var activity = stepContext.Context.Activity; - await stepContext.Context.TraceActivityAsync($"{GetType().Name}.OnEventActivityAsync()", label: $"Name: {activity.Name}. Value: {GetObjectAsJsonString(activity.Value)}", cancellationToken: cancellationToken); - - // Resolve what to execute based on the event name. - switch (activity.Name) - { - case "Cards": - return await stepContext.BeginDialogAsync(FindDialog(nameof(CardDialog)).Id, cancellationToken: cancellationToken); - - case "Proactive": - return await stepContext.BeginDialogAsync(FindDialog(nameof(WaitForProactiveDialog)).Id, cancellationToken: cancellationToken); - - case "MessageWithAttachment": - return await stepContext.BeginDialogAsync(FindDialog(nameof(MessageWithAttachmentDialog)).Id, cancellationToken: cancellationToken); - - case "Auth": - return await stepContext.BeginDialogAsync(FindDialog(nameof(AuthDialog)).Id, cancellationToken: cancellationToken); - - case "Sso": - return await stepContext.BeginDialogAsync(FindDialog(nameof(SsoSkillDialog)).Id, cancellationToken: cancellationToken); - - case "FileUpload": - return await stepContext.BeginDialogAsync(FindDialog(nameof(FileUploadDialog)).Id, cancellationToken: cancellationToken); - - case "Echo": - // Start the EchoSkillBot - var messageActivity = MessageFactory.Text("I'm the echo skill bot"); - messageActivity.DeliveryMode = stepContext.Context.Activity.DeliveryMode; - return await stepContext.BeginDialogAsync(FindDialog(_echoSkill).Id, new BeginSkillDialogOptions { Activity = messageActivity }, cancellationToken); - - case "Delete": - return await stepContext.BeginDialogAsync(FindDialog(nameof(DeleteDialog)).Id, cancellationToken: cancellationToken); - - case "Update": - return await stepContext.BeginDialogAsync(FindDialog(nameof(UpdateDialog)).Id, cancellationToken: cancellationToken); - - default: - // We didn't get an event name we can handle. - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Unrecognized EventName: \"{activity.Name}\".", inputHint: InputHints.IgnoringInput), cancellationToken); - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } - - private string GetObjectAsJsonString(object value) => value == null ? string.Empty : JsonConvert.SerializeObject(value); - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Auth/AuthDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Auth/AuthDialog.cs deleted file mode 100644 index 39d26e238d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Auth/AuthDialog.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Auth -{ - public class AuthDialog : ComponentDialog - { - private readonly string _connectionName; - - public AuthDialog(IConfiguration configuration) - : base(nameof(AuthDialog)) - { - _connectionName = configuration["ConnectionName"]; - - // This confirmation dialog should be removed once https://github.com/microsoft/BotFramework-FunctionalTests/issues/299 is resolved (and this class should look like the class in the issue) - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - AddDialog(new OAuthPrompt( - nameof(OAuthPrompt), - new OAuthPromptSettings - { - ConnectionName = _connectionName, - Text = $"Please Sign In to connection: '{_connectionName}'", - Title = "Sign In", - Timeout = 300000 // User has 5 minutes to login (1000 * 60 * 5) - })); - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { PromptStepAsync, LoginStepAsync, DisplayTokenAsync })); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - return await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken); - } - - private async Task LoginStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Get the token from the previous step. - var tokenResponse = (TokenResponse)stepContext.Result; - if (tokenResponse != null) - { - stepContext.Values["Token"] = tokenResponse.Token; - - // Show the token - var loggedInMessage = "You are now logged in."; - await stepContext.Context.SendActivityAsync(MessageFactory.Text(loggedInMessage, loggedInMessage, InputHints.IgnoringInput), cancellationToken); - - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to view your token?") }, cancellationToken); - } - - var tryAgainMessage = "Login was not successful please try again."; - await stepContext.Context.SendActivityAsync(MessageFactory.Text(tryAgainMessage, tryAgainMessage, InputHints.IgnoringInput), cancellationToken); - return await stepContext.ReplaceDialogAsync(InitialDialogId, cancellationToken: cancellationToken); - } - - private async Task DisplayTokenAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var result = (bool)stepContext.Result; - if (result) - { - var showTokenMessage = "Here is your token:"; - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"{showTokenMessage} {stepContext.Values["Token"]}", showTokenMessage, InputHints.IgnoringInput), cancellationToken); - } - - // Sign out - var botAdapter = (BotFrameworkAdapter)stepContext.Context.Adapter; - await botAdapter.SignOutUserAsync(stepContext.Context, _connectionName, null, cancellationToken); - var signOutMessage = "I have signed you out."; - await stepContext.Context.SendActivityAsync(MessageFactory.Text(signOutMessage, signOutMessage, inputHint: InputHints.IgnoringInput), cancellationToken); - - return await stepContext.EndDialogAsync(cancellationToken: cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/AdaptiveCardExtensions.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/AdaptiveCardExtensions.cs deleted file mode 100644 index a0cb2216a6..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/AdaptiveCardExtensions.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using AdaptiveCards; -using Microsoft.Bot.Schema; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public static class AdaptiveCardExtensions - { - /// - /// Creates a new attachment from AdaptiveCard. - /// - /// The instance of AdaptiveCard. - /// The generated attachment. - public static Attachment ToAttachment(this AdaptiveCard card) - { - return new Attachment - { - Content = card, - ContentType = AdaptiveCard.ContentType, - }; - } - - /// - /// Wrap BotBuilder action into AdaptiveCard submit action. - /// - /// The instance of adaptive card submit action. - /// Target action to be adapted. - public static void RepresentAsBotBuilderAction(this AdaptiveSubmitAction action, CardAction targetAction) - { - if (action == null) - { - throw new ArgumentNullException(nameof(action)); - } - - if (targetAction == null) - { - throw new ArgumentNullException(nameof(targetAction)); - } - - var wrappedAction = new CardAction - { - Type = targetAction.Type, - Value = targetAction.Value, - Text = targetAction.Text, - DisplayText = targetAction.DisplayText, - }; - - var serializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - - var jsonStr = action.DataJson ?? "{}"; - JToken dataJson = JObject.Parse(jsonStr); - dataJson["msteams"] = JObject.FromObject(wrappedAction, JsonSerializer.Create(serializerSettings)); - - action.Title = targetAction.Title; - action.DataJson = dataJson.ToString(); - } - - /// - /// Wrap BotBuilder action into AdaptiveCard submit action. - /// - /// Target bot builder action to be adapted. - /// The wrapped adaptive card submit action. - public static AdaptiveSubmitAction ToAdaptiveCardAction(this CardAction action) - { - var adaptiveCardAction = new AdaptiveSubmitAction(); - adaptiveCardAction.RepresentAsBotBuilderAction(action); - return adaptiveCardAction; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardDialog.cs deleted file mode 100644 index 8ded48ff2c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardDialog.cs +++ /dev/null @@ -1,340 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AdaptiveCards; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Schema; -using Microsoft.Bot.Schema.Teams; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public class CardDialog : ComponentDialog - { - // for file upload - private static readonly string TeamsLogoFileName = "teams-logo.png"; - - // for video card - private static readonly string CorgiOnCarouselVideo = "https://www.youtube.com/watch?v=LvqzubPZjHE"; - - // for animation card - private static readonly string MindBlownGif = "https://media3.giphy.com/media/xT0xeJpnrWC4XWblEk/giphy.gif?cid=ecf05e47mye7k75sup6tcmadoom8p1q8u03a7g2p3f76upp9&rid=giphy.gif"; - - // list of cards that exist - private static readonly List _cardOptions = Enum.GetValues(typeof(CardOptions)).Cast().ToList(); - - private readonly Uri _serverUrl; - - public CardDialog(IHttpContextAccessor httpContextAccessor) - : base(nameof(CardDialog)) - { - _serverUrl = new Uri($"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host.Value}"); - - AddDialog(new ChoicePrompt("CardPrompt", CardPromptValidatorAsync)); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { SelectCardAsync, DisplayCardAsync })); - - InitialDialogId = nameof(WaterfallDialog); - } - - private static CardOptions ParseEnum(string card) - { - return (CardOptions)Enum.Parse(typeof(CardOptions), card, true); - } - - private static HeroCard MakeUpdatedHeroCard(WaterfallStepContext stepContext) - { - var heroCard = new HeroCard - { - Title = "Newly updated card.", - Buttons = new List() - }; - - var data = stepContext.Context.Activity.Value as JObject; - data = JObject.FromObject(data); - data["count"] = data["count"].Value() + 1; - heroCard.Text = $"Update count - {data["count"].Value()}"; - heroCard.Title = "Newly updated card"; - - heroCard.Buttons.Add(new CardAction - { - Type = ActionTypes.MessageBack, - Title = "Update Card", - Text = "UpdateCardAction", - Value = data - }); - - return heroCard; - } - - private async Task SelectCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Create the PromptOptions from the skill configuration which contain the list of configured skills. - var messageText = "What card do you want?"; - var repromptMessageText = "This message will be created in the validation code"; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = _cardOptions.Select(card => new Choice(card.ToString())).ToList(), - Style = ListStyle.List - }; - - // Ask the user to enter their name. - return await stepContext.PromptAsync("CardPrompt", options, cancellationToken); - } - - private async Task DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if (stepContext.Context.Activity.Value != null) - { - await HandleSpecialActivity(stepContext, cancellationToken); - } - else - { - // Checks to see if the activity is an adaptive card update or a bot action respose - var card = ((FoundChoice)stepContext.Result).Value.ToLowerInvariant(); - var cardType = ParseEnum(card); - - if (ChannelSupportedCards.IsCardSupported(stepContext.Context.Activity.ChannelId, cardType)) - { - switch (cardType) - { - case CardOptions.AdaptiveCardBotAction: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeAdaptiveCard("botaction").ToAttachment()), cancellationToken); - break; - case CardOptions.AdaptiveCardTeamsTaskModule: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeAdaptiveCard("taskmodule").ToAttachment()), cancellationToken); - break; - case CardOptions.AdaptiveCardSubmitAction: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeAdaptiveCard("submitaction").ToAttachment()), cancellationToken); - break; - case CardOptions.Hero: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(CardSampleHelper.CreateHeroCard().ToAttachment()), cancellationToken).ConfigureAwait(false); - break; - case CardOptions.Thumbnail: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(CardSampleHelper.CreateThumbnailCard().ToAttachment()), cancellationToken).ConfigureAwait(false); - break; - case CardOptions.Receipt: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(CardSampleHelper.CreateReceiptCard().ToAttachment()), cancellationToken).ConfigureAwait(false); - break; - case CardOptions.Signin: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(CardSampleHelper.CreateSigninCard().ToAttachment()), cancellationToken).ConfigureAwait(false); - break; - case CardOptions.Carousel: - // NOTE: if cards are NOT the same height in a carousel, Teams will instead display as AttachmentLayoutTypes.List - await stepContext.Context.SendActivityAsync( - MessageFactory.Carousel(new[] - { - CardSampleHelper.CreateHeroCard().ToAttachment(), - CardSampleHelper.CreateHeroCard().ToAttachment(), - CardSampleHelper.CreateHeroCard().ToAttachment() - }), - cancellationToken).ConfigureAwait(false); - break; - case CardOptions.List: - // NOTE: MessageFactory.Attachment with multiple attachments will default to AttachmentLayoutTypes.List - await stepContext.Context.SendActivityAsync( - MessageFactory.Attachment(new[] - { - CardSampleHelper.CreateHeroCard().ToAttachment(), - CardSampleHelper.CreateHeroCard().ToAttachment(), - CardSampleHelper.CreateHeroCard().ToAttachment() - }), - cancellationToken).ConfigureAwait(false); - break; - case CardOptions.O365: - - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeO365CardAttachmentAsync()), cancellationToken).ConfigureAwait(false); - break; - case CardOptions.TeamsFileConsent: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeTeamsFileConsentCard()), cancellationToken); - break; - case CardOptions.Animation: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeAnimationCard().ToAttachment()), cancellationToken); - break; - case CardOptions.Audio: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeAudioCard().ToAttachment()), cancellationToken); - break; - case CardOptions.Video: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeVideoCard().ToAttachment()), cancellationToken); - break; - case CardOptions.AdaptiveUpdate: - await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(MakeUpdateAdaptiveCard().ToAttachment()), cancellationToken); - break; - case CardOptions.End: - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"{cardType} cards are not supported in the {stepContext.Context.Activity.ChannelId} channel."), cancellationToken); - } - } - - return await stepContext.ReplaceDialogAsync(InitialDialogId, "What card would you want?", cancellationToken); - } - - private async Task HandleSpecialActivity(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if (stepContext.Context.Activity.Text == null) - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"I received an activity with this data in the value field {stepContext.Context.Activity.Value}"), cancellationToken); - } - else - { - if (stepContext.Context.Activity.Text.ToLowerInvariant().Contains("update")) - { - if (stepContext.Context.Activity.ReplyToId == null) - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Update activity is not supported in the {stepContext.Context.Activity.ChannelId} channel."), cancellationToken); - } - else - { - var heroCard = MakeUpdatedHeroCard(stepContext); - - var activity = MessageFactory.Attachment(heroCard.ToAttachment()); - activity.Id = stepContext.Context.Activity.ReplyToId; - await stepContext.Context.UpdateActivityAsync(activity, cancellationToken); - } - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"I received an activity with this data in the text field {stepContext.Context.Activity.Text} and this data in the value field {stepContext.Context.Activity.Value}"), cancellationToken); - } - } - } - - private async Task CardPromptValidatorAsync(PromptValidatorContext promptContext, CancellationToken cancellationToken) - { - if (!promptContext.Recognized.Succeeded) - { - // This checks to see if this response is the user clicking the update button on the card - if (promptContext.Context.Activity.Value != null) - { - return await Task.FromResult(true); - } - - if (promptContext.Context.Activity.Attachments != null) - { - return await Task.FromResult(true); - } - - // Render the activity so we can assert in tests. - // We may need to simplify the json if it gets too complicated to test. - promptContext.Options.RetryPrompt.Text = $"Got {JsonConvert.SerializeObject(promptContext.Context.Activity, Formatting.Indented)}\n\n{promptContext.Options.Prompt.Text}"; - return await Task.FromResult(false); - } - - return await Task.FromResult(true); - } - - private HeroCard MakeUpdateAdaptiveCard() - { - var heroCard = new HeroCard - { - Title = "Update card", - Text = "Update Card Action", - Buttons = new List() - }; - - var action = new CardAction - { - Type = ActionTypes.MessageBack, - Title = "Update card title", - Text = "Update card text", - Value = new JObject { { "count", 0 } } - }; - - heroCard.Buttons.Add(action); - - return heroCard; - } - - private AdaptiveCard MakeAdaptiveCard(string cardType) - { - var adaptiveCard = cardType switch - { - "botaction" => CardSampleHelper.CreateAdaptiveCardBotAction(), - "taskmodule" => CardSampleHelper.CreateAdaptiveCardTaskModule(), - "submitaction" => CardSampleHelper.CreateAdaptiveCardSubmit(), - _ => throw new ArgumentException(nameof(cardType)), - }; - - return adaptiveCard; - } - - private Attachment MakeO365CardAttachmentAsync() - { - var card = CardSampleHelper.CreateSampleO365ConnectorCard(); - var cardAttachment = new Attachment - { - Content = card, - ContentType = O365ConnectorCard.ContentType, - }; - - return cardAttachment; - } - - private Attachment MakeTeamsFileConsentCard() - { - var filename = TeamsLogoFileName; - var filePath = Path.Combine("Dialogs/Cards/Files", filename); - var fileSize = new FileInfo(filePath).Length; - - return MakeTeamsFileConsentCardAttachment(filename, fileSize); - } - - private Attachment MakeTeamsFileConsentCardAttachment(string filename, long fileSize) - { - var consentContext = new Dictionary - { - { "filename", filename }, - }; - - var fileCard = new FileConsentCard - { - Description = "This is the file I want to send you", - SizeInBytes = fileSize, - AcceptContext = consentContext, - DeclineContext = consentContext, - }; - - var asAttachment = new Attachment - { - Content = fileCard, - ContentType = FileConsentCard.ContentType, - Name = filename, - }; - - return asAttachment; - } - - private AnimationCard MakeAnimationCard() - { - var url = new MediaUrl(url: MindBlownGif); - return new AnimationCard(title: "Animation Card", media: new[] { url }, autostart: true); - } - - private VideoCard MakeVideoCard() - { - var url = new MediaUrl(url: CorgiOnCarouselVideo); - return new VideoCard(title: "Video Card", media: new[] { url }); - } - - private AudioCard MakeAudioCard() - { - var url = new MediaUrl(url: $"{_serverUrl}api/music"); - return new AudioCard(title: "Audio Card", media: new[] { url }, autoloop: true); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardOptions.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardOptions.cs deleted file mode 100644 index f5cd97dafe..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardOptions.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public enum CardOptions - { - /// - /// Adaptive card - Bot action - /// - AdaptiveCardBotAction, - - /// - /// Adaptive card - Task module - /// - AdaptiveCardTeamsTaskModule, - - /// - /// Adaptive card - Submit action - /// - AdaptiveCardSubmitAction, - - /// - /// Hero cards - /// - Hero, - - /// - /// Thumbnail cards - /// - Thumbnail, - - /// - /// Receipt cards - /// - Receipt, - - /// - /// Signin cards - /// - Signin, - - /// - /// Carousel cards - /// - Carousel, - - /// - /// List cards - /// - List, - - /// - /// O365 cards - /// - O365, - - /// - /// File cards - /// - TeamsFileConsent, - - /// - /// Animation cards - /// - Animation, - - /// - /// Audio cards - /// - Audio, - - /// - /// Video cards - /// - Video, - - /// - /// Adaptive update cards - /// - AdaptiveUpdate, - - /// - /// Ends the card selection dialog - /// - End - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardSampleHelper.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardSampleHelper.cs deleted file mode 100644 index 8ae3df2ada..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/CardSampleHelper.cs +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using AdaptiveCards; -using Microsoft.Bot.Schema; -using Microsoft.Bot.Schema.Teams; -using Newtonsoft.Json.Linq; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public static class CardSampleHelper - { - public static AdaptiveCard CreateAdaptiveCardBotAction() - { - var adaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 2)); - adaptiveCard.Body.Add(new AdaptiveTextBlock("Bot Builder actions")); - - var action1 = new CardAction(ActionTypes.ImBack, "imBack", null, null, null, "text"); - var action2 = new CardAction(ActionTypes.MessageBack, "message back", null, null, null, JObject.Parse(@"{ ""key"" : ""value"" }")); - var action3 = new CardAction(ActionTypes.MessageBack, "message back local echo", null, "text received by bots", "display text message back", JObject.Parse(@"{ ""key"" : ""value"" }")); - var action4 = new CardAction("invoke", "invoke", null, null, null, JObject.Parse(@"{ ""key"" : ""value"" }")); - - adaptiveCard.Actions.Add(action1.ToAdaptiveCardAction()); - adaptiveCard.Actions.Add(action2.ToAdaptiveCardAction()); - adaptiveCard.Actions.Add(action3.ToAdaptiveCardAction()); - adaptiveCard.Actions.Add(action4.ToAdaptiveCardAction()); - - return adaptiveCard; - } - - public static AdaptiveCard CreateAdaptiveCardTaskModule() - { - var taskModuleAction = new TaskModuleAction("Launch Task Module", @"{ ""hiddenKey"": ""hidden value from task module launcher"" }"); - - var adaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 2)); - adaptiveCard.Body.Add(new AdaptiveTextBlock("Task Module Adaptive Card")); - adaptiveCard.Actions.Add(taskModuleAction.ToAdaptiveCardAction()); - - return adaptiveCard; - } - - public static AdaptiveCard CreateAdaptiveCardSubmit() - { - var adaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 2)); - adaptiveCard.Body.Add(new AdaptiveTextBlock("Bot Builder actions")); - adaptiveCard.Body.Add(new AdaptiveTextInput { Id = "x" }); - adaptiveCard.Actions.Add(new AdaptiveSubmitAction { Type = "Action.Submit", Title = "Action.Submit", Data = new JObject { { "key", "value" } } }); - - return adaptiveCard; - } - - public static Attachment CreateTaskModuleHeroCard() - { - return new HeroCard() - { - Title = "Task Module Invocation from Hero Card", - Subtitle = "This is a hero card with a Task Module Action button. Click the button to show an Adaptive Card within a Task Module.", - Buttons = new List() - { - new TaskModuleAction("Adaptive Card", new { data = "adaptivecard" }), - }, - }.ToAttachment(); - } - - public static SampleData CreateSampleData(AdaptiveCard adaptiveCard) - { - if (adaptiveCard == null) - { - throw new ArgumentNullException(nameof(adaptiveCard)); - } - - if (adaptiveCard.Body.Count < 4) - { - throw new Exception("Adaptive Card Body contains too few elements"); - } - - var userText = (adaptiveCard.Body[1] as AdaptiveTextBlock)?.Text; - var choiceSet = adaptiveCard.Body[3] as AdaptiveChoiceSetInput; - - if (choiceSet?.Choices?.Count < 3) - { - throw new Exception("Adaptive Card Body[3] contains too few choice elements"); - } - - return new SampleData - { - Question = userText, - MultiSelect = choiceSet.IsMultiSelect ? "true" : "false", - Option1 = choiceSet.Choices[0].Title, - Option2 = choiceSet.Choices[1].Title, - Option3 = choiceSet.Choices[2].Title, - }; - } - - public static AdaptiveCard CreateAdaptiveCardEditor(SampleData sampleData = null) - { - var cardData = sampleData ?? new SampleData(); - - return new AdaptiveCard(new AdaptiveSchemaVersion(1, 2)) - { - Body = new List - { - new AdaptiveTextBlock("This is an Adaptive Card within a Task Module") - { - Weight = AdaptiveTextWeight.Bolder, - }, - new AdaptiveTextBlock("Enter text for Question:"), - new AdaptiveTextInput() { Id = "Question", Placeholder = "Question text here", Value = cardData.Question }, - new AdaptiveTextBlock("Options for Question:"), - new AdaptiveTextBlock("Is Multi-Select:"), - new AdaptiveChoiceSetInput - { - Type = AdaptiveChoiceSetInput.TypeName, - Id = "MultiSelect", - Value = cardData.MultiSelect, - IsMultiSelect = false, - Choices = new List - { - new AdaptiveChoice() { Title = "True", Value = "true" }, - new AdaptiveChoice() { Title = "False", Value = "false" }, - }, - }, - new AdaptiveTextInput() { Id = "Option1", Placeholder = "Option 1 here", Value = cardData.Option1 }, - new AdaptiveTextInput() { Id = "Option2", Placeholder = "Option 2 here", Value = cardData.Option2 }, - new AdaptiveTextInput() { Id = "Option3", Placeholder = "Option 3 here", Value = cardData.Option3 }, - }, - Actions = new List - { - new AdaptiveSubmitAction - { - Type = AdaptiveSubmitAction.TypeName, - Title = "Submit", - Data = new JObject { { "submitLocation", "messagingExtensionFetchTask" } }, - }, - }, - }; - } - - public static AdaptiveCard CreateAdaptiveCard(SampleData data) - { - if (data == null) - { - throw new ArgumentNullException(nameof(data)); - } - - return new AdaptiveCard(new AdaptiveSchemaVersion(1, 2)) - { - Body = new List - { - new AdaptiveTextBlock("Adaptive Card from Task Module") { Weight = AdaptiveTextWeight.Bolder }, - new AdaptiveTextBlock($"{data.Question}") { Id = "Question" }, - new AdaptiveTextInput() { Id = "Answer", Placeholder = "Answer here..." }, - new AdaptiveChoiceSetInput - { - Type = AdaptiveChoiceSetInput.TypeName, - Id = "Choices", - IsMultiSelect = bool.Parse(data.MultiSelect), - Choices = new List - { - new AdaptiveChoice() { Title = data.Option1, Value = data.Option1 }, - new AdaptiveChoice() { Title = data.Option2, Value = data.Option2 }, - new AdaptiveChoice() { Title = data.Option3, Value = data.Option3 }, - }, - }, - }, - Actions = new List - { - new AdaptiveSubmitAction - { - Type = AdaptiveSubmitAction.TypeName, - Title = "Submit", - Data = new JObject { { "submitLocation", "messagingExtensionSubmit" } }, - }, - }, - }; - } - - public static HeroCard CreateHeroCard() - { - var heroCard = new HeroCard - { - Title = "BotFramework Hero Card", - Subtitle = "Microsoft Bot Framework", - Text = "Build and connect intelligent bots to interact with your users naturally wherever they are," + - " from text/sms to Skype, Slack, Office 365 mail and other popular services.", - Images = new List { new CardImage("https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg") }, - Buttons = new List { new CardAction(ActionTypes.OpenUrl, "Get Started", value: "https://docs.microsoft.com/bot-framework") }, - }; - - return heroCard; - } - - public static HeroCard CreateHeroCard(string type) - { - var heroCard = new HeroCard - { - Title = "BotFramework Hero Card", - Subtitle = "Microsoft Bot Framework", - Text = "Build and connect intelligent bots to interact with your users naturally wherever they are," + - " from text/sms to Skype, Slack, Office 365 mail and other popular services.", - Images = new List { new CardImage("https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg") }, - Buttons = new List { new CardAction(ActionTypes.OpenUrl, "Get Started", value: "https://docs.microsoft.com/bot-framework") }, - }; - - return heroCard; - } - - public static ThumbnailCard CreateThumbnailCard() - { - var heroCard = new ThumbnailCard - { - Title = "BotFramework Thumbnail Card", - Subtitle = "Microsoft Bot Framework", - Text = "Build and connect intelligent bots to interact with your users naturally wherever they are," + - " from text/sms to Skype, Slack, Office 365 mail and other popular services.", - Images = new List { new CardImage("https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg") }, - Buttons = new List { new CardAction(ActionTypes.OpenUrl, "Get Started", value: "https://docs.microsoft.com/bot-framework") }, - }; - - return heroCard; - } - - public static ReceiptCard CreateReceiptCard() - { - var receiptCard = new ReceiptCard - { - Title = "John Doe", - Facts = new List { new Fact("Order Number", "1234"), new Fact("Payment Method", "VISA 5555-****") }, - Items = new List - { - new ReceiptItem( - "Data Transfer", - price: "$ 38.45", - quantity: "368", - image: new CardImage(url: "https://github.com/amido/azure-vector-icons/raw/master/renders/traffic-manager.png")), - new ReceiptItem( - "App Service", - price: "$ 45.00", - quantity: "720", - image: new CardImage(url: "https://github.com/amido/azure-vector-icons/raw/master/renders/cloud-service.png")), - }, - Tax = "$ 7.50", - Total = "$ 90.95", - Buttons = new List - { - new CardAction( - ActionTypes.OpenUrl, - "More information", - "https://account.windowsazure.com/content/6.10.1.38-.8225.160809-1618/aux-pre/images/offer-icon-freetrial.png", - value: "https://azure.microsoft.com/en-us/pricing/"), - }, - }; - - return receiptCard; - } - - public static SigninCard CreateSigninCard() - { - var signinCard = new SigninCard - { - Text = "BotFramework Sign-in Card", - Buttons = new List { new CardAction(ActionTypes.Signin, "Sign-in", value: "https://login.microsoftonline.com/") }, - }; - - return signinCard; - } - - public static O365ConnectorCard CreateSampleO365ConnectorCard() - { - var actionCard1 = new O365ConnectorCardActionCard( - O365ConnectorCardActionCard.Type, - "Multiple Choice", - "card-1", - new List - { - new O365ConnectorCardMultichoiceInput( - O365ConnectorCardMultichoiceInput.Type, - "list-1", - true, - "Pick multiple options", - null, - new List - { - new O365ConnectorCardMultichoiceInputChoice("Choice 1", "1"), - new O365ConnectorCardMultichoiceInputChoice("Choice 2", "2"), - new O365ConnectorCardMultichoiceInputChoice("Choice 3", "3") - }, - "expanded", - true), - new O365ConnectorCardMultichoiceInput( - O365ConnectorCardMultichoiceInput.Type, - "list-2", - true, - "Pick multiple options", - null, - new List - { - new O365ConnectorCardMultichoiceInputChoice("Choice 4", "4"), - new O365ConnectorCardMultichoiceInputChoice("Choice 5", "5"), - new O365ConnectorCardMultichoiceInputChoice("Choice 6", "6") - }, - "compact", - true), - new O365ConnectorCardMultichoiceInput( - O365ConnectorCardMultichoiceInput.Type, - "list-3", - false, - "Pick an option", - null, - new List - { - new O365ConnectorCardMultichoiceInputChoice("Choice a", "a"), - new O365ConnectorCardMultichoiceInputChoice("Choice b", "b"), - new O365ConnectorCardMultichoiceInputChoice("Choice c", "c") - }, - "expanded", - false), - new O365ConnectorCardMultichoiceInput( - O365ConnectorCardMultichoiceInput.Type, - "list-4", - false, - "Pick an option", - null, - new List - { - new O365ConnectorCardMultichoiceInputChoice("Choice x", "x"), - new O365ConnectorCardMultichoiceInputChoice("Choice y", "y"), - new O365ConnectorCardMultichoiceInputChoice("Choice z", "z") - }, - "compact", - false) - }, - new List - { - new O365ConnectorCardHttpPOST( - O365ConnectorCardHttpPOST.Type, - "Send", - "card-1-btn-1", - @"{""list1"":""{{list-1.value}}"", ""list2"":""{{list-2.value}}"", ""list3"":""{{list-3.value}}"", ""list4"":""{{list-4.value}}""}") - }); - - var actionCard2 = new O365ConnectorCardActionCard( - O365ConnectorCardActionCard.Type, - "Text Input", - "card-2", - new List - { - new O365ConnectorCardTextInput( - O365ConnectorCardTextInput.Type, - "text-1", - false, - "multiline, no maxLength", - null, - true, - null), - new O365ConnectorCardTextInput( - O365ConnectorCardTextInput.Type, - "text-2", - false, - "single line, no maxLength", - null, - false, - null), - new O365ConnectorCardTextInput( - O365ConnectorCardTextInput.Type, - "text-3", - true, - "multiline, max len = 10, isRequired", - null, - true, - 10), - new O365ConnectorCardTextInput( - O365ConnectorCardTextInput.Type, - "text-4", - true, - "single line, max len = 10, isRequired", - null, - false, - 10) - }, - new List - { - new O365ConnectorCardHttpPOST( - O365ConnectorCardHttpPOST.Type, - "Send", - "card-2-btn-1", - @"{""text1"":""{{text-1.value}}"", ""text2"":""{{text-2.value}}"", ""text3"":""{{text-3.value}}"", ""text4"":""{{text-4.value}}""}") - }); - - var actionCard3 = new O365ConnectorCardActionCard( - O365ConnectorCardActionCard.Type, - "Date Input", - "card-3", - new List - { - new O365ConnectorCardDateInput( - O365ConnectorCardDateInput.Type, - "date-1", - true, - "date with time", - null, - true), - new O365ConnectorCardDateInput( - O365ConnectorCardDateInput.Type, - "date-2", - false, - "date only", - null, - false) - }, - new List - { - new O365ConnectorCardHttpPOST( - O365ConnectorCardHttpPOST.Type, - "Send", - "card-3-btn-1", - @"{""date1"":""{{date-1.value}}"", ""date2"":""{{date-2.value}}""}") - }); - - var section = new O365ConnectorCardSection( - "**section title**", - "section text", - "activity title", - "activity subtitle", - "activity text", - "http://connectorsdemo.azurewebsites.net/images/MSC12_Oscar_002.jpg", - "avatar", - true, - new List - { - new O365ConnectorCardFact("Fact name 1", "Fact value 1"), - new O365ConnectorCardFact("Fact name 2", "Fact value 2"), - }, - new List - { - new O365ConnectorCardImage - { - Image = "http://connectorsdemo.azurewebsites.net/images/MicrosoftSurface_024_Cafe_OH-06315_VS_R1c.jpg", - Title = "image 1" - }, - new O365ConnectorCardImage - { - Image = "http://connectorsdemo.azurewebsites.net/images/WIN12_Scene_01.jpg", - Title = "image 2" - }, - new O365ConnectorCardImage - { - Image = "http://connectorsdemo.azurewebsites.net/images/WIN12_Anthony_02.jpg", - Title = "image 3" - } - }); - - var card = new O365ConnectorCard() - { - Summary = "O365 card summary", - ThemeColor = "#E67A9E", - Title = "card title", - Text = "card text", - Sections = new List { section }, - PotentialAction = new List - { - actionCard1, - actionCard2, - actionCard3, - new O365ConnectorCardViewAction( - O365ConnectorCardViewAction.Type, - "View Action", - null, - new List - { - "http://microsoft.com" - }), - new O365ConnectorCardOpenUri( - O365ConnectorCardOpenUri.Type, - "Open Uri", - "open-uri", - new List - { - new O365ConnectorCardOpenUriTarget - { - Os = "default", - Uri = "http://microsoft.com" - }, - new O365ConnectorCardOpenUriTarget - { - Os = "iOS", - Uri = "http://microsoft.com" - }, - new O365ConnectorCardOpenUriTarget - { - Os = "android", - Uri = "http://microsoft.com" - }, - new O365ConnectorCardOpenUriTarget - { - Os = "windows", - Uri = "http://microsoft.com" - } - }) - } - }; - - return card; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/ChannelSupportedCards.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/ChannelSupportedCards.cs deleted file mode 100644 index 426c3c118b..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/ChannelSupportedCards.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using Microsoft.Bot.Connector; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public static class ChannelSupportedCards - { - /// - /// This tracks what cards are not supported in a given channel. - /// - private static readonly Dictionary> UnsupportedChannelCards = new Dictionary> - { - { - Channels.Emulator, new List - { - CardOptions.AdaptiveCardTeamsTaskModule, - CardOptions.AdaptiveUpdate, - CardOptions.O365, - CardOptions.TeamsFileConsent - } - }, - { Channels.Directline, new List { CardOptions.AdaptiveUpdate } }, - { - Channels.Telegram, new List - { - CardOptions.AdaptiveCardBotAction, - CardOptions.AdaptiveCardTeamsTaskModule, - CardOptions.AdaptiveCardSubmitAction, - CardOptions.List, - CardOptions.TeamsFileConsent - } - } - }; - - /// - /// This let's you know if a card is supported in a given channel. - /// - /// Bot Connector Channel. - /// Card Option to be checked. - /// A bool if the card is supported in the channel. - public static bool IsCardSupported(string channel, CardOptions type) - { - if (UnsupportedChannelCards.ContainsKey(channel)) - { - if (UnsupportedChannelCards[channel].Contains(type)) - { - return false; - } - } - - return true; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/buildreactionbotframework.jpg b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/buildreactionbotframework.jpg deleted file mode 100644 index f410fc137e4d78ef6934f7a06f7b0e50b7b45267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65992 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
  • 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%0D`!{J7<*jP93$p#* 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 b7On43EM4=dB^(`JDI-si{pp%v_$nOfp(Kaus+ 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 z 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 - /// Stores the information needed to resume a conversation when a proactive message arrives. - /// - public class ContinuationParameters - { - public IIdentity ClaimsIdentity { get; set; } - - public string OAuthScope { get; set; } - - public ConversationReference ConversationReference { get; set; } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/WaitForProactiveDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/WaitForProactiveDialog.cs deleted file mode 100644 index aa6cf4b55a..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/WaitForProactiveDialog.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Concurrent; -using System.Security.Principal; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Proactive -{ - public class WaitForProactiveDialog : Dialog - { - // Message to send to users when the bot receives a Conversation Update event - private const string NotifyMessage = "Navigate to {0}api/notify?user={1} to proactively message the user."; - private readonly ConcurrentDictionary _continuationParametersStore; - - private readonly Uri _serverUrl; - - public WaitForProactiveDialog(IHttpContextAccessor httpContextAccessor, ConcurrentDictionary continuationParametersStore) - { - _continuationParametersStore = continuationParametersStore; - _serverUrl = new Uri($"{httpContextAccessor.HttpContext.Request.Scheme}://{httpContextAccessor.HttpContext.Request.Host.Value}"); - } - - public override async Task BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default) - { - // Store a reference to the conversation. - AddOrUpdateContinuationParameters(dc.Context); - - // Render message with continuation link. - await dc.Context.SendActivityAsync(MessageFactory.Text(string.Format(NotifyMessage, _serverUrl, dc.Context.Activity.From.Id)), cancellationToken); - return EndOfTurn; - } - - public override async Task ContinueDialogAsync(DialogContext dc, CancellationToken cancellationToken = default) - { - if (dc.Context.Activity.Type == ActivityTypes.Event && dc.Context.Activity.Name == ActivityEventNames.ContinueConversation) - { - // We continued the conversation, forget the proactive reference. - _continuationParametersStore.TryRemove(dc.Context.Activity.From.Id, out _); - - // The continue conversation activity comes from the ProactiveController when the notification is received - await dc.Context.SendActivityAsync("We received a proactive message, ending the dialog", cancellationToken: cancellationToken); - - // End the dialog so the host gets an EoC - return new DialogTurnResult(DialogTurnStatus.Complete); - } - - // Keep waiting for a call to the ProactiveController. - await dc.Context.SendActivityAsync($"We are waiting for a proactive message. {string.Format(NotifyMessage, _serverUrl, dc.Context.Activity.From.Id)}", cancellationToken: cancellationToken); - - return EndOfTurn; - } - - /// - /// Helper to extract and store parameters we need to continue a conversation from a proactive message. - /// - /// A turnContext instance with the parameters we need. - private void AddOrUpdateContinuationParameters(ITurnContext turnContext) - { - var continuationParameters = new ContinuationParameters - { - ClaimsIdentity = turnContext.TurnState.Get(BotAdapter.BotIdentityKey), - ConversationReference = turnContext.Activity.GetConversationReference(), - OAuthScope = turnContext.TurnState.Get(BotAdapter.OAuthScopeKey) - }; - - _continuationParametersStore.AddOrUpdate(turnContext.Activity.From.Id, continuationParameters, (_, __) => continuationParameters); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillDialog.cs deleted file mode 100644 index 90add0aca3..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillDialog.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Sso -{ - public class SsoSkillDialog : ComponentDialog - { - private readonly string _connectionName; - - public SsoSkillDialog(IConfiguration configuration) - : base(nameof(SsoSkillDialog)) - { - _connectionName = configuration.GetSection("SsoConnectionName")?.Value; - AddDialog(new SsoSkillSignInDialog(_connectionName)); - AddDialog(new ChoicePrompt("ActionStepPrompt")); - - var waterfallSteps = new WaterfallStep[] - { - PromptActionStepAsync, - HandleActionStepAsync, - PromptFinalStepAsync - }; - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps)); - - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - const string messageText = "What SSO action would you like to perform on the skill?"; - const string repromptMessageText = "That was not a valid choice, please select a valid choice."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = await GetPromptChoicesAsync(stepContext, cancellationToken) - }; - - // Prompt the user to select a skill. - return await stepContext.PromptAsync("ActionStepPrompt", options, cancellationToken); - } - - private async Task> GetPromptChoicesAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var promptChoices = new List(); - var adapter = (IUserTokenProvider)stepContext.Context.Adapter; - var token = await adapter.GetUserTokenAsync(stepContext.Context, _connectionName, null, cancellationToken); - - if (token == null) - { - promptChoices.Add(new Choice("Login")); - } - else - { - promptChoices.Add(new Choice("Logout")); - promptChoices.Add(new Choice("Show token")); - } - - promptChoices.Add(new Choice("End")); - - return promptChoices; - } - - private async Task HandleActionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var action = ((FoundChoice)stepContext.Result).Value.ToLowerInvariant(); - - switch (action) - { - case "login": - return await stepContext.BeginDialogAsync(nameof(SsoSkillSignInDialog), null, cancellationToken); - - case "logout": - var adapter = (IUserTokenProvider)stepContext.Context.Adapter; - await adapter.SignOutUserAsync(stepContext.Context, _connectionName, cancellationToken: cancellationToken); - await stepContext.Context.SendActivityAsync("You have been signed out.", cancellationToken: cancellationToken); - return await stepContext.NextAsync(cancellationToken: cancellationToken); - - case "show token": - var tokenProvider = (IUserTokenProvider)stepContext.Context.Adapter; - var token = await tokenProvider.GetUserTokenAsync(stepContext.Context, _connectionName, null, cancellationToken); - if (token == null) - { - await stepContext.Context.SendActivityAsync("User has no cached token.", cancellationToken: cancellationToken); - } - else - { - await stepContext.Context.SendActivityAsync($"Here is your current SSO token: {token.Token}", cancellationToken: cancellationToken); - } - - return await stepContext.NextAsync(cancellationToken: cancellationToken); - - case "end": - return new DialogTurnResult(DialogTurnStatus.Complete); - - default: - // This should never be hit since the previous prompt validates the choice - throw new InvalidOperationException($"Unrecognized action: {action}"); - } - } - - private async Task PromptFinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // Restart the dialog (we will exit when the user says end) - return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillSignInDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillSignInDialog.cs deleted file mode 100644 index 61c57301dc..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Sso/SsoSkillSignInDialog.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Sso -{ - public class SsoSkillSignInDialog : ComponentDialog - { - public SsoSkillSignInDialog(string connectionName) - : base(nameof(SsoSkillSignInDialog)) - { - AddDialog(new OAuthPrompt(nameof(OAuthPrompt), new OAuthPromptSettings - { - ConnectionName = connectionName, - Text = "Sign in to the Skill using AAD", - Title = "Sign In" - })); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { SignInStepAsync, DisplayTokenAsync })); - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task SignInStepAsync(WaterfallStepContext context, CancellationToken cancellationToken) - { - // This prompt won't show if the user is signed in to the host using SSO. - return await context.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken); - } - - private async Task DisplayTokenAsync(WaterfallStepContext context, CancellationToken cancellationToken) - { - if (!(context.Result is TokenResponse result)) - { - await context.Context.SendActivityAsync("No token was provided for the skill.", cancellationToken: cancellationToken); - } - else - { - await context.Context.SendActivityAsync($"Here is your token for the skill: {result.Token}", cancellationToken: cancellationToken); - } - - return await context.EndDialogAsync(null, cancellationToken); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Update/UpdateDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Update/UpdateDialog.cs deleted file mode 100644 index 1ec0a5217d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Update/UpdateDialog.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Update -{ - public class UpdateDialog : ComponentDialog - { - private readonly List _updateSupported = new List - { - Channels.Msteams, - Channels.Slack, - Channels.Telegram - }; - - private readonly Dictionary _updateTracker; - - public UpdateDialog() - : base(nameof(UpdateDialog)) - { - _updateTracker = new Dictionary(); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { HandleUpdateDialog, FinalStepAsync })); - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task HandleUpdateDialog(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var channel = stepContext.Context.Activity.ChannelId; - if (_updateSupported.Contains(channel)) - { - if (_updateTracker.ContainsKey(stepContext.Context.Activity.Conversation.Id)) - { - var conversationId = stepContext.Context.Activity.Conversation.Id; - var tuple = _updateTracker[conversationId]; - var activity = MessageFactory.Text($"This message has been updated {tuple.Item2} time(s)."); - tuple.Item2 += 1; - activity.Id = tuple.Item1; - _updateTracker[conversationId] = tuple; - await stepContext.Context.UpdateActivityAsync(activity, cancellationToken); - } - else - { - var id = await stepContext.Context.SendActivityAsync(MessageFactory.Text("Here is the original activity"), cancellationToken); - _updateTracker.Add(stepContext.Context.Activity.Conversation.Id, (id.Id, 1)); - } - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Delete is not supported in the {channel} channel."), cancellationToken); - return new DialogTurnResult(DialogTurnStatus.Complete); - } - - // Ask if we want to update the activity again. - const string messageText = "Do you want to update the activity again?"; - const string repromptMessageText = "Please select a valid answer"; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText), - }; - - // Ask the user to enter their name. - return await stepContext.PromptAsync(nameof(ConfirmPrompt), options, cancellationToken); - } - - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var tryAnother = (bool)stepContext.Result; - if (tryAnother) - { - return await stepContext.ReplaceDialogAsync(InitialDialogId, cancellationToken: cancellationToken); - } - - _updateTracker.Remove(stepContext.Context.Activity.Conversation.Id); - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Middleware/SsoSaveStateMiddleware.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Middleware/SsoSaveStateMiddleware.cs deleted file mode 100644 index f0fb5e5bad..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Middleware/SsoSaveStateMiddleware.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Middleware -{ - /// - /// A middleware that ensures conversation state is saved when an OAuthCard is returned by the skill. - /// - /// - /// In SSO, the host will send an Invoke with the token if SSO is enabled. - /// This middleware saves the state of the bot before sending out the SSO card to ensure the dialog state - /// is persisted and in the right state if an InvokeActivity comes back from the Host with the token. - /// - public class SsoSaveStateMiddleware : IMiddleware - { - private readonly ConversationState _conversationState; - - public SsoSaveStateMiddleware(ConversationState conversationState) - { - _conversationState = conversationState; - } - - public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new CancellationToken()) - { - // Register outgoing handler. - turnContext.OnSendActivities(OutgoingHandler); - - // Continue processing messages. - await next(cancellationToken); - } - - private async Task OutgoingHandler(ITurnContext turnContext, List activities, Func> next) - { - foreach (var activity in activities) - { - // Check if any of the outgoing activities has an OAuthCard. - if (activity.Attachments != null && activity.Attachments.Any(attachment => attachment.ContentType == OAuthCard.ContentType)) - { - // Save any state changes so the dialog stack is ready for SSO exchanges. - await _conversationState.SaveChangesAsync(turnContext, false, CancellationToken.None); - } - } - - return await next(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Program.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Program.cs deleted file mode 100644 index 31e4c693d2..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Properties/launchSettings.json deleted file mode 100644 index f3bdbffd6c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35420/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "WaterfallSkillBotDotNet": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "http://localhost:35420/", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/SkillAdapterWithErrorHandler.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/SkillAdapterWithErrorHandler.cs deleted file mode 100644 index a4098b193c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/SkillAdapterWithErrorHandler.cs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.TraceExtensions; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.Bot.Schema; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Middleware; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot -{ - public class SkillAdapterWithErrorHandler : BotFrameworkHttpAdapter - { - private readonly ConversationState _conversationState; - private readonly ILogger _logger; - - public SkillAdapterWithErrorHandler(IConfiguration configuration, ICredentialProvider credentialProvider, AuthenticationConfiguration authConfig, ILogger logger, ConversationState conversationState) - : base(configuration, credentialProvider, authConfig, logger: logger) - { - _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - OnTurnError = HandleTurnError; - - // Add autosave middleware for SSO. - Use(new SsoSaveStateMiddleware(_conversationState)); - } - - private async Task HandleTurnError(ITurnContext turnContext, Exception exception) - { - // Log any leaked exception from the application. - _logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); - - await SendErrorMessageAsync(turnContext, exception); - await SendEoCToParentAsync(turnContext, exception); - await ClearConversationStateAsync(turnContext); - } - - private async Task SendErrorMessageAsync(ITurnContext turnContext, Exception exception) - { - try - { - // Send a message to the user. - var errorMessageText = "The skill encountered an error or bug."; - var errorMessage = MessageFactory.Text(errorMessageText + Environment.NewLine + exception, errorMessageText, InputHints.IgnoringInput); - errorMessage.Value = exception; - await turnContext.SendActivityAsync(errorMessage); - - errorMessageText = "To continue to run this bot, please fix the bot source code."; - errorMessage = MessageFactory.Text(errorMessageText, errorMessageText, InputHints.ExpectingInput); - await turnContext.SendActivityAsync(errorMessage); - - // Send a trace activity, which will be displayed in the Bot Framework Emulator. - // Note: we return the entire exception in the value property to help the developer; - // this should not be done in production. - await turnContext.TraceActivityAsync("OnTurnError Trace", exception.ToString(), "https://www.botframework.com/schemas/error", "TurnError"); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught in SendErrorMessageAsync : {ex}"); - } - } - - private async Task SendEoCToParentAsync(ITurnContext turnContext, Exception exception) - { - try - { - // Send an EndOfConversation activity to the skill caller with the error to end the conversation, - // and let the caller decide what to do. - var endOfConversation = Activity.CreateEndOfConversationActivity(); - endOfConversation.Code = "SkillError"; - endOfConversation.Text = exception.Message; - await turnContext.SendActivityAsync(endOfConversation); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught in SendEoCToParentAsync : {ex}"); - } - } - - private async Task ClearConversationStateAsync(ITurnContext turnContext) - { - try - { - // Delete the conversationState for the current conversation to prevent the - // bot from getting stuck in a error-loop caused by being in a bad state. - // ConversationState should be thought of as similar to "cookie-state" for a Web page. - await _conversationState.DeleteAsync(turnContext); - } - catch (Exception ex) - { - _logger.LogError(ex, $"Exception caught on attempting to Delete ConversationState : {ex}"); - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Startup.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Startup.cs deleted file mode 100644 index 7405acb74d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Startup.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Concurrent; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.BotFramework; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.Integration.AspNet.Core.Skills; -using Microsoft.Bot.Builder.Skills; -using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Authentication; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Bots; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs; -using Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Proactive; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers() - .AddNewtonsoftJson(); - - // Configure credentials. - services.AddSingleton(); - if (!string.IsNullOrEmpty(Configuration["ChannelService"])) - { - // Register a ConfigurationChannelProvider -- this is only for Azure Gov. - services.AddSingleton(); - } - - // Register AuthConfiguration to enable custom claim validation. - services.AddSingleton(sp => new AuthenticationConfiguration { ClaimsValidator = new Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Authentication.AllowedCallersClaimsValidator(sp.GetService()) }); - - // Register the Bot Framework Adapter with error handling enabled. - // Note: some classes use the base BotAdapter so we add an extra registration that pulls the same instance. - services.AddSingleton(); - services.AddSingleton(sp => sp.GetService()); - - // Register the skills conversation ID factory, the client and the request handler. - services.AddSingleton(); - services.AddHttpClient(); - services.AddSingleton(); - - // Create the storage we'll be using for User and Conversation state. (Memory is great for testing purposes.) - services.AddSingleton(); - - // Create the Conversation state. (Used by the Dialog system itself.) - services.AddSingleton(); - - // The Dialog that will be run by the bot. - services.AddSingleton(); - - // The Bot needs an HttpClient to download and upload files. - services.AddHttpClient(); - - // Create a global dictionary for our ConversationReferences (used by proactive) - services.AddSingleton>(); - - // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. - services.AddTransient>(); - - // Gives us access to HttpContext so we can create URLs with the host name. - services.AddHttpContextAccessor(); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles() - .UseStaticFiles() - .UseWebSockets() - .UseRouting() - .UseAuthorization() - .UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - - // Uncomment this to support HTTPS. - // app.UseHttpsRedirection(); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/WaterfallSkillBot.csproj b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/WaterfallSkillBot.csproj deleted file mode 100644 index a534c34089..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/WaterfallSkillBot.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - netcoreapp3.1 - latest - Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot - Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot - cca62821-0d1d-4b4d-8e5b-8ee934324a2c - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - - - - - - Always - - - Always - - - PreserveNewest - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/appsettings.json b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/appsettings.json deleted file mode 100644 index aeba3b0618..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/appsettings.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "MicrosoftAppId": "", - "MicrosoftAppPassword": "", - "ConnectionName": "TestOAuthProvider", - "SsoConnectionName": "", - "ChannelService": "", - // This is a comma separate list with the App IDs that will have access to the skill. - // This setting is used in AllowedCallersClaimsValidator. - // Examples: - // [ "*" ] allows all callers. - // [ "AppId1", "AppId2" ] only allows access to parent bots with "AppId1" and "AppId2". - "AllowedCallers": [ "*" ], - - "SkillHostEndpoint": "http://localhost:35420/api/skills", - "EchoSkillInfo": { - "Id": "EchoSkillBot", - "AppId": "", - "SkillEndpoint": "http://localhost:35400/api/messages" - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/default.htm b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/default.htm deleted file mode 100644 index 53166d3e75..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/default.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - WaterfallSkillBot - - - - - -
    -
    -
    -
    WaterfallSkillBot Bot
    -
    -
    -
    -
    - -
    - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/images/architecture-resize.png b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/wwwroot/images/architecture-resize.png deleted file mode 100644 index e65f0f7332b79a3f65cd5a4ea6c33c7b5f979f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137666 zcmeEtx_YOAr-8-0O1UTp?w5DGhp&J+% zRT=Sj)f2>jp*tTe#T3Qfy{n5wdN%$D-A8o%s_pXb9cu5t7Yq)a+>dwf-il-;#ne3w zPO{;Rum|u4yKj^bI`21p&O7DQ3VCo~K4Pn=KkF(N(ve7hux6Mklud*l6GE56obj1_ z0rPmk%OD7ezQ3NO_GoBmZ}4dcY_wck41&l-3#P3&38SU|ZE8psio5^&{lAUZ_*9_s z|2b};)<{10pD$-DVlyFd{pZ{JTvABl|NAokb*kd@|3CHL(EY!M>4J-rn;SQkSzp}q zdm8=TJUKrp|^wcl=P%YSByd^AQPmGxWS$<_!i`vhb8=&)avq-|2guGj$A^fQg(J zFO1kvd=85*UBs`{ulh}&hGNKuI=rsg9H+>?JRGB`RX3v44CUwxD1vjyT3%o;9#aiX zwu8fYowj*V$@rt{L|zJy#_*)#5PDIFxVQgw(RO=qX5fwAWw%Ri`bJpK7Mq-J2rab$ z$hzLP;C;Do)bzT~%t5!_bzY;Im4@wuH{;Of@}=2fJ%&V}nTmk{lvFN@%7mbn7DECK zY_R2jz8uOe#-@tIW%=3AK*jHIW+NvHxfmY}4o`GEnqyM~js9eUt-+~TeYD{mi9^pN zPxeFB;j|3|`$H6o3#{?4MoO-HzwgjuU`?yU7iYzWCO2`t8nogIG&`^t38q;&u@@_5 z#sp|F%T%O{vwB^bJwF}0-nO`RKJofL@2&JFZO3-w8ts7s6rcl8p;^;2&|o>$X^S`Z zY)?}>+VpJm@D@j<#oSSfU)=lgYAdx&?c&sfN`anG@o2aIFNev_AmwLXbVI*e>SD$0 z;+*u!Zv2=J+UIV!5o|lQgBfnetd@6QW_hR_s+sXQyg$<@W_;3G#KW?W)2w^c{I8io zASAeXOcth?$&=^&SU;RXMa%4E(6@`YGhHvG)@ZY?xrc-ltDGl26hqQCU!k>iXcX#- zJN|6K%ccVRC?f~{UE1AGbtH#7lc_8x1iHa0ZIk#h&ZikAYgBiRsbI|l zS*8!6A;!xy)TJs_44~v1^1CTS=tTWtXheQ@vJuS#_Qjf*m?&OrB#K|6o}8kutH{aG z+GL(Ah>VQX!NVj3&RQz%T;v7SlgZR6YVSVYOD$CTTAa05W)8T&@&QOQxa`A>bJ0TE z+uOb2IKrYU^($z~wQ3N3e0fwA3lBv6A~)O**oTOFo87N ztFm~?bw%ATeVMFS+}!a~OO9nqXnf(RHk8N_^g3@43BQUvPd>O0ThhC$ySw?RU1m4pRc9U(69WRyp4C-C?$3idgM=cmnUT+RH-^a}tf>Ob!Uj!pS#i#ex|VGY zDS0+}-2rbfe4)s#d#6EFsyr%xEJstulXjQ`SPUY9(-7KHa{I(478e$9AFmH2+Uobt zeBRs!X0cYA0YiK8sr?2+cSS_)y!bh|hwj zYT8OQ=Ub>>%y2Eb@Add%sY*d}#FKNahv?7ukJI^5NV{Xn$1&f~F$n10jaZbjcq#nn zsWGIORnNhl0eu6^GqIzYJS+~7M@AyAt-wn!C0gzT&qyXgnn~HaljZYEt|dChi$7vs z7ItRc(qJ0i&)AUubAB5CIcOXX04>^va5vBew!I$N>&-?e_wobW@d*YT_#>H6amk!x zlahrU(y|P3>s(TX+PA$lavJnO8xN3mToIm@D=n+zi5wxuJ4hTqczYmn>&{+;8t$=U zwu@$PXnhA3L!|p1aa=w0Nn$Q`R!5>Zwhu|e!NG;U`N*9(D|s4RV+PppFb~%?SWdbR z;rS;|`61-OE&?{hTdLQmYQ^k*Uv51fta~LZ4V&IK96ZN#Jbv2lFPlx{cVnoIL~pEb z77q*)Au1b#biXm{v{={N#gmHzrZ!`xBzcW?V@1k1oeziEd?B}551tqAIPKQn{}dBD zoIN0!!;JS(VyGIWe9vy?IFuW}^g|8va>whI9}eZ|-R;prO6UP)$3R^e7K|AH5J@W3 zUSK*jQJnP$G;ezW86&U}BKryq-JeLt>Jui3Frk*;xo^9!v%92p60e-gbQ6xFj=&pi z0sGOS&2{F7eu!MczkIppWs(ku>^xo?zgVB(@3MTy$741a+#N|QOz5`q{)3hL<7B>o zapP?5G^WAj^vNxXl#4L6-)MPdncgx_Iy!@wZbCCRXML*pMYq_O=VJbX1p|MxCYU3{ z_0CTFa(vOSKs0X`a{mGDqv=iBG%vNeS<$yX6HD6?kZQi96Aoz#oq5LPszRlHr%u18 z;OaDkMMtht%iZ=l$Mq0OmRp?W{l=XCMN#8qy4%!BBSq~vFR70&_Ipy-^Z)%76Ohq zquSom=>n&RO_)a}?K@tLSHNypg?2^Eia~+bvL4RXT$Kwg@*#xzx9hpJ+(&7UOTGP$ z_j7~Y$C+?ts?ZqXfh2mh&0|0L<=ocR?@sP(7iR)~Qi&wTL|bfc0@Vo*O1pZuX^CJ9@d`%jELmUU+SnvrBGTVnaQ{36;YE z?KBwY_D}^~nu9ak-i!xX)TWN2xyudBBt2W5o3D1qe#)BQ&9)I4O1}vD*Dp==m1?&$ zr@S<%cP@p;TV~$91-wC?l$JVTdF2ZNh=VvvzA;RX*3!en3;42~sHvA}s_ju+zdmC{ zz8TPQGmDJ{FFDt_y};i{RCjz#syaXtfW=HEX>4j5{ANOSjYAg|xjm(r!K+O?)WBdS zLP4Rju=>mPpk=y9*JHT>=Y65W(M%au2Dg2A|FMSCegqC<6aj|?0})^(%?YdS42*+6 zbuQ$3lH`kx5|H}0{&Xcks~j8}94fP!ExbNmRB?H4De{LR2tH3?xt`bi`Llz!K2BX0 zmJrwrtsvk*<>dTbBWGt4H3XG3;pryeaJ5}v#p5I}rxWtabIbSPd9+56&vTsCXsEf0 zp>T=(ZF#f~>~~MnFK<`?|FyF>d*cX6Y_n1#B(M{2xu#r7G%PR zS1Hx%Ce7fkj0MO<#aV7Sbmk_hSx$^_2*3$}&mp11!~1lsmf)>4`l#*k`5z&} zp*_DNyE%{5c&i3>cjwj%5zLefU2NqRWG%J4aXSq1yb;A*io}XV>$uIkn;qo%nWzc( z4WGY;{zf6(=~xQE0Q*OhV;D6GV0%7FS@~11?vEsXv*$RE{dk336ZbOL`@6{&gP1rN zAhonmsrK#UvONp|2`hI*WhQ94)L7s5b>I!1{`Fu|OKF$%Ze|Xljk9t9lZ@!%ttYi=ZX{hVFZis9342*I-Ppk=1lZ zneqAx7ts9_%&CCSBV8mjG)TDN-QG~x#C5XPHBX)#wKbDm0YnofHbWoUaJ;#oNM>Q9 z=$SeXf&sD!LnQrpsA8h?ysr0wC~s9NU@3IM6^}!sQniv8vS#q>4 z9YFYj28+a~W)+It@d8&A8P5Xx;W?mnZ^zbZy|^mR?N}4YsKs378ycI-s$OBxcX25b zglw=Vs6pUyvcfcEZ+-Zn=`#{<6c!W1mc{P|Qf_xA=>sF}6FkGdNABwCQgtY6PBh*< ztOF9xR}kScKg^=zU|6?$jjm3$7zXsk*z3+c<#dAC8m*?sYW>#<-2|)OT$k|b6}kEr zn26L#um0j0657m{n}2V&XriE`T&s1u#+9gAX+j>);Nq&(YnI%@I2fAhv;+k4(!x1~ zsjvLyI6$^vZQ^h}UeWgZ76Y~z=jODYS*kTJxbz(Qmc!oYy@S#hOV!O2_DkJbKDCN< zuEG#}al6=uVr)zS94@8nE9bIB(J0sCLMFNkr=Xxv+9MJ$&d*DE&dKC?E%8TU+Xmk6 z`eyRjnzXu~)`K{_j#z;FO}2#nDH+=_?IqNg+Vxim~2*}r9SuRMqkGw;x$eqMuxZ!x!kC9AE$v$|Y zIn=UyUtxbZTT-$$QzQ?Bg-0uO1HW7pP<#UF3_b zIa!D%k9m;Yj^;U{Al6a81158XY#;n4^dt&s6p`gqzi{rc<99f$ak~Cp7@sOPN2-f0 zndfj)Z1!t+!ILPEMo}l+68`OWZvEhOg9b+i0QB7+8-P%0huY8Yd0cTJn1q;Sa=dGm7f#xMIwm#Uk6^rFJ-EJ%+c$!8%?bu{JL`wz*hdrC z9h3m(hgIb=XPmyMziJ9?$iQ4$1(oKUgL;p1hdOy<;Iv3AhdK_V!S3(6%j;1l00lbx zIEh8vC6{x5{2-S|Jrgo(-v>I@>6%?HoC3YCvI3s|q6c+@?Iq023XRu-N8m8pKo)DQ z)*TLgKz};~)K8piN#~a)ncAT!4;K;=eZX530S`M4Nhv9!=R#(Ji!GzNZ*Is$Je6t? z%k{ZNZ5KXi{XQ*2KWpBA*DPajm!FNk>O@wzk=0sbS^cTVGpqPZimY~{U0a@ikT=k< zSSbY%4y?U!tjnA2uTJJTS#OZvLqz_>?Rq{vs|+2?KA9kR!if=o)Cm3Swo^;1#VtjN zw|lV0<5*NC>&TS4-7B;~N3LXRA3Yaw?&ldy?%jBSM@eSXV2^q@BXWy|_E*SQG>Yuc z-zGwd^lKlW~e66 zs^_4sv_czJd?jL$@|;;B9sq&&jn~kWsBfC73|hJGjZ4Oei%z?eecv2?Vv=E#f1k7j zmKUkd?MeQXUh1h1^n;7&zg;}n4T2(WX6q>UpmWLbWQi>(S5Q~2_#027!#v3GvX?J8R(Q2|T-xx<_mefc zO9~!`?<}wSQ4cKfz`q<81m)rDy4`1n$wOMtNff!hCWp+zIW_l+mlOaHpG>)%gz)3s z)P45G5yvH#&v*TtX^*EH?kph}o#oXXS|x&&=5r$}aCOxZKT9&;G$1pnoA&+M#bkoi z5rJW|b8=q&gO*4vNzqk@+~K0uWOt(4t+R`Vmy;7~XT2Et_j%_(EOPG5|d4L`i5 zqd7GIKhpkWzX|1T)nBLcgO%ebY^bZb|v1)Taa(wu~lp}k2*BKoIxyyIn`{dc~qQ%QEKp}Hy zm&W#jH&?Aob^xtD%dm!~3Ve7t?H9yJVvj@7-rl1sF)y_m7p%nAuz@|e z4By|~5^-sQN0S&3orXVmcN2QWJl`&Y=~U@NfB|g8)zyDDcMroBm@*1vuTyxvwmJLL zC>Ur^SGfVIi|JKApPBIeFPCeL!y@5h$b`!8aIo;;Z5fH?1BbzlU-JU3l)K|A+ujH< zFMk?QE#4pG4wk3z1HbsPn}vOnxV`D9yb3e!6Om8N*IQOSoQLQq4^2#l|EY&Nk|3ropAH$==CDD*lrLj?|&2D;VnM=vZ`QB0~ zSJRqsTwaFMquB_sQm>eE`-(5<$qHSRkS^=k7#MyqLClVuPcPcsunc`K%a(>PkJ5(| z8B3Nrd#=crjBdN%%6*}Ws>)PHlx*fbHr3?z(R_u9 zw4F;g3|To$=gGe=!kL@IpqBhm#x6=*~5!DacTgejg&akvQ)U=k-dQ_Aj)T+_M6U zBkea@-pD5+NDikv8ExjPkz{1x%@Tg^MsDTGcOfs;PTQGQ&gpspZ|ZOBzsBdIZEA+0%g{4Wyf~<<{CYZjihfmDRgRiok-mWrj zpOR~hUkV`kHk{w&?CcsJP&647u8pUdH|}oZExpm@Qt3-_X0!O}O&?PGj2Ydn_9Bu8 zqv~tuF5kRekAtB_RN-@ZaWqjG-3LQMk!0#rJFO~dloJ6*^u=m@4Qu~xJhruZoq4&h zw39DC`$7j|1!7|1(8Tj72h?+BsO7iETiQ2I9+57(%p1Q2S0%qdx=VC6Kq*WW;(UF* zlp5H{ot@LLF zxdpqonR1MuW36?JXk_NS3Tsl4YSGm;F@9eGX_T03w2A7YPA_Oyn)t_$KjgRBe(=`^ zqevy6`~2`y*=fUKafq?YyVR7Y;*GIh`Y!G+#XKcH*vywY$hDR4bqdI(vPbZ6 zI8;{;lLIL~e-ZaXLqtl1XT^X5^%~&u-H~kF@UOt@xNAIS`VzoFb?1XrKdQul|I4iw z@mjkU;?NZOju#Dewl2T-;g!KI!Zl8 z4LaJ1-F27C-~MVL0qZxH15pGXqpy?O10X9nI6_8*==~z9!Kg{yYno`*fLF33ZOB$A z+5Bh%nM`y~!T^$bbH(-_&%$r9`BHMF=N4Cy?_8bSB;rQS1|rEfIV^A!(1IpD<|c+Z zT`w@r!*`gKwZCMH*9Pc)H$%>+ih>1Cx${K?sVet}60F#)NQvAE5|N-qkSt(@Bm{SI z_~uY#^hd@-WWks0q_ddPSjdQ!4@Z0T3E_*-F zUbm(6yks&*BiL`ukc#2>TQ9P0_^X#(4SGV_~`D>WP@1^Gl#k7$FVV_l6a@c}z#+I*-KCTZc>Lzuvt!6hsd-rZ8%3e=F z^S=JrGL378Lw;*$_jMG&dva}@Mm_nEJesOt8^s!Rdsw%V#$m~9F`g0fc)eeScbak+ zp`RLs0(&n!D$D0{hU~mILhb%g-AOHlgeRFFHdKqg(=gh}`ngLo+~*kej?0YqOFLYr zoR!!EahY}}5R-<>c8;}(^;JNjKehAdT^2Uue7OgJIz=5%r)#fvSM2Xdy!xL@dn{xV zv)!|AaUqloJ>s9!wt|Ls@W-e1N!`qZhq1-cGR^{DAP-a2`jhahgDFFt{w1ZH_?WxK z9a;}FOW%7zX&3f_E#_^@mTZPyYlrJ4En#C2crJ3^L)iC0Y&VH{l*Rr72YtY;s{t32 zQk~MNqo9EH&&{hBa}LF1mb7+qDHa=}h`%!>5+QY^@f8a_lbd!-4wN|R0H&lB;w zKG3ETh+^lw$6l1!DVsLhgk4mv9&uGbeTq$dn#)5a1$hdBPp zjv_tVW~Bw&q?5x(L`Nn+t)%co(BCrGsp4Je)C%*YhDOePbw=fyeuVL(;L5Q4=?B@~ zeMCX*TJ_E$1}!E*QeYXhdv%lIrH_I>BC4M2icbb!S6+QDG z`-DgsGfjBdXNdwb#fQ&(}5FeLWCtrsV zkL6juYA3SDX@}P6aEfB7-7=M5)6;XwuUYr>_EjGYdr-6Ia!fv1b(Q$#S0|TnUkZea zPQU@N2Bk*cm>(6cO-%@5D+>9EFzndwTD! z_49T#Koncn!FzP|zDN0n;0#NdB5$i6`~l;Ol8NY#o3p=L2Oa_6sb#iz;!hHJHD$q- zG$93#%gcO!MvpV-_Y9o($LLL1h`WUENfS#zJcq;|lMA(&erdM4&*Rq{4H{8veFqtJ zeg60fTe4Aa)ZJdEAmHuwVKWGAZl=aiq~rd~=RRuRW@M$wR=G`_ukrW-moh(Jxy?js zEQ7{YX#xSfo$FnDuVtV*@L49g>=D-SI9Zo<;4GGL#B#< zu*GZNaLiXAeT2IEBZ|diebE`CKsO$f_jx9J^uBpwnj|sb%Jp7C5byP%To#q{jMrwV zYl@_#BvGGyHj{zmv;l2h+ei-rTELsA9S5JxNRLYRW5Vd-eG2^^b5{R`Gy^;ld?L9| z7$TSOvc)mYci+bT6VvHe$I$r-4RH}9B2nFk4IjUFMh}CshpKt2eBq6a!D!NV9_csU zW|JBE(Pv&SgPnI-EUzX7l=G3TK3<+Lam23pL|it%B)Q-r`Hn8`&SHa6q_QUo)76XI z%S{5G)oA%5P4x;an6miX;7Y#b{^@~*S8kHS;c_-{o-#HYb#^o&-`+V#L)k&UOXsu6 zqcEsG_PI|AZ*Eb;gGwssznu{;$1(d!pNKdr`xe7PJ}nO{MukTXoURH(XD|MsB{IgkxAjd?ObU(?hg5f{j5ow^(gHwb2PVnvc#aCg3Ozjm#u! zwgbZi{k6v(7+tC}HEZW>qZwRn`?@9W=;(}HQ2*VpWmgO7N`y{$S$p z;cj&}^?oBRP`v)!bVzA?cnh`|dne1xRj zWX#AU;W9p>mTtbQUq5=@ z|EhM(W2Zj2o={s00S`lAES$O^S=}J_la&xr3|p@&e3>7nr9Pf!oSK#2tGhC_Z_gPd zrGoR6NKA*x&+YGwjmZQh5>na=Ic;Y?oRJb-3_XiDJx%}Mi=S^kLD`fo;wY0qQ%PPLtrf{b(^sb!K zS=R0mil&ax?zkxVI9=~|=GVD~Z-W-9b*xX$9V}*x6>YG!Tts?k>u|FAriqu0E!KbE z%Ei?IXz9P~2{~dM@5r97#4;N`SgLNGRgw;X>aX(>XrTdK_~$4U%ZEL9&- z<#oFwjv?hYliNG@&_63OuT6$jOI~g}ck89vS`oiYA)k6y(%VQB$XfFfvdJ{$3Odyj znlC9>S>anurbqU{--BGfYe&QF`Eu}DQdP~097o^B*g{W6B_r^RQr2B|w` zY%4cdFwGMF!afa*7Q&^j6R@M+r8`LZd@FDm;ABJ0L7bSc7ZSmMDc%GG22agJ0<@-* zV3)eje|(Z?!p*b?a)+wPuKgvve#a}7z8IakT~NhSgs=T@4?bGjV@%>H>M%I;Ldd16 zc}<_h`vrv^koi4=XVWiD3(Js(8}?IKIW3 z8nnBkR4i5w45A!EF=$0TcRbdlGUYtVr7jovg=+24imZgq=Z_fqvyPW1)*aUlEb7&E z*jB{KA*;EGpRQ*HA`{LzK}pOgnVohnqiG%bt0jTVRG_i3dXDQ(3)0 zW?TWJ|Ha*_{;xh#;Gdya%J6wl=W2;;Ko{J1+6NRxBNEBMo_lAqK) z{@d;N0?I;c#)|CkjHM^iF&zwexqrg_QV0wIw>rT(fV-;p@v}I!qny=S30sSlw`1R9!S_y30x4OZh_I#DwF$XBA!~jy{3(k?3+mK6{>fBH zI3D?#mlu09l?e;}&$nCnoh%pm6y{_(KN#n|u^8w-)myJXrruj~V;m@UM5SM8q`smZ&X>qW&8L3lsKfY;mS^8~_Bq)XLu+oSzU!mSn5?e*Uk3x)Ke4iuqoyMG(<}OT) z@%i$=@Jer7B1M7JYN?gJ-fWy^@{Y!w*}z2 z+Tq#yv5FrS`VqQ{u-|1w?4A#{XFj`28K_8#y0V) zJmc8{XiYZi5-O38#)&(LdAY`qSLWr+d5SMPvE8+%L)@HzjSu?2T@#5lDKD^7b2evYOvO9wrB$2%Rs90{73C>eR*oV|8@D?+;P0$yt4yDR&dyT`VDe! z+FLGTtd39Sr>iYN4Uw5EDX=G<5Cg-L)dnmv6J7V=wo1L%Si+snXr7fa`X=63`o7NP zQ19i4O zGFwj7U&8s6a}G4Vjin2a=?=)8E_Whjgt16XM$E=r| z%g?hsYKS5A9v~dl?GQ62Gipg&M2@%|FI1zTIsMjF0e84bgh)1Xk7HO8%<6sbmnp8) z{%rUopf;SVFo? znI))TvB_ro{dvbVYL;TqaBTsz6e8sA;|I8ii%ShEMgNPfchvl2%D&h*Y`2xdHk zyXTi!(3S~1Ves{fQzH)m0QeC3hlx@Abd;rA@>f__0(AtKz_G|C8FVq6CVM)mhD=f8 zhU@fWr3Ju(n(rh`EWceSNSs6oRT`KMy;kbLLzC~%NXd67KnGr8vWr5ug#;0g4@Y0N@#s~K{c5`LWT=(Soz(=>E1+^-e zmVQy^8MBG@gPX08-QAkzOZi?!2tx&Ek)IxDTMa7mh_=D2mwPd-`{xwGY@h(v>cM}$URA{XUF`4^wzVcn_Ot2OR!U9k6 zsyzJJ(>T$UfK}%AYF(X&!05%mbplT^bzItH zDht}|O@jhiM0{2K8UrD0X1(v7p5d4jgDK*l2GHRBJrBByg`83$FN0N?CIZg`=MgfC z%-I+I;8%|m!oGUHPCuxcx5~#r`Y}A)727aRcGkk<$Ty}{)@cyoAI1v4vo zV3*$7eq}Kp(CmJ`vco=Ey%(Bq70a|IB`#JEPuL!%W&ooDCEbL0r*I}kTn3{`bxzOz z02MPijWqihb?_%~M9lz0==IFJ}5igzOzLx)@ zEe?ob%}S8aZYc0|rpO^a493A10JBd9{W{!PaAif1QE6DSoH<7e@?yI0Qx!e|T99r~ zxR!sP*xmHH;P%d9Pm7hc99?@{N*L;*LB>e#-fwBQGvC>Lm5l{36S3ubIP2j~&*?|? z)aH>DD6Y0Mg-uiDgT1er)T@<083qWaZ;q3hxef5k@2`c)%mCw)Iy07;)?Y%sa`#_8j}N{2xF@9CtTCOENmTG2 zYN)n~TstK+i0#)?dkBp!UW=`=n?)Cpi!h@#Xr%~#AzKtW^kD51^u;JcuK9SmeRxGk zy`FL~Y)|T%v+FckJzeDe!l*uU+#?o_i7M4N#ysH zZ0LV6>kIP|V3vjVrSOd(hiRZAU;aJv?5p`WrfuS{Ic{z#oUrCH(jiECf8BZjvL`h+ zouSl0x8W2wa-`evJyzTWr4T@S3DLaX5U15ivI?!5o`rEDHs@WBQY|nqZOngJ7oeVl z>+)Y8^Q28p&R=1_Uo0BhI56DNZV`E)p?Tc=T_>6^cR7lKZxQ^Df5939+G}TgcKnrt zKe1;CsCf$ij3P7jKZgx)pk9YU?YaI*#KA5m;-BB{SO0S?2N`;%HLgKwNMBnSR8cr{*5G7G2W@2&?`IZh{*QRyK$uo3doUOg%W-{lHtEW0N!px` z!A3_iSp=oI$r>tvX-EsjS;))(-xr&q^nZnEbvwot4-8VIuYv2HOb=qp6!5>zW-f4JO$x6)!8 z36+iKYaA~?*)O7Iz^Vl(-W?GYWvJ%`GTot#wL6?Xl=SIjxt$E)=1XM1+9+0{ls#3h z!RYGUPStF`UbrySPyJ{0ASFYWi>a3a0T%YX)FBWbYX<$_GyCr!WC`OsUNBvo6ro_J zM1FzXL#cJOi|M#;M(8cRTfHB{A|tu>6f#f#5q9B-rE1;P^dG-Ng?GO9>n*i)a+2r5 zo%4KX#JmW9XDt8h%Brc8+S)QMtt=J)onBw21chJE68_&m_9Lv+DvC%1_3upE=5fti zD6{_We=dT2WAj zU)vjpABwm``%A0FfKIoXc*FZxQ6Wc=;6)h!*HyZcYpqrQKwev1oOEpk7YnNZM1;Nx zfRaN9d?Fk_e~LL9+#l>TMMV70oD?A^U-nJ8NYf*gbav)uWmV3OrAUtP%7e!9KMx5# zayC7xuT*GAz~3Zoegnej{adr0eWoy6w)w}?7M0%$d}`$wJX&~jl`2^7?ss8P5j{5q z9Fl^!(y>ra#NV>uxsjbAg|?r+HjR95riZ?FLm{^;Av__UJ9RI3WKS|EF|6+O`rt$H zbblPmn92-g#@tUfg8UQwZ!TcC;6OKqmcPE8w-0%rcX~LT9Ac8c z*1nl4*q%8*M$kej?uh;I%<^mU%oe+l*cKkB*#v3XWnb0Wg6=hg)4}EmZfSLOXDrgZ>qaJjw#rzQs*d2?=G8mniruyS} zv2)YNGV}_EFxKc>(Vr|ypt=IN6y_kDx9WeKpJLmOPGX>c9v5^E z*DGjsn(adwa~3y!jtR@Psv_3BuD8427Aow&nz>@TpD%|nBr{O@R14Cjv7o&gT;M(3 z^N?2ftu`M{SEQcwVJ&ua%yC1-(qe%WFtEbU=;os-QYA3}yv`T?Y50wP&3AhEE1Y4@x00&j( zBI~!iY3=P93Azz+_LsRFY@G+JrpbONN*>PAYpai>%Zh?SA=+-plTazM;etl{ryjAv zT4hFC(;t?X`5_nAt%z1Lg@}VuPZ-+u7JV>vlb@%J{v=S#8(Z4{`GAqeWxF80&fj#o zlU9d-{Hdon`mM}&#Od|4eIA)QD+5iSSFgySpE;kZ{`C9-HA+n+gM^rqfN|(x9q&1}D$gXRrAg=y?YE4{Jn_ z2O-~TegRzpUS57mUS3HlQoRmOm7+SF@s*=$2q_j(q($^GmBjv+V(eeO>Fh@=kV-b> zChzeKUau!&-%dcOYjbhPhmXJ9v-ywOtCpzY;rUXQs7NDOeusT$qOZC9J|M|TF-=J3 z|M1iM5eLikB-M)V-PmO!?Uvs)9JFyVmt!*#wjAw>9ueCz2Utd*>9?n={!kzgiWAb+ ze0T(-T)R5fhBif4dH1;Ao$%?UT>Wlu&x9*%^ReH?+LqF5{vk7{0KK`=;cNi&wW0Z$7KpG za7jp!n&yyoOMwXo6@LhiqnNMI4C*Yvaz9%s>jJFT<3R06V&RyBVust)=jYv%Dq9KQ zfH$GRShCoFRF>|8@5ziweSgHr-&u8-_>fDYkpvWr}d;d`piN&D)n}>65V*I98qQ5I0{;-Q>1Dop>VZ zc0yR%VXF^Z7DdN~?3NJ+l%6$#NSJ5R>2*8Fhh$D<@u_{-0HpDFFweA?NHi0B=t?9) zLD3^F8`I_b5-Ek>DlFlhv;9Tr4v>4y8ZQUVQ%j3 zG{L!=A86q3O&!E`jX06%&5_KMHJv*iDR)|3Q6J34Qk$aMd*6{3FRCBo5!||;n+^Z ze~KDUs4T17UC(LSxnlz zD!9YK75OvDaj5hDHhk2?4v%dHOA`TpBw~fs;XoVMyz239A}_&prb8fhxWp1Au~YOz(dIc(j#y1zludsbpf*(I`@#b_UC6e7dq} zk#N7D2R&YAhu*ZGcd4N!LswBjq!ZX-O);R$6*ZQjFab$b5=Kx;S_p+M@-pGbg7_yD zXt{ngRjIAkPfKI+cP3!>vCBq|3zHBx#t(8=I@x}IBHe7K%?2eFA2Uf%V^E=1ye?Y3 zoA|Voq>2WPqq(Y}$kb}1k?jGfx>d9Q7(K^d@3-o{I~=bV&7Z+!%Z*bGa&%`rZf99F zH8Gtt)WXAq$}cfrL>}J7V`Sa+EUmab96CWok9o#Ha7XRbT(^cok{FA_mWIA4C$bQ8u<4#+`qchj#9HsVO)ishkx_BxGLc^hN1eA|XG z2m@k-W2o2%9&K*NDLO;bnR@#ADs?7Ov!u{cdVge#?iaD|pP`|Hwog5UX|WQk(iApl zlh7h%MwqYOLM-$SP%dT&^cBQ@tJZ;5CErZe1Kze^F|;}SUo@Ple|?|czGy# z)NS-W)ltY4#F(HQ{<1oSi4uMvBBdIpJp6saORL*osDFUgWWHQunAx08<>-vA1nSkp z5bz*6UZ`Xvu_Y<~mR=~Cb)vBM==Jo$oQ-Vx#FaCTD>sbmL!I4zFJmq*O`gt#~a zU0vI`YBfB6n4Slx-TR9UXKlqtr<+5zc?74eXZl&qdr}TjUp3S@7pOM?C;vB8)T`Hi z6i&R{P<~s6_^*8ngxW~9`_M$x0TX}eE?Kgv8+OdjLi-#mpx|!BgZn@CyN;DSzUDx! zqP*^P{$`!0-U>IWo`i8Zbdf?4CgJ}8JMhiP)p>AoXRsorjjceshsuxtmY`NFwmMs- zT+d4(gPo)bY!%JdV3DseiW?Sg{>ERxlwX<`U0Y{0q83K3;vXL(3d-c5l}ln~3S=RL zqH{q_(QLgD9kUhipd`jn`tIk5g(_XsyGrm>y}1iUoRf#n`X@a4h@!VjQD|2-w-!(m zLpDI0>l>xlb{%$sI5XntAmC?q`}V67Jp*`%5nP?X@-zN=Xt8 zQWMkB)X+gwi{Uh}@Xa0xVQ9pXu-fdR(dqvFEd2H?-z3asOpSMDAX_}IT0ZAetuR*CH9W2HLqk3wq23Lvz6d!yi_f&wZ%_0c>G;P23oP>O;F z$rR(<_;{7Du&5vKGP??c%>=PHL1XD0eX{-Ku{A90a_M94aa7O@Mi46>5IOzb?6Mvw zjnm=F{zOhluhcn!q7h0Mz(9>IHsqOw2V>XBh=?iIqrQ_!yfOZAu`JnTTnUaM{w;p< zqwQIIE_9b3kUM*v6>D5GVc{;-iJK!{izQV&5*+HGWLv67{6IoX;>xS#m5olCo&@Qc zl5aJy8Hi}H%H~mcbtn5NXE|5bziTz72GX|*JxZ1~tx7xGCzO({GlBhEon9KakFS}o)n8~e!Y{Qvh8Mu`W z^|h4AA!DY5AVIK!KwyUIzp7*plY}VfNP{8o9D?jNU#Q`Vlt-i3TYL{Sw3qdmAAX*% z_+KoYQ(zul+qT=rwr$%s+SqKI#={&Ht|9M`E2w6e24yhnOZ1tUnRw-@Wk!Gj!GAm7$_ztr20M)Le!I(Q z@lM~0_A*d`nES7~;NeK!yv#e&<#`}tqKrq6Ha^r9gRiFbU*eXLB;0~*`HvloNlz7Q zgqsg^-cbSkTLBizbxW9aniP_#h1W;DZuBd)`7L)7V#)r0VQS2Q*8exTsNtxDq=Dqo z2JJ$Nj$0aV6`8{sZ{`;Z8J@EdY5yqqyf*3Q9VwVRm28rV= zIT#WN_IcyGhZ>&Ze`GVbyj326Cx-O>j`HAx<+dG;?Pv-q0v{Xs_#fNg0cZfPAJ&a^m$llMpR56Tn# zXu6>L**7*e7W$rBp0aP9lm-M4(8IID=zx|PkN^Q>ga%po4O^TAX7VVEcuJHE@VXON zj3rgd|Ciz_$VbA6PQkT!-dn1*0c9s(OQSHSq`|!7PpzTUX|YxF({f9%5dYZk!}^-# z&Mg&-e{vgD3R<=t`JTWt%BtU(QL@a^0-iDceKt)1XqIsOU*@bJ6A9Co&Stg)0HL%d zp~>mM#X4YTo_|Rb>p0+Y*;XF3&v)=%xovd$@Zl2>T!xD@uh-o(>34aLWbrh-yz674 z2Yq~eTwPx)ktST_?DaV+lLH%|Mv)cp*^#lbq5`%UO3hmm9d7_?4BJIauiaQ$KAsbb zjus4L5ktTUI4?FJi13yv+P(;U4yoVz@3Dv6j{i|$ybFsg|8=pN)0Wc?`-u-^g~gbm zzV%Z(b~$`*w&>J~JxO%;$mr;WS!xd+?0gj+OgNkw6f&6iKY^`B!27t*j2^hO+Y6i( zdl|u^&QguORBs?ef}oG5%1L6vPGG#9#;=LAJWwTYRgFNPLTR+#>Tu$eNGaDy>@5LU zIpk{B|C%f>uFkt14)Fn_)2M!%;f)TA#$bkW`A&l>z8n%JRk|pRrGW)No3(x>Ap0V>y~i+IP$9v+@_<;$BtDPNoMy>G6E%^xN4oXyt|gM{!)AFe9_f*ViZ zud7%)=enJaYz8;V?CflD)1xts`g1y2mR_s<*W1JCCA38=cA76XzW*R@x;xz`Z6BuX z>evvlv(~Tg^HakZrhi1XAWMpi8=TCSo!Ar|tZX%zfG|TVie{z@zZYCR9`;}YIixDd z*9oLgiV$z;lf&;Ttdk7D+T zg(0SQ;pjj=|9ZMRo-3Ci0}g?srJ7vaFH*q!#5uqeb(;6b5zLTx?NOiBq!&aZo9?!d zVC7!b?iERa>Mh|X9r^;bLWGp?=fNf<%^hr$k%E&ZlVHcWvHSqWz{hoWD8|f^WIm8N zx!!UAM>GMSdZ$mZ@$Y$>nGWA8B~vSm?9SdGC^{*{+qc=ktA(8wkZ({)Nr|WLay{@; zn)u$Kh$x})=BvVP52woFSP>hsjXDx{;7OPqIy}g0%m{)}l6vqPic+c4S z;v%HkbdH#bDmo-0ZaBb_GVgQ#Rz!e&BY55BED#a3c0u@9cv~J~>MJ{%0 z>`T?@L%}u`&hBsxFZwMLSkZ|=Nf161FkZJ)6a`9|cacf5F%dGxZ8eyV@d9Xdw@5M1sm_iAIM7qWG^!5Q!Bn=@Umf6V+3lmj$5yuRO&2u_!8k71jMC%x`wEm;R6XD@ z7^7YAI1R3aWRyC@VJMK>VqIUquXNkx;tm8dd2XI8ql~N555LG|Ug?3lY7^>h)>~(j z*gPhtQubxUd=F&cf%NTWdF@LG>+&COPMxGlOE-|RU?zcMdxRB3AM!)}SGkyd(&Or8 z_0se;M2~-3WG(aOO2F!`Lg990E{UhL?$@>5gFn3-M! zX)#p-S=reJWcmNHru@zcqM4G3e%-fDhtCk}{&keYcz38n@#>HF+T8&MXqe??&Cxnk zhmSK0adCmR&V>$q=Mi(-ASZd3qnWQu)gHa-dw*q8&ddd0usq6b_P;J+yq$(O#USJd zz1R9a5f4br9kWk~49$A4e15<6o+T-$L9`ys~33zK`D{v23A4#R6%fiQrx;2^s zb}Ma zdE0D}1js%ma|M0oJ%QEq^xt0Q1lTG3L@`&KAzW}AX-Elte>=0OtnH`6gt8klR$K^! z7PZ174+agHi3x>BMR;OAd-#cmO7)DcK-^OKMGfM`ZEwU0O0B&lCqX;8I`^~?bw?R2 z?OqUb#Gtu1c@Xb(_GAjCKdY=0QGu^!y z0oH{p6sPZ>mn$z4#uZi|o~&oju!s_3`6$u7Jy&PFp$85glKxOR%bx}0zUAK!aUw*X zj6!lJr%^v|V(!XRN-i>ktS4G?XR4&Q2Er3D(9mL*TQxCGc+9W1N>GD>?e-7fpP^_Y zsDU7qUZ(MEZE^uaC=Smp7n>a2?-x~U?F7DbD08;F_4Ur+f*Y_u*I$jI*#xC=gXIs3 z4~&Rj4|R_+#I-Z>_WHLDBd0;4STN!^{?WY_<)(6_rDxTXKdop1;=khd#NwGiW{ltJ1U@kbBD(Dk zc-`+!gdD3rp+-$0DNw*}?Okrw)gw|uhRB3ssPj%$JJ?0Fzbd7@%QsyUheV2OxUFqS z6M3XUH&Fk29@RPv^K#iwTFYAuln$#yXr;K(&sszioC`lDCsdH|Da zRkvXzAFaPuR-VmpMO2tlJ|}Q;t$8c+QgSPd$Zy~;!YAM@pj6zX0Q3#C=6yf3pIXiy zb)w&&sm@kgkbbtiaqYLl=~SrQg(uA_57c+a8lMtF*d6~XTHpoNmiM;GkpbLtdWVI~ zcd2X&T-kRHW4-CO^$Uv*0YqEvzuq1L;CjPqc7DqdBXHMkp{F8s)XKGA7_)g|;;%F@ z{&~EQ@rYA!=c$g8{)qPY$sI}5O%Mx+#{)=m;d_&CZjounQu5=QgN>|#DD3Ix))4#V z+Q6IZ7pnKSeuHt(Rq#iz=Lw~(&Vw*l0ndE%E_!GL7zuMt@GR9! ziDAq}PpP!Q?@={fsW!I#E348K9S0Hozucc2oFfvQk;Qn0oeK(8O4Um&B0_;3WLt31;L&$TZ&!JG5WQaqGEi;7|AjCbXuK~&NC0Y=AJwH^lx})kzv&~w$Z#_ z8(TrEy&nlVki#V&1C5iTS2>&<8JbL}e0g>>m9h@!8j8k^!A`};ewsyg_G#dWy?8-_ zQ@0H)2OEo-CBP@!-6w#G! ztQW&SB;};UyoQN3&$kC}wgUxPQ_$vXEVTe$P~Uz{{4CU_u+!@d#Lm1sdbjoK__SqO zmUuN-Jc9^taF7h5oQxMR=5;q24U5g@&HvH%yY|P8qkQ6xxk#F%QvRqYcX~+D4~3xG zb#){Dto4EA<&urt8EhDYxPkUuIVI7n5(mHS0|ucoi2X1ZhYq?ga`NXY#+zZ;>)h)# zXAkqE*<&_B>goQ!j;*HwKk=pguYxT%a!4&1r&DgeGs8M4Lfr?J9%#vqY#2ocPD~G#( z1tN@USWQL)c0z8pmJ`>J*`EeL6 z*6!LvH-NkG*F~%@&_k(2#A&`#5x%|oA|N?CyDl!bi3}3{8Qvy?L%e}Ad$v*!B8$fr z{DTCA6uU|l$HFb&*jTk&j7vj`28p2cwY~1jR6EfXka)#aoBu24z+EZ_zmz#dp?R)Y zv^)Yv3j(VkUA^{qNjT}Ex-Xiq??!ry zGu)5G&oAB6dIh4=s?gLr-x5_ZX(G$B_jei=ShC^xYu5X=@)DIw`VW^~jGB`SGeCcRbkrUFSU)QU{MN>n>_Imufk6`O9UG`&$Q-b`1ZC zwN;4U)X-MAStT~A!CDbFJs(zqBvnk}J?Ju8RMjLuoED7oJXTydNu-HWkkLA#!Np!= zg|*23zE5i%u{EXvi(jeH{kyx#SYZD1?bcp|F?7dy(0I!?r7ls36+eFOpl{m-WW>*-$j@3uV)zvjiHAf$#5MVIKz~AiCl|n|rq)y|9OPVGQYJcns zv#_u@)EaG@>X?c$O!dc`hh(idk&rOrCa{niZRidbJ6>q$h=)LJUxNJplc!$IN)hdX z2*S3{1{VFr7i!|G{=h_Bmn*o?^VwMD@U8mD1u63XT;p@^OCRrR~4OC&-D(wrL$HL3FP+ zC#v~m4M?EuO677Bj_$XoTYE7@G@2pDCSUTIpyP&@2{f?I);-`6coBz@60tJXE!o}j zwswWt{sSJXf=44nZ-M&8tT4?~4i|bJ{&J{jQqUwhM$oS`Ns%<5@RBSA7-?Pc?DR+- zPUk9Mj1NX(sh#plb(#5XSLw7Ey**to*BSr6SEC69d7t9P~-2z}W;3MgpZ zCkp*%8W}}Uo7!FE@cxe{i{AqqWzm-UXQTg#mz|9%7@m&V-FrOg8JRb=(b;%SSAQJH zC$x1WoX>RY4~x1ZVI$4;b=}Ppq$_%rJ{8%5qsh+&S+q#oX5^T_4OiK1@Vx%II_E-M$jnc!J zKt9kulg_Sahn>OfAKzBrBY)Ja0~ea_|5&N%|8Xm)bYc@&O$izQXzwQ*>+=C6Qhfi| zi_Nz7$U$B$UoM5t+W7l*(@egn$52Er#BYyf-{~JejZ$%H??sTAQho22$``YWa2BOo z_}xMjg`o%^mJtV>>D`^e(5p{SEsgo=y-u*;;NEtI1`#5Q!dfQ&FA?(5Ivsv0b4G;3kvqXYVK|oW z^nuKJ;6L;3IMbd(@yhob#9sf!rmfGbmAinE?)bOJ@EExpYa~tm3aUA6+p^Ij!jVw| zpRhO&g&aIrs__^2u)KuSU=g4_`PX;|;YbI8SUMbsl zQyY2H3yS)b=rY=mXG@$9a`gX3x+D7S-JXvdaWE1~DxohVfzON+&~8Lt8X@});j$yaOG_+MZtIZi>aC}Lum zyF$N}5E2QUv-;VnS}PN7SIjoG1JJDR%rNJsCjN54bGvo^T(M`!(Uon;GFZ4(^YL@b z#hplS(-~R*A{_;rk8ZM;drWrSCmY_%i}0We7E!*7FN2Mo>DqvUpIob#=AsP*)-K# zRwZwXA4zNYxcO;m6Q$Mjj+v69D$;iDpun<)(JfX1Y^;8hD3H9g-{ets%7*XJoG8TS3oAnX3!^cJM+E(jecDej{2Kh-o? zF0wf_7N4@l>F(!hzsqD#+_v4mW91@;dg=czJH^B}iW}@)8?mFsNIQ#9#ycc2(JxJ% ztPH`snr&f2L7_JqPjF}`#wdf)d#jaBqSZ&grSgrwDS}N?=f@R5+CKgIdOYhOyQ;v% z^YrGB7hXs`9!~)M8;IYVv?f$K7^}vJ#j957ca&6bht@APnP-h;iNfB0?(v37 z@q^gw;S8`nKG^S1#m%Bh^yyZH^By|VxZZ~m8?;&|hd@F?np^eqnCA}`x`-4$=YJ^8 z=*MKKUk&&O{60DmwVOv-ky<0`(8$&dt1W{-M0U^n6S}y8i3BP=uVbfS!h(vM<^95{ zj{6|5Xsw#CFW;z; zKLY!GA(h*g0Xex`HRZOhw{o1(eU~wsr~Vd%e>tZ#zsbpL>Q;Q^=v7OxpEab z{Eli>CKp7*BH?hkAC|#&Qi5i!uh0ol|0*@m&+2x^fozw>7H|cxH?!}r*Fw7iS6oNLgGHNwm3i3=5$!=_v!1x z^871mXv>rdUM@cY5D5f!W@6X6{v2?`Mu?r2V&2-zD1z>E0c(0i#3V67T9Tcz|B(wJ zg*7Pw=@Bo(X;BUyrxpA>F8KJ#ft2cMi+1fscRTV~ z-ypfg!DPai2BN+yRiAf2v$s6&CYAq|An0bBJheEumDy6rPZv*PC!&T~tfHC?`U}&` z)e&DNENGl7{9UNcGi1!m6lA;1(h;{CJ43n{*SY zCOPEo5wpK#)Pe4{)ttq4cvgJR{nwkNBbG2Ar~+=i;n#k#A(K-rzDN`&be=dmjRouk*L=t6iX*Yg_Gw`Yn(TxY)^e|N@(=>SuSQ|2p2 zr;O)qU-+%vXPjvKV=e5V%90qYq}3gs`)H)g$9vZzBoG2F-+VT|m?J|2W>E`J>8j@v zQ9!rlz~zcX@<#I5o>FlJ`FTvIoqL#@m%fZ+!tjn)QrT^Gc$jUw$>a56iZ&p7&tIpf zCi@0_gGlmUFjs~{*Z;3`^IzMThKZ=le0$vWr5N8kg2|Q;{Px>UNz;-= z0eCe|hb{hp?Y)x%Y?cdUQTR9;^Xq|}53%+RE}|*;&x+l81l%iY!U%6hHh>h9wr^ua z{cQu8MuQX?x<$5ardWb3_$i9P*e;bK!hE$)^33e-UHVL=ix+#D3dBRc=Pp{6V!5?eVQM`#RV!ByhtIDhMm2no!OtI; z)<{J9LM9VANOsLuU!kbD(3#XVfBwmOzO8tdl$6Yqj;J5Wq@z<TlzcH>N#QeDdoS=>^o^*$0fZ*F2$b+X4bUFC=+Ul3nw^emomd zFDl@LxfM@|?K29fR%n%8%Dt(Uz{9Fn1R<$2hCR0Fq^-4sRTJ^~pWWC?g@yK9o?x)Q zKgl!_vM4u^>Irybce|SVqsC}Q`mfR(O~53G_=aN{>orN~JHMO$_0}kHhDxDh}>BZ2I_f%bK&rdL3RvxCJ5^;hR3r?$@>&*qaMdVc?aLz2$xNw3&bnT2U1 z!ADS%AGhFC8sXpxr)UdK)ZkI%A2hM{yE)(G$6;Cby$PC~8Nx0Nfm!Dn=0*Y@?RU;o z$#*0j%8&5qXSlwp6^Isj0%Bp3;B_X;T=$TmPw-YM&LG|xJC|np6y>ihh@A}89}XEg3`s~OQ3(o7Zk@u6p~#)_wjy! z_LTD|(J&oaaM{;HDvUa#3BFn@fHiCPERR81mSaf+i4c)pz%bTy98O$gRo;!S(`rP9 z(CTTxltnSUFQAk3RFCH1=>gKC(EHJ1U4qM{@p(m2O|TkAkV!8|m*t)DeK+|7Sg#5N3*ipj4K8dCleraR zEQBa?Y zcdR-dX{^KrvDsTclb&I+Xg+p|Jb6#!c)L8oZldN9;-FRzypA?i)H)4`s~)f8=@YaO zn+irgrds#xi@nyFo|t2ZW@bG5%u;#_TI#K$28sI;#fsye5e3G+OYXiU;}v7zBE$>% z`R*6aps>TWh4u35nhUkoDj$fx%27qYNpbHPeb_c%9xV1y1q>UlP=hyN&ztMfACxTU zy?vq5xyC6xk%UgS&Rt}Ge>NZw*va5uyC_OSK5ASSEWb~u1 zrXI;RHtB@biu)#YXA&D6>~3sTPOn=dIPOcRUd(;1RbVPKG5#(gCF8p)uazdBXCdg@ z5w32m*`Z{9!)=|gA71R>P*3zcA(x(es>VYRhZ)2ax}=9(tfqPhx>Bsf|6utbTqgL8 zc_tF=sG&3KeO&jzs2;(5nX^jm?;VA(i^Q&Ta}gEI!hls}iun63B;xK*G-bC!Eh-(I z0HyN})$nj&Mum#I#7zUKm;&CIe(?{_4*C0--mdf?5w4oP&l8E(!x5MovM^-VH66JC z2iJbfg)z-Po&@V%-gsDUw!$l1ynjTaGRCeHgE?Mzq?T9swr;wzYgu6W(yo}*nt%0o zBNrG%RZ2MK9qCl!|A_H6 z9WS_mBEk{lF)dqp729J}!#r%MPDR^Qm+a4|kd<)$v>{oqHxX_&l1N}|$Aew6f(AvI zIh^jHaG+W(+xTT|G)hiY5wc>@{yI~zU`%>5joQpBx{aUeCx{92g`j$L-r}#if4P@> zWtkhGjwIG?P_1_IY{Vo1%F@-|uS3+D1&I8Qm#oc*+BxR5J9}+bN3U&JP_Jm3(Ud8_ z4EFa-;_z}d&DZzwRPrT_;qiRd6}cL)*_jmj6VHN9El#m7QZo9kfw3$h;trV9tG=6f zAxNKa!|@0-4c_$Q#4Dhuccmeiv)rjHewId>UvU$q+juKa@D}-8;bi$v!&7rQ$puyHfIK86lIs)Q1}wUm=x5dn zpKH&d&|7X!%UUA8X*$}Zof;&souvo6t(F$;(aQ(Qz-m2FReR)o(SC{=i;^sRU!fuk7PG0soG#)^vefQ_`b3Lw4D$hY4ZqFyYeSbbxLzySF|v0xSm zQIW%J7fJ8KC|Xmv5#o;&&+WAxU7zaPOQ#Zk`aa@Na@9mK=Mpy|yh0U^XMjoIv5O?U z$n8JLDYnWRvlDQBLlAmdZ6)IHM1=VDCSa77&ulkHJMy!OHkRQtbAx6-YpGwo+Gh4e zPPM{9nP_Uv-E=|llCFkc7Y_>!0t$-@y?R0VClVus)x1QINdN53X|CbnUilP5)Ae<@ zR;&9Mn!Wr!OI2Ky6feDY2Tu1#+h)?ASz!difmuEtRC7n*&Fqb(GQ|NF8l(V4H`Zpv z8$yU>J3jc94JSc#%c7g~Zp9r&+;S+4h35DyYb$DZTOszT)XM-=a zjdnmntn$^50TgRW=k|rsk+g%m=G#tM1Ja%w+Q$&Yv`(@3Xm7$W`LkD`Aem85iBeQZDDf>!`8>| zAklcZ$D)$78FM|t$_MI2?h??gcI&4`k>^4oLnEq;F;Di|s0)RDix z&AraEG%-P8?dH+vB}8Ivr<8bOm`rFupANqv8Fsap5HTb}Gi?6Bsg5FE{}{*Kt5F6^ zhs6}d?^hW-z8*RXt>U`zG1}hKzz;3>oQx%&*>|n_F+!0bzz^MvwbXL#{~a`JAwP;yXmSBYJkg z+k)jz@gW9&ij!;d=`qRD`&iCTO|~1W1tb=`BFk2veO68dTrdq9xbcCmER=w4=zAD< z^K?B-0ig_oGdAZ3ayp2{-H1P(xYGQ^ zGA0XDn z43?|4ZIP!a}_dk z$`FRQPxx18KHtpX=r$+Aqh=NR@v~SNFC+ukrId1ts@>Aj($8LD6t5k-sO7c}Goph# z^B8a*+m90$az9RBkptm69d@mESfLs+iaYY$W@$_ZM#c8Qwb+Py2YKJyn?&n|a7c6Z ztkb40$2s_==541P(~i|?BhAy}X`EuIs~B*?$J}NvmN73VH0KD1dbcHwWc<`SHP(FL&o%sRnKi!|jUNSeBx?o2#%i$> zo!Tk7`uG=PKbawSUtwZ(fb}e(*r8|aoL+~_*}SOyi)i9#2H7_UE552!R{=^2WgJQ= z&qw1fi;c+eV^)*Bl`6JcGx`mKcC;-;WQKvs{bH?1lG5hAAA4a*g+Pyec|6C}XvD4C zxNk4SKeKcRoteK3@xE5v@bv}2u!{<5X2Ww_ckV;g$ir@nj~Xhy)29w+qE`~gozLiR zwGQ^pjM{S2T1XDwDy3FVM%s$lGa7p;n9spWa<}2|#}9Q1zE9SETmdu{6H>10YQ&PS zktY!m(LLsaslt^_sHs+~eO^XsT6KUJuUnGkk`{k(yL@X?OfodOk|`-i?2bv)G3uaLsnLU~=s*SQ zoS-N&$JDCmku6~$b0X8J`%S&l*aj;h2TK*`W-m{*!w5Tw*DO5yH>UUb-%ozlNaU!% zDEx|#KTOf@Tc{?F^>MNgPI=Pr>ZFc+rV+x<;@GVFqj9V6f+Bet2!*LWrd@C0*M^HTCQsLL1=_rJNU*hU)P@ zC>Eg97WVGz)i1Jg^OnoiNhi=GG7tMhu5y$#=PwkmdzS{%c-T~(FExPm)e{dR> z$x@!_Z!@sioJHFRUSU}WlF&@7*exLBWv8*IEj-BAudeKORS|D0PbHWv3=NG@Pf@x? z+_m3}bfD+7;qqXb|FWFT-Yl`jjd>`Xru+fVs<3dnKF0Yqn!uR8g!*99(6Vf%T6=A$ z+^Ru9xS7OLbUD6SrWTQn0CvFB7N+C;j=`P zo@?tm!|Wp=`(@lWFX8z6raoOO&s0gC~Yu#NQA_CoDwNeno|@2-5`% zy&OziE6kv`ajd{B^*|rw20#z~k0YZ|T-%NWNMbbxFcu0WsNMVC{Ov#6Ws;!TZnx-D zYB6HI#q`C9Qj#h*V~M1p$Ci$|pa;TFdL!TIQ&abYU0}rAMY-dr(3N46yFE-h29KGo z=)q90#Co(LJdO%_Db?q^{?ha1j4I#T;w9wzF;@9NH{41F8Sz#$v&-XG53{`W9Xxm2}dg^$BAdNPSMd zmbY5xNn7Iy>wiRdYC%DM*o{C$^>vLbJTZ}i8_Sjb_*N6VBZU9A7$_;T^CXD*Qe)t+(9$ zs@v^?S1S{tsKoP~lV&)AmXmMrjnL})9k6Nfzh6VFVAcY3T(!wpfW)5LaSs{*)MEY+ z@8Yq;N;3XRF#oW6Ug77Z!E&uLXo0w}`uupe{DXTi_di@jB412$&U~cw;C|aQG+Nz4 z02~S_2Miyl|CRnnveAq`eL8>q6k@A0n=p*N7nBD2R662er#G_Qtir=o-NeCh&gEOy zo}qhjy;jeAnD|yjjpy#G!rxMIK)zoWJiQ5c4J20;_w2ecqI;fQ4i63vN=(w3V}@1! z!a*GS8(I~4MmF^kUdhx3c+=biypu3+a|;i+a@yooVbM1$doqMh)Gd;U>RWI_Kx9_> z_s{~sTj2Vzf|A}NqH+f={eGU`j-v*5`Sy;eH)lE!+-SSv8v5t1eaV zCVIGh=sR0rn`QT7kK}lRH-tG`PB)mCHm+Cuy*5Y@>6kPfTosY^5}2lgJD48YX*0G# ztUSf<;k327nSN3M_>RbM+HFSPpDuyORwovyb7jV9lOLm>+xN{xQOsR=Cr_89>OAjH z{(dG?PX1nmASnrMb3M<%t&N#(kW2(nBq=5)CXUPVx!507Vv-!w1p8nSAY(E?zC%K1 zXP=2dt()=uzcorop!*_rCV!h(`LB5>(~OWX1o|j8nW>c_W~F2=-D+@*5^x1>iKN&9 zwt{`%cH>E`es#RN8hc;K%Os7QGtzQn+7cemmdnE|-wwyg30I^nBv5pM{WHB1E?A|Q zE!2{8wqwfYjwE1Gf#&0L&+dl(>@neu5(E!@pG}zQ_&cMu-s#1KPrx&F`;+GlXZv&aobMH470u^u9nc=u2 zd1JrfVxamrthpIn26opOU*KyU2->fV?#DfIH(9WKvvc1-`Q2EljopR4Xe~hAlwNwB z6xiP_8D{v@I%vM|fG~k4gzSqIXS5obSUZ-Dr=y|J6P#z4ZXMUw?}q@x*HyWOlIDnluX;Gf&0LomrB`0 z(mil`uB9sO+CVqXQ0pIfV35GKRjUedMU)JB-D4@u7^a})M3jot|4lTrne_Q0Q^Ok8+lQDHXpaaQXbpMTES*3gI))Afn<#Gw#35&jdv$| zSt#JuUeP6CySjg(&@)1Gb3#6yG2?EmczVa^u9e-$yj>TuvQ?UP`rs}q^1($Q>v zfHry;VDY<^!1$rft$~=u?}~ruElwjDymgdpbv2SA;=3unPfs;KRX@xwD*zwEK(pP& z?eM{yFTvhNNij~tm6G-7F(+Msgcc0goD2e#;=CCw#AL-d;JcxAO6+Hbh~HmE0*l31 z$$Pz2sf7kCXsP~CgxOXHV|JTWRR&rb>SSgWUh<{ z`1&a0hlWG0w+770l^ZRLFeQxi3Mq&8k7MmL7^QE!>?CF2>q8w15moCwN(9>xC#TX- zglt_>7}4?4e^Z)eu_X1KTE5)hjjP`u&y&V<>mh?HN1sH}SFqzq_Y2L^O5jMuJCjKX ztdz*lNcuV2EQ=Pf{?4zRFRpJK!W!c_A=<$FnqtxM4_JS|KIEG>}X#WA&pda`Ea@DH}K!%Ch z+g=un@KZ(~H4s$!W0xYDj_kO#4S^WO68o3+1xls-Y|u+$Xj`eUQB*F{$QVjIM8ep+;%}?#o<9wTX+&I1Z!qV*gW(e6vI@GTa#qw*M+~G8 z#7WibpVHqx!*vUBfpb%keoWdynb$bAhNIN@%g=E9Mx88RMA~%0M_e4IW+H;N=Nl|p3(rhaMvZoYsJ*kQG5m3Lm2I%T7fCMZr8lgvhPVEZ- z8@D(4ms(fr^8MDCSvQeP-f0Uv_GSW<0QVYFZyGNe*WIl}U5~*;OZ&s;!1Z8eT8d#} z_-#FQ%}MA@7Mtfz~Geq&!Pb}&aqWXWCzHAc$&5C6#Xv`Mp3AN!kv zP+2Da1pzaxygIip8DSM>@Rq+DzAkrSqV_9#t!>KRL?&Vzn{&A+2U`^v`f3G{`EdeBkADa(Edm!5tS$IjMS(cS5XDN1lAeB2yAw8Z02@-Gkm?ek;a|pgdzhL?|MtT zf2NbPqzRHsjXM~-B6IQ+fEh)TJU^18{LjFeu8gnlg(e_=Qm#noUVNU00$n|%$_=Nn zQbO+Jg6R)^{c%g~<1PjWVx4>s zkV6iQyqCz=(W_&q-j_XKDgT(i!EZwdu>q#H5_$XtC?t|91wIs1)OYT=U~rVbsr4g4YTrN+zHP2bNY~ zfZa|E!O21wn(1gdAD1pZ!GKwkW1)X`z38`Cg4HxDrJ2qRTsYZU6IerW)ajaW z?G9|F;Sm`bei$b5Q#CZ}FjM}0cbvuIKEOZm;)4)>!6O$x$!vu3(-K`potjdUur-Cbg~a~ z7(bCjlQ=dG8sit?KmGFY>i~2v@#z~E)K-3=&qz;3)$iu$sC+AbUDLLX-t_r)i}dkw z%Ct{jtM}`a9D?Gu?$Q{rSDz_Up=v^kp)7L$2~I*J)eKvYndV3gt6znnQ59&waZkM* zCCT|#+yxh^?xwsz0UV?UvB>u9K-(zDMkvvLw|?E4Za|QC7IR6 z*wkaqb{=#O9s2f`rOJZ^Ubh~l2$u`B&g6&tpfoLX)n2ce#6p1- z(t=&Yqur04i-X|VZoA$T8?&#ejo0`k+!2l{PA3uFl7Fmc>9L=8&G%)U?2%y+9tcd} zqS`M1tb8{EF(V$=Oi z#{pI=5)A9Hd1c*iH{({X-$W8`Iv4}v=Y9kaVl$f{=(D}G|`g=F!?`sa-tm>=)46GJY zC*ItXW?)fFi;R;A#lbQf$~BC+%bcT&yFQU0Mj2u#YNl4y-r$Q70_R9B7vHZBcGNX_ zD8LiD*is}d5`a=5fIm}vd8D`1PAWwDY`Y&G4tum}gt>OS)UFYbmkSLFNR}jT?~kAb z=&m0cHCksJ zw)&2#ek9YHu8u|(=y&`6xKadHg72_J6ohz@BJv3a3XK(56zD$iRgJ-h5A-g^O@ z@M)I#|CLGJ(gTlqW)?Hek6$vUO1yPdhb%>l!J9qw_f46xJzPoV7TL)3ucz$9MG&lv zIIonIGvl_w`mnJ9X0Uz)F+Phg<&T5!H3K^N^E!=C4oV_V_buHse>~XmL2X}41Ui*E zbTORImoZZ6mPX`jc*q+8j=(W2>~j0?~{= zj_Ft|0?K82EbM-QCBqia*5MfIUmgF2y5Q`A`4Q5veJ<^_IYXg{>uL#zm` z=&tHYy-r*r@2ddVT)jFYh)u6c0qe~U9FXrT!=~S-kN3?e)kz427zK^@a-iqcmWXT? zx6*sgcQL;?Ty!sfs8z7$_#7cWy%^2E-p`Kv^QDe&l-)O@>kEz( zrue(3%eK=sv+vvgqvyF0;cae`-Y z{pNYAzF)9avorV1>C=7nH65(XV1+A*m=A`mN^a_xbg`N>^Si6}xPwOC)yd1ds4*#HM;Tey|%k(Td_WMoiy~a=v8d z``AE7fvV5*2&fTVg14pd2zH+p-NAov!`;~bHWdl`-~&x}m3|YFk&zKTw@rep zA%8wv2dnc3^01gpP%~NsTt|l@VWKc4Q@Eol#xF)B6$|M6 z8`OJ2)CrFR$U8Rt321QK9ZKx(X|}{6|50Q_|HA!#AjX`FJgyf;*>>PlmYP`_pvMec zmcTY)D;;9v#MCpa0^2)<;$ud?E{E-9#bP2xSqN9G?MJF<*#z-yo!z0qN52xi%*om; z|Hi9Y-0yB+Wreb2)C?)|fW{i)7|&qA<~(2u0%|3x7&+m8a#{xGP#~GAaX5cI`Vlg_ z{@}Jn97A@`#d{_U%k+m#ec8Ge8yI(j1{`1Iy-}Og_>>i$A3x*tBM;E^=0ODImYfbWRa)4y20E!BdAGdek! z0d|Fn0Jj$5cwF93S1_+MkHGaz35qaTM9&e@QXi5fR+%O(7^x(&r=7AA>R{Bd2Lx{h{1`5~u7 zkTJUt-UG4%u1%iPbz^`>a8j_k?ylC%IPRJ`GB=mg)UwU(3|0N@rIrFv#J%0DQgMmd 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

    paC55m_>ryRNvbU22jABe5< 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 zak - - - true - - - - - $(NoWarn);SA1412;NU1701 - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/.gitignore b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/.gitignore deleted file mode 100644 index eaa9cf70cc..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# files generated during the lubuild process -# IMPORTANT: In regular composer bots the generated folder should be excluded and regenerated on the build server -# or by the dev running composer locally. But in this case we include it so we don't have to run bf luis:cross-train -# in the build server -# generated/ diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/BotController.cs b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/BotController.cs deleted file mode 100644 index c9bccdb753..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/BotController.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Settings; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace EchoSkillBotComposer.Controllers -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [ApiController] - public class BotController : ControllerBase - { - private readonly Dictionary _adapters = new Dictionary(); - private readonly IBot _bot; - private readonly ILogger _logger; - - public BotController( - IConfiguration configuration, - IEnumerable adapters, - IBot bot, - ILogger logger) - { - _bot = bot ?? throw new ArgumentNullException(nameof(bot)); - _logger = logger; - - var adapterSettings = configuration.GetSection(AdapterSettings.AdapterSettingsKey).Get>() ?? new List(); - adapterSettings.Add(AdapterSettings.CoreBotAdapterSettings); - - foreach (var adapter in adapters ?? throw new ArgumentNullException(nameof(adapters))) - { - var settings = adapterSettings.FirstOrDefault(s => s.Enabled && s.Type == adapter.GetType().FullName); - - if (settings != null) - { - _adapters.Add(settings.Route, adapter); - } - } - } - - [HttpPost] - [HttpGet] - [Route("api/{route}")] - public async Task PostAsync(string route) - { - if (string.IsNullOrEmpty(route)) - { - _logger.LogError($"PostAsync: No route provided."); - throw new ArgumentNullException(nameof(route)); - } - - if (_adapters.TryGetValue(route, out IBotFrameworkHttpAdapter adapter)) - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogInformation($"PostAsync: routed '{route}' to {adapter.GetType().Name}"); - } - - // Delegate the processing of the HTTP POST to the appropriate adapter. - // The adapter will invoke the bot. - await adapter.ProcessAsync(Request, Response, _bot).ConfigureAwait(false); - } - else - { - _logger.LogError($"PostAsync: No adapter registered and enabled for route {route}."); - throw new KeyNotFoundException($"No adapter registered and enabled for route {route}."); - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/SkillController.cs b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/SkillController.cs deleted file mode 100644 index 88c36f2b1c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Controllers/SkillController.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace EchoSkillBotComposer.Controllers -{ - ///

    - /// A controller that handles skill replies to the bot. - /// - [ApiController] - [Route("api/skills")] - public class SkillController : ChannelServiceController - { - private readonly ILogger _logger; - - public SkillController(ChannelServiceHandlerBase handler, ILogger logger) - : base(handler) - { - _logger = logger; - } - - public override Task ReplyToActivityAsync(string conversationId, string activityId, Activity activity) - { - try - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug($"ReplyToActivityAsync: conversationId={conversationId}, activityId={activityId}"); - } - - return base.ReplyToActivityAsync(conversationId, activityId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, $"ReplyToActivityAsync: {ex}"); - throw; - } - } - - public override Task SendToConversationAsync(string conversationId, Activity activity) - { - try - { - if (_logger.IsEnabled(LogLevel.Debug)) - { - _logger.LogDebug($"SendToConversationAsync: conversationId={conversationId}"); - } - - return base.SendToConversationAsync(conversationId, activity); - } - catch (Exception ex) - { - _logger.LogError(ex, $"SendToConversationAsync: {ex}"); - throw; - } - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.botproj b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.botproj deleted file mode 100644 index 247bba8b18..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.botproj +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/main/Composer/packages/server/schemas/botproject.schema", - "name": "EchoSkillBotComposer", - "skills": {} -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.csproj b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.csproj deleted file mode 100644 index d3c03d57e2..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/EchoSkillBotComposer.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netcoreapp3.1 - OutOfProcess - 720cb418-9c27-47a3-b473-1b8771598297 - - - - PreserveNewest - - - - - - - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Program.cs b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Program.cs deleted file mode 100644 index b9cc275c38..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Program.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; - -namespace EchoSkillBotComposer -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureAppConfiguration((hostingContext, builder) => - { - var applicationRoot = AppDomain.CurrentDomain.BaseDirectory; - var environmentName = hostingContext.HostingEnvironment.EnvironmentName; - var settingsDirectory = "settings"; - - builder.AddBotRuntimeConfiguration(applicationRoot, settingsDirectory, environmentName); - - builder.AddCommandLine(args); - }) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Properties/launchSettings.json b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Properties/launchSettings.json deleted file mode 100644 index 5e20497847..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35410/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "EchoSkillBotComposerDotNet": { - "commandName": "Project", - "launchBrowser": false, - "applicationUrl": "http://localhost:35410", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/README.md b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/README.md deleted file mode 100644 index b48822a762..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Welcome to your new bot - -This bot project was created using the Empty Bot template, and contains a minimal set of files necessary to have a working bot. - -## Next steps - -### Start building your bot - -Composer can help guide you through getting started building your bot. From your bot settings page (the wrench icon on the left navigation rail), click on the rocket-ship icon on the top right for some quick navigation links. - -Another great resource if you're just getting started is the **[guided tutorial](https://docs.microsoft.com/en-us/composer/tutorial/tutorial-introduction)** in our documentation. - -### Connect with your users - -Your bot comes pre-configured to connect to our Web Chat and DirectLine channels, but there are many more places you can connect your bot to - including Microsoft Teams, Telephony, DirectLine Speech, Slack, Facebook, Outlook and more. Check out all of the places you can connect to on the bot settings page. - -### Publish your bot to Azure from Composer - -Composer can help you provision the Azure resources necessary for your bot, and publish your bot to them. To get started, create a publishing profile from your bot settings page in Composer (the wrench icon on the left navigation rail). Make sure you only provision the optional Azure resources you need! - -### Extend your bot with packages - -From Package Manager in Composer you can find useful packages to help add additional pre-built functionality you can add to your bot - everything from simple dialogs & custom actions for working with specific scenarios to custom adapters for connecting your bot to users on clients like Facebook or Slack. - -### Extend your bot with code - -You can also extend your bot with code - simply open up the folder that was generated for you in the location you chose during the creation process with your favorite IDE (like Visual Studio). You can do things like create custom actions that can be used during dialog flows, create custom middleware to pre-process (or post-process) messages, and more. See [our documentation](https://aka.ms/bf-extend-with-code) for more information. diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Startup.cs b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Startup.cs deleted file mode 100644 index dae17d4283..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/Startup.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.StaticFiles; -using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace EchoSkillBotComposer -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddControllers().AddNewtonsoftJson(); - services.AddBotRuntime(Configuration); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseDefaultFiles(); - - // Set up custom content types - associating file extension to MIME type. - var provider = new FileExtensionContentTypeProvider(); - provider.Mappings[".lu"] = "application/vnd.microsoft.lu"; - provider.Mappings[".qna"] = "application/vnd.microsoft.qna"; - - // Expose static files in manifests folder for skill scenarios. - app.UseStaticFiles(new StaticFileOptions - { - ContentTypeProvider = provider - }); - app.UseWebSockets(); - app.UseRouting(); - app.UseAuthorization(); - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/dialogs/emptyBot/knowledge-base/en-us/emptyBot.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/echoskillbotcomposer.dialog b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/echoskillbotcomposer.dialog deleted file mode 100644 index 5abf65c6df..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/echoskillbotcomposer.dialog +++ /dev/null @@ -1,115 +0,0 @@ -{ - "$kind": "Microsoft.AdaptiveDialog", - "$designer": { - "name": "EchoSkillBotComposer", - "description": "", - "id": "A79tBe" - }, - "autoEndDialog": true, - "defaultResultProperty": "dialog.result", - "triggers": [ - { - "$kind": "Microsoft.OnConversationUpdateActivity", - "$designer": { - "id": "376720" - }, - "actions": [ - { - "$kind": "Microsoft.Foreach", - "$designer": { - "id": "518944", - "name": "Loop: for each item" - }, - "itemsProperty": "turn.Activity.membersAdded", - "actions": [ - { - "$kind": "Microsoft.IfCondition", - "$designer": { - "id": "641773", - "name": "Branch: if/else" - }, - "condition": "string(dialog.foreach.value.id) != string(turn.Activity.Recipient.id)", - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "859266", - "name": "Send a response" - }, - "activity": "${SendActivity_Greeting()}" - } - ] - } - ] - } - ] - }, - { - "$kind": "Microsoft.OnUnknownIntent", - "$designer": { - "id": "mb2n1u" - }, - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "kMjqz1" - }, - "activity": "${SendActivity_DidNotUnderstand()}" - } - ] - }, - { - "$kind": "Microsoft.OnMessageActivity", - "$designer": { - "id": "esM1JY" - }, - "actions": [ - { - "$kind": "Microsoft.IfCondition", - "$designer": { - "id": "SK42Qt" - }, - "condition": "turn.activity.text != 'end' && turn.activity.text != 'stop'", - "actions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "HHAFpn" - }, - "activity": "${SendActivity_HHAFpn()}" - }, - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "dZ2zwR" - }, - "activity": "${SendActivity_dZ2zwR()}" - }, - { - "$kind": "Microsoft.EndTurn", - "$designer": { - "id": "YzX0HZ" - } - } - ], - "elseActions": [ - { - "$kind": "Microsoft.SendActivity", - "$designer": { - "id": "xvwomh" - }, - "activity": "${SendActivity_xvwomh()}" - } - ] - } - ] - } - ], - "generator": "EchoSkillBotComposer.lg", - "id": "EchoSkillBotComposer", - "recognizer": { - "$kind": "Microsoft.RegexRecognizer", - "intents": [] - } -} diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.lu b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.qna b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/generated/interruption/EchoSkillBotComposer.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/knowledge-base/en-us/echoskillbotcomposer.en-us.qna b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/knowledge-base/en-us/echoskillbotcomposer.en-us.qna deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/common.en-us.lg b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/common.en-us.lg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/echoskillbotcomposer.en-us.lg b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/echoskillbotcomposer.en-us.lg deleted file mode 100644 index f49f92107e..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-generation/en-us/echoskillbotcomposer.en-us.lg +++ /dev/null @@ -1,31 +0,0 @@ -[import](common.lg) - -# SendActivity_Greeting() -[Activity - Text = Welcome to EchoSkillBotComposerDotNet. -] - -# SendActivity_DidNotUnderstand() -[Activity - Text = ${SendActivity_DidNotUnderstand_text()} -] - -# SendActivity_DidNotUnderstand_text() -- Sorry, I didn't get that. -# SendActivity_HHAFpn() -[Activity - Text = Echo: ${turn.activity.text} - InputHint = acceptingInput -] - -# SendActivity_dZ2zwR() -[Activity - Text = Say "end" or "stop" and I'll end the conversation and back to the parent. - InputHint = acceptingInput -] - -# SendActivity_xvwomh() -[Activity - Text = Ending conversation from the skill... - InputHint = acceptingInput -] diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-understanding/en-us/echoskillbotcomposer.en-us.lu b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/language-understanding/en-us/echoskillbotcomposer.en-us.lu deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/manifests/echoskillbotcomposer-manifest.json b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/manifests/echoskillbotcomposer-manifest.json deleted file mode 100644 index 25205b9286..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/manifests/echoskillbotcomposer-manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json", - "$id": "EchoSkillBotComposerDotNet", - "name": "EchoSkillBotComposerDotNet", - "version": "1.0", - "description": "This is a skill for echoing what the user sent to the bot (using Composer with the dotnet runtime).", - "publisherName": "Microsoft", - "privacyUrl": "https://microsoft.com/privacy", - "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.", - "license": "https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE", - "tags": [ - "echo" - ], - "endpoints": [ - { - "name": "default", - "protocol": "BotFrameworkV3", - "description": "Localhost endpoint for the skill (on port 35410)", - "endpointUrl": "http://localhost:35410/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - ] -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/create-azure-resource-command-line.png b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/create-azure-resource-command-line.png deleted file mode 100644 index 497eb8e649d4f1d2d456d337246d01805132ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13842 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 VJv|35z<=2CX{u{u@3nB{{{s`&K;i%Z diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/publish-az-login.png b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/media/publish-az-login.png deleted file mode 100644 index 4e721354bccb6d4a83aa70ca55da1b571c2886db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16726 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 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" - ] - } - ] - }, - "Microsoft.ActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft activity template", - "type": "object", - "required": [ - "template", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "pattern": "^(?!(=)).*", - "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" - }, - "dialogs": { - "type": "array", - "title": "Dialogs", - "description": "Dialogs added to DialogSet.", - "items": { - "$kind": "Microsoft.IDialog", - "title": "Dialog", - "description": "Dialog to add to DialogSet.", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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" - } - ], - "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.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/stringExpression" - } - ] - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.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.13.2" - }, - "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.ConfirmInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Confirm input dialog", - "description": "Collect information - Ask for confirmation (yes or no).", - "type": "object", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/stringExpression" - } - ] - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.ContinueConversation": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue conversation (Queue)", - "description": "Continue a specific conversation (via StorageQueue implementation).", - "type": "object", - "required": [ - "conversationReference", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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" - ] - }, - "conversationReference": { - "$ref": "#/definitions/objectExpression", - "title": "Conversation Reference", - "description": "A conversation reference. (NOTE: Minimum required values or channelId, conversation).", - "examples": [ - { - "channelId": "skype", - "serviceUrl": "http://smba.skype.com", - "conversation": { - "id": "11111" - }, - "bot": { - "id": "22222" - }, - "user": { - "id": "33333" - }, - "locale": "en-us" - } - ] - }, - "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.ContinueConversation" - }, - "$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 StorageQueue implementation).", - "type": "object", - "required": [ - "date", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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" - }, - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.13.2" - }, - "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": [ - "=turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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": [ - "turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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.GetConversationReference": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get ConversationReference", - "description": "Gets the ConversationReference from current context and stores it in property so it can be used to with ContinueConversation action.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.GetConversationReference" - }, - "$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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.", - "default": "turn.results", - "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.13.2" - } - }, - "Microsoft.IAdapter": { - "$role": "interface", - "title": "Bot adapter", - "description": "Component that enables connecting bots to chat clients and applications.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime", - "version": "4.13.2" - }, - "properties": { - "route": { - "type": "string", - "title": "Adapter http route", - "description": "Route where to expose the adapter." - }, - "type": { - "type": "string", - "title": "Adapter type name", - "description": "Adapter type name" - } - } - }, - "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.ContinueConversation" - }, - { - "$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.GetConversationReference" - }, - { - "$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.SendHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEventAction" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - }, - { - "$ref": "#/definitions/Microsoft.ThrowException" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "type": "string", - "pattern": "^(?!(=)).*" - } - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Declarative", - "version": "4.13.2" - } - }, - "Microsoft.IEntityRecognizer": { - "$role": "interface", - "title": "Entity recognizers", - "description": "Components which derive from EntityRecognizer.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.IfCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "If condition", - "description": "Two-way branch the conversation flow based on a condition.", - "type": "object", - "required": [ - "condition", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.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.13.2" - } - }, - "Microsoft.InputDialog": { - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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.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.13.2" - } - }, - "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.13.2" - } - }, - "Microsoft.ITrigger": { - "$role": "interface", - "title": "Microsoft Triggers", - "description": "Components which derive from OnCondition class.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.OnCommandActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnCommandResultActivity" - }, - { - "$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.13.2" - }, - "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.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.13.2" - }, - "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.13.2" - }, - "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": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Text", - "description": "Information to log.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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 before each request.", - "type": "object", - "required": [ - "connectionName", - "$kind" - ], - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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. WARNING: Changing this location is not recommended as you should call OAuthInput immediately before each use of the token.", - "default": "turn.token", - "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", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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 apply an operation on a property and value.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation filter on event." - }, - "property": { - "type": "string", - "title": "Property", - "description": "Property filter on event." - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value filter on 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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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 value is ambiguous for operator and property.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation filter on event." - }, - "property": { - "type": "string", - "title": "Property", - "description": "Property filter on event." - }, - "value": { - "type": "string", - "title": "Ambiguous value", - "description": "Ambiguous value filter on 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/numberExpression", - "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 ambiguous intent", - "description": "Actions to perform on when an intent is ambiguous.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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 and operations.", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "type": "object", - "required": [ - "$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/numberExpression", - "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.OnCommandActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Command activity", - "description": "Actions to perform on receipt of an activity with type 'Command'. Overrides Intent trigger.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.OnCommandActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCommandResultActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Command Result activity", - "description": "Actions to perform on receipt of an activity with type 'CommandResult'. Overrides Intent trigger.", - "type": "object", - "required": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.OnCommandResultActivity" - }, - "$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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "event", - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "type": "object", - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$policies": { - "nonInteractive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "required": [ - "$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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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": [ - "$kind" - ], - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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/numberExpression", - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.", - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.SendHandoffActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send a handoff activity", - "description": "Sends a handoff activity to trigger a handoff request.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "context": { - "$ref": "#/definitions/objectExpression", - "title": "Context", - "description": "Context to send with the handoff request" - }, - "transcript": { - "$ref": "#/definitions/objectExpression", - "title": "transcript", - "description": "Transcript to send with the handoff request" - }, - "$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.SendHandoffActivity" - }, - "$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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "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" - ], - "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.TelemetryTrackEventAction": { - "$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.13.2" - }, - "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.TelemetryTrackEventAction" - }, - "$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.13.2" - }, - "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.13.2" - }, - "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.", - "$policies": { - "interactive": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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, - "minimum": 0, - "maximum": 2147483647, - "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.13.2" - }, - "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" - ], - "$policies": { - "lastAction": true - }, - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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.13.2" - }, - "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.13.2" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TrueSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UpdateActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Update an activity", - "description": "Respond with an activity.", - "type": "object", - "$package": { - "name": "Microsoft.Bot.Builder.Dialogs.Adaptive", - "version": "4.13.2" - }, - "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": [ - "=turn.lastresult.id" - ] - }, - "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.13.2" - }, - "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." - } - } - }, - "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/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/sdk.uischema b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/sdk.uischema deleted file mode 100644 index 9cf19c6919..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/sdk.uischema +++ /dev/null @@ -1,1409 +0,0 @@ -{ - "$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": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "footer": { - "description": "= Default operation", - "property": "=action.defaultOperation", - "widget": "PropertyDescription" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "hideFooter": "=!action.defaultOperation", - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response to ask a question", - "order": [ - "activity", - "*" - ], - "subtitle": "Ask Activity" - } - }, - "Microsoft.AttachmentInput": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "dialog": "=action.dialog", - "widget": "DialogRef" - }, - "footer": { - "description": "= Return value", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "operation": "Host", - "resource": "=coalesce(action.skillEndpoint, \"?\")", - "singleline": true, - "widget": "ResourceOperation" - }, - "colors": { - "color": "#FFFFFF", - "icon": "#FFFFFF", - "theme": "#004578" - }, - "footer": { - "description": "= Result", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "icon": "Library", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "description": "(Event)", - "property": "=coalesce(action.eventName, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Cancel all active dialogs", - "subtitle": "Cancel All Dialogs" - } - }, - "Microsoft.ChoiceInput": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "items": "=action.properties", - "widget": "ListOverview" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete properties", - "properties": { - "properties": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Properties" - } - }, - "Microsoft.DeleteProperty": { - "flow": { - "body": "=action.property", - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Delete a property", - "properties": { - "property": { - "intellisenseScopes": [ - "user-variables" - ] - } - }, - "subtitle": "Delete Property" - } - }, - "Microsoft.EditActions": { - "flow": { - "body": "=action.changeType", - "widget": "ActionCard" - }, - "form": { - "label": "Modify active dialog", - "subtitle": "Edit Actions" - } - }, - "Microsoft.EditArray": { - "flow": { - "body": { - "operation": "=coalesce(action.changeType, \"?\")", - "resource": "=coalesce(action.itemsProperty, \"?\")", - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Result", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "body": { - "description": "(Event)", - "property": "=coalesce(action.eventName, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "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": { - "flow": { - "loop": { - "body": "=concat(\"Each value in \", coalesce(action.itemsProperty, \"?\"))", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "ForeachWidget" - }, - "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": { - "flow": { - "loop": { - "body": "=concat(\"Each page of \", coalesce(action.pageSize, \"?\"), \" in \", coalesce(action.page, \"?\"))", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "ForeachWidget" - }, - "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.GetActivityMembers": { - "flow": { - "body": { - "description": "= ActivityId", - "property": "=coalesce(action.activityId, \"?\")", - "widget": "PropertyDescription" - }, - "footer": { - "description": "= Result property", - "property": "=coalesce(action.property, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - } - }, - "Microsoft.GetConversationMembers": { - "flow": { - "footer": { - "description": "= Result property", - "property": "=action.property", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - } - }, - "Microsoft.HttpRequest": { - "flow": { - "body": { - "operation": "=action.method", - "resource": "=action.url", - "singleline": true, - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Result property", - "property": "=action.resultProperty", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.resultProperty", - "widget": "ActionCard" - }, - "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": { - "flow": { - "judgement": { - "body": "=coalesce(action.condition, \"\")", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "IfConditionWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "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": { - "flow": { - "body": { - "operation": "Connection", - "resource": "=coalesce(action.connectionName, \"?\")", - "singleline": true, - "widget": "ResourceOperation" - }, - "footer": { - "description": "= Token property", - "property": "=action.property", - "widget": "PropertyDescription" - }, - "hideFooter": "=!action.property", - "widget": "ActionCard" - }, - "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" - }, - "trigger": { - "label": "Activities (Activity received)", - "order": 5.1, - "submenu": { - "label": "Activities", - "placeholder": "Select an activity type", - "prompt": "Which activity type?" - } - } - }, - "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" - }, - "trigger": { - "label": "Dialog started (Begin dialog event)", - "order": 4.1, - "submenu": { - "label": "Dialog events", - "placeholder": "Select an event type", - "prompt": "Which event?" - } - } - }, - "Microsoft.OnCancelDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog cancelled", - "order": [ - "condition", - "*" - ], - "subtitle": "Cancel dialog event" - }, - "trigger": { - "label": "Dialog cancelled (Cancel dialog event)", - "order": 4.2, - "submenu": "Dialog events" - } - }, - "Microsoft.OnChooseEntity": { - "form": { - "hidden": [ - "actions" - ], - "order": [ - "condition", - "*" - ] - } - }, - "Microsoft.OnChooseIntent": { - "form": { - "hidden": [ - "actions" - ], - "order": [ - "condition", - "*" - ] - }, - "trigger": { - "label": "Duplicated intents recognized", - "order": 6 - } - }, - "Microsoft.OnCommandActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Command received", - "order": [ - "condition", - "*" - ], - "subtitle": "Command activity received" - }, - "trigger": { - "label": "Command received (Command activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "Microsoft.OnCommandResultActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Command Result received", - "order": [ - "condition", - "*" - ], - "subtitle": "Command Result activity received" - }, - "trigger": { - "label": "Command Result received (Command Result activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "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" - }, - "trigger": { - "label": "Greeting (ConversationUpdate activity)", - "order": 5.2, - "submenu": "Activities" - } - }, - "Microsoft.OnDialogEvent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Dialog events", - "order": [ - "condition", - "*" - ], - "subtitle": "Dialog event" - }, - "trigger": { - "label": "Custom events", - "order": 7 - } - }, - "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" - }, - "trigger": { - "label": "Conversation ended (EndOfConversation activity)", - "order": 5.3, - "submenu": "Activities" - } - }, - "Microsoft.OnError": { - "form": { - "hidden": [ - "actions" - ], - "label": "Error occurred", - "order": [ - "condition", - "*" - ], - "subtitle": "Error event" - }, - "trigger": { - "label": "Error occurred (Error event)", - "order": 4.3, - "submenu": "Dialog events" - } - }, - "Microsoft.OnEventActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Event received", - "order": [ - "condition", - "*" - ], - "subtitle": "Event activity" - }, - "trigger": { - "label": "Event received (Event activity)", - "order": 5.4, - "submenu": "Activities" - } - }, - "Microsoft.OnHandoffActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Handover to human", - "order": [ - "condition", - "*" - ], - "subtitle": "Handoff activity" - }, - "trigger": { - "label": "Handover to human (Handoff activity)", - "order": 5.5, - "submenu": "Activities" - } - }, - "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" - }, - "trigger": { - "label": "Intent recognized", - "order": 1 - } - }, - "Microsoft.OnInvokeActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Conversation invoked", - "order": [ - "condition", - "*" - ], - "subtitle": "Invoke activity" - }, - "trigger": { - "label": "Conversation invoked (Invoke activity)", - "order": 5.6, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message received", - "order": [ - "condition", - "*" - ], - "subtitle": "Message activity received" - }, - "trigger": { - "label": "Message received (Message activity received)", - "order": 5.81, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageDeleteActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message deleted", - "order": [ - "condition", - "*" - ], - "subtitle": "Message deleted activity" - }, - "trigger": { - "label": "Message deleted (Message deleted activity)", - "order": 5.82, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageReactionActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message reaction", - "order": [ - "condition", - "*" - ], - "subtitle": "Message reaction activity" - }, - "trigger": { - "label": "Message reaction (Message reaction activity)", - "order": 5.83, - "submenu": "Activities" - } - }, - "Microsoft.OnMessageUpdateActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "Message updated", - "order": [ - "condition", - "*" - ], - "subtitle": "Message updated activity" - }, - "trigger": { - "label": "Message updated (Message updated activity)", - "order": 5.84, - "submenu": "Activities" - } - }, - "Microsoft.OnQnAMatch": { - "trigger": { - "label": "QnA Intent recognized", - "order": 2 - } - }, - "Microsoft.OnRepromptDialog": { - "form": { - "hidden": [ - "actions" - ], - "label": "Re-prompt for input", - "order": [ - "condition", - "*" - ], - "subtitle": "Reprompt dialog event" - }, - "trigger": { - "label": "Re-prompt for input (Reprompt dialog event)", - "order": 4.4, - "submenu": "Dialog events" - } - }, - "Microsoft.OnTypingActivity": { - "form": { - "hidden": [ - "actions" - ], - "label": "User is typing", - "order": [ - "condition", - "*" - ], - "subtitle": "Typing activity" - }, - "trigger": { - "label": "User is typing (Typing activity)", - "order": 5.7, - "submenu": "Activities" - } - }, - "Microsoft.OnUnknownIntent": { - "form": { - "hidden": [ - "actions" - ], - "label": "Unknown intent", - "order": [ - "condition", - "*" - ], - "subtitle": "Unknown intent recognized" - }, - "trigger": { - "label": "Unknown intent", - "order": 3 - } - }, - "Microsoft.QnAMakerDialog": { - "flow": { - "body": "=action.hostname", - "widget": "ActionCard" - } - }, - "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": { - "flow": { - "body": { - "dialog": "=action.dialog", - "widget": "DialogRef" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-understanding-dialogs", - "label": "Replace this dialog", - "order": [ - "dialog", - "options", - "*" - ], - "subtitle": "Replace Dialog" - } - }, - "Microsoft.SendActivity": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-activity", - "label": "Send a response", - "order": [ - "activity", - "*" - ], - "subtitle": "Send Activity" - } - }, - "Microsoft.SendHandoffActivity": { - "flow": { - "widget": "ActionHeader" - }, - "form": { - "helpLink": "https://aka.ms/bfc-send-handoff-activity", - "label": "Send a handoff request", - "subtitle": "Send Handoff Activity" - }, - "menu": { - "label": "Send Handoff Event", - "submenu": [ - "Access external resources" - ] - } - }, - "Microsoft.SetProperties": { - "flow": { - "body": { - "items": "=foreach(action.assignments, x => concat(coalesce(x.property, \"?\"), \" : \", coalesce(x.value, \"?\")))", - "widget": "ListOverview" - }, - "widget": "ActionCard" - }, - "form": { - "helpLink": "https://aka.ms/bfc-using-memory", - "label": "Set properties", - "properties": { - "assignments": { - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - } - } - }, - "subtitle": "Set Properties" - } - }, - "Microsoft.SetProperty": { - "flow": { - "body": "${coalesce(action.property, \"?\")} : ${coalesce(action.value, \"?\")}", - "widget": "ActionCard" - }, - "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": { - "flow": { - "judgement": { - "body": "=coalesce(action.condition, \"\")", - "widget": "ActionCard" - }, - "nowrap": true, - "widget": "SwitchConditionWidget" - }, - "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": { - "flow": { - "body": "=action.prompt", - "botAsks": { - "body": { - "defaultContent": "", - "field": "prompt", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#5C2E91", - "theme": "#EEEAF4" - }, - "icon": "MessageBot", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "nowrap": true, - "userInput": { - "header": { - "colors": { - "icon": "#0078D4", - "theme": "#E5F0FF" - }, - "disableSDKTitle": true, - "icon": "User", - "menu": "none", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "widget": "PromptWidget" - }, - "form": { - "helpLink": "https://aka.ms/bfc-ask-for-user-input", - "label": "Prompt for text", - "properties": { - "property": { - "intellisenseScopes": [ - "variable-scopes" - ] - } - }, - "subtitle": "Text Input" - } - }, - "Microsoft.ThrowException": { - "flow": { - "body": { - "description": "= ErrorValue", - "property": "=coalesce(action.errorValue, \"?\")", - "widget": "PropertyDescription" - }, - "widget": "ActionCard" - }, - "form": { - "label": "Throw an exception", - "subtitle": "Throw an exception" - } - }, - "Microsoft.TraceActivity": { - "form": { - "helpLink": "https://aka.ms/composer-telemetry", - "label": "Emit a trace event", - "subtitle": "Trace Activity" - } - }, - "Microsoft.UpdateActivity": { - "flow": { - "body": { - "field": "activity", - "widget": "LgWidget" - }, - "header": { - "colors": { - "icon": "#656565", - "theme": "#D7D7D7" - }, - "icon": "MessageBot", - "title": "Update activity", - "widget": "ActionHeader" - }, - "widget": "ActionCard" - }, - "form": { - "label": "Update an activity", - "subtitle": "Update Activity" - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.ps1 b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.ps1 deleted file mode 100644 index 67715586e4..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -$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." - -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" "!**/generated" "../*.csproj" "../package.json" -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/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.sh b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.sh deleted file mode 100644 index 50beec9c4c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/schemas/update-schema.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -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." -[ -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" "!**/generated" "../*.csproj" "../package.json" -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/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/settings/appsettings.json b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/settings/appsettings.json deleted file mode 100644 index 531e75ff37..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/settings/appsettings.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "customFunctions": [], - "defaultLanguage": "en-us", - "defaultLocale": "en-us", - "importedLibraries": [], - "languages": [ - "en-us" - ], - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "luFeatures": { - "enableCompositeEntities": true, - "enableListEntities": true, - "enableMLEntities": true, - "enablePattern": true, - "enablePhraseLists": true, - "enablePrebuiltEntities": true, - "enableRegexEntities": true - }, - "luis": { - "authoringEndpoint": "", - "authoringRegion": "", - "defaultLanguage": "en-us", - "endpoint": "", - "environment": "composer", - "name": "EchoSkillBotComposer" - }, - "MicrosoftAppId": "", - "publishTargets": [], - "qna": { - "hostname": "", - "knowledgebaseid": "", - "qnaRegion": "westus" - }, - "runtime": { - "command": "dotnet run --project EchoSkillBotComposer.csproj", - "customRuntime": true, - "key": "adaptive-runtime-dotnet-webapp", - "path": "../" - }, - "runtimeSettings": { - "adapters": [], - "features": { - "removeRecipientMentions": false, - "showTyping": false, - "traceTranscript": false, - "useInspection": false, - "setSpeak": { - "voiceFontName": "en-US-AriaNeural", - "fallbackToTextForSpeechIfEmpty": true - } - }, - "components": [], - "skills": { - "allowedCallers": ["*"] - }, - "storage": "", - "telemetry": { - "logActivities": true, - "logPersonalInformation": false, - "options": { - "connectionString": "" - } - } - }, - "downsampling": { - "maxImbalanceRatio": -1 - }, - "skillConfiguration": {}, - "skillHostEndpoint": "http://localhost:35410/api/skills" -} \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/default.htm b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/default.htm deleted file mode 100644 index 696762e394..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/default.htm +++ /dev/null @@ -1,364 +0,0 @@ - - - - - - - EchoSkillBotComposer - - - - - -
    -
    -
    -
    EchoSkillBotComposer
    -
    -
    -
    -
    -
    Your bot is ready!
    -
    You can test your bot in the Bot Framework Emulator
    - by connecting to http://localhost:3978/api/messages.
    -
    -
    Visit Azure - Bot Service to register your bot and add it to
    - various channels. The bot's endpoint URL typically looks - like this:
    -
    https://your_bots_hostname/api/messages
    -
    -
    -
    -
    - -
    - - - \ No newline at end of file diff --git a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/manifests/echoskillbotcomposer-manifest.json b/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/manifests/echoskillbotcomposer-manifest.json deleted file mode 100644 index 25205b9286..0000000000 --- a/tests/functional/Bots/DotNet/Skills/Composer/EchoSkillBotComposer/wwwroot/manifests/echoskillbotcomposer-manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json", - "$id": "EchoSkillBotComposerDotNet", - "name": "EchoSkillBotComposerDotNet", - "version": "1.0", - "description": "This is a skill for echoing what the user sent to the bot (using Composer with the dotnet runtime).", - "publisherName": "Microsoft", - "privacyUrl": "https://microsoft.com/privacy", - "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.", - "license": "https://github.com/microsoft/BotFramework-FunctionalTests/blob/main/LICENSE", - "tags": [ - "echo" - ], - "endpoints": [ - { - "name": "default", - "protocol": "BotFrameworkV3", - "description": "Localhost endpoint for the skill (on port 35410)", - "endpointUrl": "http://localhost:35410/api/messages", - "msAppId": "00000000-0000-0000-0000-000000000000" - } - ] -} \ No newline at end of file From 14fbf68a95037c1c8141e8c365ed1449363cd88d Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 12:31:56 -0700 Subject: [PATCH 39/44] Merge generator deploy changes into dotnet --- .../deployBotResources/deployBotResources.yml | 6 +- .../yaml/deployBotResources/dotnet/deploy.yml | 58 ++-- .../dotnet/deployComposer.yml | 167 ------------ .../dotnet/evaluateDependenciesVariables.yml | 2 +- .../dotnet/installDependencies.yml | 10 +- .../dotnet/installDependenciesV3.yml | 44 --- .../deployBotResources/generator/deploy.yml | 252 ++---------------- .../evaluateDependenciesVariables.yml | 67 ----- .../generator/installDependencies.yml | 64 ----- 9 files changed, 66 insertions(+), 604 deletions(-) delete mode 100644 tests/functional/build/yaml/deployBotResources/dotnet/deployComposer.yml delete mode 100644 tests/functional/build/yaml/deployBotResources/dotnet/installDependenciesV3.yml delete mode 100644 tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml delete mode 100644 tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index 119bc8cbcb..b8f0899eda 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -89,7 +89,7 @@ stages: displayName: "Prepare JS's Resource Group" # DotNet - - template: generator/deploy.yml + - template: dotnet/deploy.yml parameters: appInsight: "$(INTERNALAPPINSIGHTSNAME)" appServicePlan: "$(INTERNALAPPSERVICEPLANDOTNETNAME)" @@ -110,8 +110,8 @@ stages: project: generator: 'generators/generator-bot-empty' integration: "webapp" - netCoreVersion: "3.1.x" name: "EmptyBotDotNetWebApp" + netCoreVersion: "3.1.x" platform: "dotnet" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} @@ -125,8 +125,8 @@ stages: project: generator: 'generators/generator-bot-empty' integration: "functions" - netCoreVersion: "3.1.x" name: "EmptyBotDotNetFunctions" + netCoreVersion: "3.1.x" platform: "dotnet" dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml index 7002d74d08..4a1a2aa7ab 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml @@ -54,9 +54,8 @@ stages: dependsOn: "${{ bot.dependsOn }}" jobs: - job: "Deploy" - ${{ if eq(bot.type, 'SkillV3') }}: - variables: - SolutionDir: "$(BUILD.SOURCESDIRECTORY)/Bots/DotNet/" + variables: + SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" displayName: "Deploy steps" steps: # Delete Bot Resources @@ -87,28 +86,6 @@ stages: - task: NuGetToolInstaller@1 displayName: "Use NuGet" - # Prepare appsettings.json file, deleting all the declared skills, so it uses only the settings define in Azure - - ${{ if eq(bot.type, 'Host') }}: - - task: PowerShell@2 - displayName: 'Prepare App Settings' - inputs: - targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - failOnStderr: true - script: | - $file = "./appsettings.json" - $content = Get-Content -Raw $file | ConvertFrom-Json - $content.BotFrameworkSkills = @() - $content | ConvertTo-Json | Set-Content $file - - # Run NuGet restore SkillV3 - - ${{ if eq(bot.type, 'SkillV3') }}: - - task: NuGetCommand@2 - displayName: "NuGet restore" - inputs: - restoreSolution: "${{ bot.project.directory }}/${{ bot.project.name }}" - restoreDirectory: "$(SOLUTIONDIR)packages" - # Evaluate dependencies source and version - template: evaluateDependenciesVariables.yml parameters: @@ -116,6 +93,12 @@ stages: registry: "${{ bot.dependency.registry }}" version: "${{ bot.dependency.version }}" + # Generate bot template + - template: ../generator/deploy.yml + paramaters: + project: "${{ bot.project }}" + solutiondir: "$(SOLUTIONDIR)" + # Start of DotNet Install & Build - ${{ if in(bot.type, 'Host', 'Skill') }}: # Install dependencies @@ -123,10 +106,12 @@ stages: parameters: project: "${{ bot.project }}" registry: "$(DEPENDENCIESSOURCE)" + solutiondir: "$(SOLUTIONDIR)/${{ bot.project.name }}" version: "$(DEPENDENCIESVERSIONNUMBER)" packages: - Microsoft.Bot.Builder.Dialogs - Microsoft.Bot.Builder.Integration.AspNet.Core + Microsoft.Bot.Builder.AI.Luis + Microsoft.Bot.Builder.AI.QnA + Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime # Build Bot - task: DotNetCoreCLI@2 @@ -134,7 +119,7 @@ stages: inputs: command: publish publishWebProjects: false - projects: "${{ bot.project.directory }}/${{ bot.project.name }}" + projects: "$(SOLUTIONDIR)/${{ bot.project.name }}/${{ bot.project.name }}.csproj" arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" modifyOutputPath: false @@ -143,14 +128,15 @@ stages: displayName: 'Get BotBuilder Version' inputs: targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' + workingDirectory: '$(SOLUTIONDIR)/${{ bot.project.name }}' failOnStderr: true script: | - [XML]$data = Get-Content "./${{ bot.project.name }}" - $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Integration.AspNet.Core" } + [XML]$data = Get-Content "./${{ bot.project.name }}.csproj" + $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" - # End of DotNet Install & Build + # End of DotNet Install & Build + # Tag BotBuilder package version - template: ../common/tagBotBuilderVersion.yml @@ -213,3 +199,11 @@ stages: botGroup: "${{ parameters.resourceGroup }}" botName: "${{ bot.name }}" resourceSuffix: "${{ parameters.resourceSuffix }}" + + # Perhaps debugging output for the workspace? + - script: | + cd .. + dir *.* /s + displayName: 'Dir workspace' + continueOnError: true + condition: succeededOrFailed() \ No newline at end of file diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/deployComposer.yml b/tests/functional/build/yaml/deployBotResources/dotnet/deployComposer.yml deleted file mode 100644 index 5e20c68afe..0000000000 --- a/tests/functional/build/yaml/deployBotResources/dotnet/deployComposer.yml +++ /dev/null @@ -1,167 +0,0 @@ -parameters: - - name: appInsight - displayName: Azure Application Insight name - type: string - - - name: appServicePlan - displayName: App Service Plan name - type: string - - - name: appServicePlanRG - displayName: App Service Plan Resource Group - type: string - - - name: azureSubscription - displayName: Azure Service Connection - type: string - - - name: botPricingTier - displayName: Bot Pricing Tier - type: string - - - name: bots - displayName: Bots - type: object - - - name: buildFolder - displayName: Build Folder - type: string - default: "build-composer" - - - name: keyVault - displayName: Key Vault name - type: string - - - name: resourceGroup - displayName: Resource Group - type: string - - - name: resourceSuffix - displayName: Azure resources' name suffix - type: string - -stages: -- ${{ each bot in parameters.bots }}: - - stage: "Deploy_${{ bot.name }}" - ${{ if eq(bot.displayName, '') }}: - displayName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - displayName: "${{ bot.displayName }}" - dependsOn: "${{ bot.dependsOn }}" - jobs: - - job: "Deploy" - displayName: "Deploy steps" - steps: - # Delete Bot Resources - - template: ../common/deleteResources.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - resourceGroup: "${{ parameters.resourceGroup }}" - resourceName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - - # Gets Bot App Registration credentials from KeyVault or Pipeline Variables - - template: ../common/getAppRegistration.yml - parameters: - appId: ${{ bot.appId }} - appSecret: ${{ bot.appSecret }} - azureSubscription: "${{ parameters.azureSubscription }}" - botName: "${{ bot.name }}" - keyVault: "${{ parameters.keyVault }}" - - # Use Net Core version - - ${{ if ne(bot.project.netCoreVersion, '') }}: - - task: UseDotNet@2 - displayName: "Use NetCore v${{ bot.project.netCoreVersion }}" - inputs: - version: "${{ bot.project.netCoreVersion }}" - - # Evaluate dependencies source and version - - template: evaluateDependenciesVariables.yml - parameters: - botType: "${{ bot.type }}" - registry: "${{ bot.dependency.registry }}" - version: "${{ bot.dependency.version }}" - - # Start of DotNet Install & Build - - template: installDependencies.yml - parameters: - project: "${{ bot.project }}" - registry: "$(DEPENDENCIESSOURCE)" - version: "$(DEPENDENCIESVERSIONNUMBER)" - packages: - Microsoft.Bot.Builder.AI.Luis - Microsoft.Bot.Builder.AI.QnA - Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime - - # Build Bot - - task: DotNetCoreCLI@2 - displayName: "Build" - inputs: - command: publish - publishWebProjects: false - projects: "${{ bot.project.directory }}/${{ bot.project.name }}" - arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" - modifyOutputPath: false - - # Get BotBuilder package version - - task: PowerShell@2 - displayName: 'Get BotBuilder Version' - inputs: - targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ bot.project.directory }}' - failOnStderr: true - script: | - [XML]$data = Get-Content "./${{ bot.project.name }}" - $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } - Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" - - # Tag BotBuilder package version - - template: ../common/tagBotBuilderVersion.yml - parameters: - ${{ if eq(bot.displayName, '') }}: - botName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - botName: "${{ bot.displayName }}" - version: "$(BOTBUILDERVERSIONNUMBER)" - - # Upload zip to artifacts in case we want to debug it - - task: PublishBuildArtifacts@1 - displayName: 'Publish zip package' - inputs: - pathToPublish: "$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip" - artifactName: dotnet-$(BUILD.BUILDID) - - # Create App Service and Bot Channel Registration - - template: ../common/createAppService.yml - parameters: - appId: $(APPID) - appInsight: "${{ parameters.appInsight }}" - appSecret: $(APPSECRET) - appServicePlan: "${{ parameters.appServicePlan }}" - appServicePlanRG: "${{ parameters.appServicePlanRG }}" - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - botPricingTier: "${{ parameters.botPricingTier }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - templateFile: "build/templates/template-bot-resources.json" - - # Deploy bot - - task: AzureWebApp@1 - displayName: 'Deploy Azure Web App : ${{ bot.name }}-$(BUILD.BUILDID)' - inputs: - azureSubscription: "${{ parameters.azureSubscription }}" - appName: '${{ bot.name }}${{ parameters.resourceSuffix }}-$(BUILD.BUILDID)' - resourceGroupName: '${{ parameters.resourceGroup }}' - package: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' - deploymentMethod: runFromPackage - - # Create DirectLine Channel Hosts - - ${{ if eq(bot.type, 'Host') }}: - - template: ../common/createDirectLine.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/dotnet/evaluateDependenciesVariables.yml index 161b04723b..f2e44169c4 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/evaluateDependenciesVariables.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/evaluateDependenciesVariables.yml @@ -51,7 +51,7 @@ steps: exit 1 # Force exit } if ("${{ parameters.botType }}" -in "Host", "Skill") { - $PackageList = nuget list Microsoft.Bot.Builder.Integration.AspNet.Core -Source "$source" -PreRelease + $PackageList = nuget list Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime -Source "$source" -PreRelease $versionNumber = $PackageList.Split(" ")[-1] } elseif ("${{ parameters.botType }}" -in "SkillV3") { $versionNumber = "" diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/dotnet/installDependencies.yml index 4fc5ef882e..76c859d3ee 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/installDependencies.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/installDependencies.yml @@ -1,4 +1,4 @@ -parameters: +parameters: - name: packages displayName: Dependency Packages type: object @@ -11,6 +11,10 @@ parameters: displayName: Registry source type: string + - name: solutiondir + displayName: Solution directory + type: string + - name: version displayName: Version number type: string @@ -20,7 +24,7 @@ steps: displayName: 'Install dependencies for ${{ parameters.project.name }}' inputs: targetType: inline - workingDirectory: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.project.directory }}' + workingDirectory: '${{ parameters.solutiondir }}' failOnStderr: true script: | $version = "" @@ -46,7 +50,7 @@ steps: } } - Invoke-Expression "dotnet add ""./${{ parameters.project.name }}"" package $version $source $package" + Invoke-Expression "dotnet add ""./${{ parameters.project.name }}.csproj"" package $version $source $package" if (-not ([string]::IsNullOrEmpty("$versionAux"))) { $version = $versionAux diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/installDependenciesV3.yml b/tests/functional/build/yaml/deployBotResources/dotnet/installDependenciesV3.yml deleted file mode 100644 index 62bb916f5a..0000000000 --- a/tests/functional/build/yaml/deployBotResources/dotnet/installDependenciesV3.yml +++ /dev/null @@ -1,44 +0,0 @@ -parameters: - - name: packages - displayName: Dependency Packages - type: object - - - name: project - displayName: Project - type: object - - - name: registry - displayName: Registry source - type: string - - - name: version - displayName: Version number - type: string - -steps: - - task: PowerShell@2 - displayName: 'Install dependencies' - inputs: - targetType: inline - workingDirectory: '$(System.DefaultWorkingDirectory)/${{ parameters.project.directory }}' - failOnStderr: true - script: | - $version = "" - $source = "" - - if (-not ([string]::IsNullOrEmpty("${{ parameters.version }}"))) { - $version = "-Version ""${{ parameters.version }}""" - } - - if (-not ([string]::IsNullOrEmpty("${{ parameters.registry }}"))) { - $source = "-Source ""${{ parameters.registry }}""" - } - - foreach ($package in "${{ parameters.packages }}".Split()) { - Invoke-Expression "nuget update ""./packages.config"" -Id $package $version $source" - } - - write-host "`nPackages:" - foreach ($package in "${{ parameters.packages }}".Split()) { - write-host " - $package " - } diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index 433b5fa66a..c96c14bb56 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -1,226 +1,32 @@ parameters: - - name: appInsight - displayName: Azure Application Insight name - type: string - - - name: appServicePlan - displayName: App Service Plan name - type: string - - - name: appServicePlanRG - displayName: App Service Plan Resource Group - type: string - - - name: azureSubscription - displayName: Azure Service Connection - type: string - - - name: botPricingTier - displayName: Bot Pricing Tier - type: string - - - name: bots - displayName: Bots + - name: project + displayName: Project type: object - - name: buildFolder - displayName: Build Folder - type: string - default: "build-dotnet" - - - name: connectionName - displayName: OAuth Connection Name - type: string - - - name: keyVault - displayName: Key Vault name - type: string - - - name: resourceGroup - displayName: Resource Group - type: string - - - name: resourceSuffix - displayName: Azure resources' name suffix - type: string - -stages: -- ${{ each bot in parameters.bots }}: - - stage: "Deploy_${{ bot.name }}" - ${{ if eq(bot.displayName, '') }}: - displayName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - displayName: "${{ bot.displayName }}" - dependsOn: "${{ bot.dependsOn }}" - jobs: - - job: "Deploy" - variables: - SolutionDir: "$(BUILD.SOURCESDIRECTORY)/bots/" - displayName: "Deploy steps" - steps: - # Create /bots directory - - script: | - mkdir bots - displayName: 'Create bots directory' - - # Install yarn workspace - - script: | - yarn --immutable - displayName: 'Install yarn' - - # Install yo - - script: | - npm install -g yo - displayName: 'Install yo' - - # Generate Bot template - - task: CmdLine@2 - displayName: 'Install template' - inputs: - script: | - yo ../${{ bot.project.generator }} ${{ bot.project.name }} --platform ${{ bot.project.platform }} --integration ${{ bot.project.integration }} - workingDirectory: '$(SOLUTIONDIR)' - - # Delete Bot Resources - - template: ../common/deleteResources.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - resourceGroup: "${{ parameters.resourceGroup }}" - resourceName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - - # Gets Bot App Registration credentials from KeyVault or Pipeline Variables - - template: ../common/getAppRegistration.yml - parameters: - appId: ${{ bot.appId }} - appSecret: ${{ bot.appSecret }} - azureSubscription: "${{ parameters.azureSubscription }}" - botName: "${{ bot.name }}" - keyVault: "${{ parameters.keyVault }}" - - # Use Net Core version - - ${{ if ne(bot.project.netCoreVersion, '') }}: - - task: UseDotNet@2 - displayName: "Use NetCore v${{ bot.project.netCoreVersion }}" - inputs: - version: "${{ bot.project.netCoreVersion }}" - - # Use NuGet - - task: NuGetToolInstaller@1 - displayName: "Use NuGet" - - # Evaluate dependencies source and version - - template: evaluateDependenciesVariables.yml - parameters: - botType: "${{ bot.type }}" - registry: "${{ bot.dependency.registry }}" - version: "${{ bot.dependency.version }}" - - # Start of DotNet Install & Build - - ${{ if in(bot.type, 'Host', 'Skill') }}: - # Install dependencies - - template: installDependencies.yml - parameters: - project: "${{ bot.project }}" - registry: "$(DEPENDENCIESSOURCE)" - solutiondir: "$(SOLUTIONDIR)/${{ bot.project.name }}" - version: "$(DEPENDENCIESVERSIONNUMBER)" - packages: - Microsoft.Bot.Builder.AI.Luis - Microsoft.Bot.Builder.AI.QnA - Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime - - # Build Bot - - task: DotNetCoreCLI@2 - displayName: "Build" - inputs: - command: publish - publishWebProjects: false - projects: "$(SOLUTIONDIR)/${{ bot.project.name }}/${{ bot.project.name }}.csproj" - arguments: "--output $(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}" - modifyOutputPath: false - - # Get BotBuilder package version - - task: PowerShell@2 - displayName: 'Get BotBuilder Version' - inputs: - targetType: inline - workingDirectory: '$(SOLUTIONDIR)/${{ bot.project.name }}' - failOnStderr: true - script: | - [XML]$data = Get-Content "./${{ bot.project.name }}.csproj" - $package = $data.Project.ItemGroup.PackageReference | Where-Object { $_.Include -eq "Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" } - Write-Host "##vso[task.setvariable variable=BotBuilderVersionNumber]$($package.version)" - - # End of DotNet Install & Build - - - # Tag BotBuilder package version - - template: ../common/tagBotBuilderVersion.yml - parameters: - ${{ if eq(bot.displayName, '') }}: - botName: "${{ bot.name }}" - ${{ if ne(bot.displayName, '') }}: - botName: "${{ bot.displayName }}" - version: "$(BOTBUILDERVERSIONNUMBER)" - - # Upload zip to artifacts in case we want to debug it - - task: PublishBuildArtifacts@1 - displayName: 'Publish zip package' - inputs: - pathToPublish: "$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip" - artifactName: dotnet-$(BUILD.BUILDID) - - # Create App Service and Bot Channel Registration - - template: ../common/createAppService.yml - parameters: - appId: $(APPID) - appInsight: "${{ parameters.appInsight }}" - appSecret: $(APPSECRET) - appServicePlan: "${{ parameters.appServicePlan }}" - appServicePlanRG: "${{ parameters.appServicePlanRG }}" - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - botPricingTier: "${{ parameters.botPricingTier }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - templateFile: "build/templates/template-bot-resources.json" - - # Deploy bot - - task: AzureWebApp@1 - displayName: 'Deploy Azure Web App : ${{ bot.name }}-$(BUILD.BUILDID)' - inputs: - azureSubscription: "${{ parameters.azureSubscription }}" - appName: '${{ bot.name }}${{ parameters.resourceSuffix }}-$(BUILD.BUILDID)' - resourceGroupName: '${{ parameters.resourceGroup }}' - package: '$(SYSTEM.DEFAULTWORKINGDIRECTORY)/${{ parameters.buildFolder }}/${{ bot.name }}/${{ bot.name }}.zip' - deploymentMethod: runFromPackage - - # Configure OAuth - - ${{ if eq(bot.type, 'Skill') }}: - - template: ../common/configureOAuth.yml - parameters: - appId: $(APPID) - appSecret: $(APPSECRET) - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - connectionName: "${{ parameters.connectionName }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - - # Create DirectLine Channel Hosts - - ${{ if eq(bot.type, 'Host') }}: - - template: ../common/createDirectLine.yml - parameters: - azureSubscription: "${{ parameters.azureSubscription }}" - botGroup: "${{ parameters.resourceGroup }}" - botName: "${{ bot.name }}" - resourceSuffix: "${{ parameters.resourceSuffix }}" - - # Perhaps debugging output for the workspace? - - script: | - cd .. - dir *.* /s - displayName: 'Dir workspace' - continueOnError: true - condition: succeededOrFailed() \ No newline at end of file + - name: solutiondir + displayName: Solution directory + type: string + +steps: + # Create /bots directory + - script: | + mkdir bots + displayName: 'Create bots directory' + + # Install yarn workspace + - script: | + yarn --immutable + displayName: 'Install yarn' + + # Install yo + - script: | + npm install -g yo + displayName: 'Install yo' + + # Generate Bot template + - task: CmdLine@2 + displayName: 'Install template' + inputs: + script: | + yo ../${{ project.generator }} ${{ project.name }} --platform ${{ project.platform }} --integration ${{ project.integration }} + workingDirectory: '$(solutiondir)' diff --git a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml b/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml deleted file mode 100644 index f2e44169c4..0000000000 --- a/tests/functional/build/yaml/deployBotResources/generator/evaluateDependenciesVariables.yml +++ /dev/null @@ -1,67 +0,0 @@ -parameters: - - name: botType - displayName: Bot type - type: string - - - name: registry - displayName: Registry source - type: string - - - name: version - displayName: Version number - type: string - -steps: - - task: PowerShell@2 - displayName: 'Evaluate source & version' - inputs: - targetType: inline - failOnStderr: true - script: | - # Get Source - $sourceDotNetv3MyGet = "https://botbuilder.myget.org/F/botbuilder-v3-dotnet-daily/api/v3/index.json" - $sourceDotNetArtifacts = "https://pkgs.dev.azure.com/ConversationalAI/BotFramework/_packaging/SDK/nuget/v3/index.json" - $sourceDotNetMyGet = "https://botbuilder.myget.org/F/botbuilder-v4-dotnet-daily/api/v3/index.json" - switch -regex ("${{ parameters.registry }}") { - "^($null|)$" { - switch ("${{ parameters.botType }}") { - "SkillV3" { $source = $sourceDotNetv3MyGet } - default { $source = $sourceDotNetArtifacts } - } - } - "Artifacts" { $source = $sourceDotNetArtifacts } - "MyGet" { - switch ("${{ parameters.botType }}") { - "SkillV3" { $source = $sourceDotNetv3MyGet } - default { $source = $sourceDotNetMyGet } - } - } - "NuGet" { $source = "" } - default { $source = "${{ parameters.registry }}" } - } - Write-Host "Source: $source" - - # Get Version Number - switch -regex ("${{ parameters.version }}") { - "^($null||LATEST)$" { - if ("${{ parameters.registry }}".ToUpper() -in "NUGET") { - [Console]::ForegroundColor = "red" - [Console]::Error.WriteLine("Preview versions of BotBuilder are not available for this source.") - [Console]::ResetColor() - exit 1 # Force exit - } - if ("${{ parameters.botType }}" -in "Host", "Skill") { - $PackageList = nuget list Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime -Source "$source" -PreRelease - $versionNumber = $PackageList.Split(" ")[-1] - } elseif ("${{ parameters.botType }}" -in "SkillV3") { - $versionNumber = "" - } - } - STABLE { $versionNumber = "" } - default { $versionNumber = "${{ parameters.version }}" } - } - Write-Host "Version Number: $versionNumber" - - # Set environment variables - Write-Host "##vso[task.setvariable variable=DependenciesSource]$source" - Write-Host "##vso[task.setvariable variable=DependenciesVersionNumber]$versionNumber" diff --git a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml b/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml deleted file mode 100644 index 76c859d3ee..0000000000 --- a/tests/functional/build/yaml/deployBotResources/generator/installDependencies.yml +++ /dev/null @@ -1,64 +0,0 @@ -parameters: - - name: packages - displayName: Dependency Packages - type: object - - - name: project - displayName: Project - type: object - - - name: registry - displayName: Registry source - type: string - - - name: solutiondir - displayName: Solution directory - type: string - - - name: version - displayName: Version number - type: string - -steps: - - task: PowerShell@2 - displayName: 'Install dependencies for ${{ parameters.project.name }}' - inputs: - targetType: inline - workingDirectory: '${{ parameters.solutiondir }}' - failOnStderr: true - script: | - $version = "" - $source = "" - - if (-not ([string]::IsNullOrEmpty("${{ parameters.version }}"))) { - $version = "--version ${{ parameters.version }}" - } - - if (-not ([string]::IsNullOrEmpty("${{ parameters.registry }}"))) { - $source = "--source ${{ parameters.registry }}" - } - - foreach ($package in "${{ parameters.packages }}".Split()) { - if ($package -eq "Microsoft.Bot.Builder.Dialogs.Debugging") { - $versionAux = $version - if ($version -Match "rc") { - $version = "$version.preview" - } elseif ($version -Match "daily") { - $version = $version.replace("daily", "daily.preview") - } else { - $version = "$version-preview" - } - } - - Invoke-Expression "dotnet add ""./${{ parameters.project.name }}.csproj"" package $version $source $package" - - if (-not ([string]::IsNullOrEmpty("$versionAux"))) { - $version = $versionAux - $versionAux = "" - } - } - - write-host " `nPackages:" - foreach ($package in "${{ parameters.packages }}".Split()) { - write-host " - $package" - } From 1f8e27530406bd0adcae1d5c1631a88fb7a0c38f Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 12:37:34 -0700 Subject: [PATCH 40/44] fix parameters typo --- .../functional/build/yaml/deployBotResources/dotnet/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml index 4a1a2aa7ab..c387f4ead1 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml @@ -95,7 +95,7 @@ stages: # Generate bot template - template: ../generator/deploy.yml - paramaters: + parameters: project: "${{ bot.project }}" solutiondir: "$(SOLUTIONDIR)" From 4cd7568fa34836ba503cca73f8de37fd00dd8cb4 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 12:39:31 -0700 Subject: [PATCH 41/44] fix variable usage to parameters --- .../build/yaml/deployBotResources/generator/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index c96c14bb56..a3fc18c1b2 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -28,5 +28,5 @@ steps: displayName: 'Install template' inputs: script: | - yo ../${{ project.generator }} ${{ project.name }} --platform ${{ project.platform }} --integration ${{ project.integration }} + yo ../$(project.generator) $(project.name) --platform $(project.platform) --integration $(project.integration) workingDirectory: '$(solutiondir)' From ce9ee93a5f27c3a4182a2a13187277c3a0dfc6b8 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 12:54:51 -0700 Subject: [PATCH 42/44] revert param syntax --- .../build/yaml/deployBotResources/generator/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml index a3fc18c1b2..f7c1680fde 100644 --- a/tests/functional/build/yaml/deployBotResources/generator/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/generator/deploy.yml @@ -28,5 +28,5 @@ steps: displayName: 'Install template' inputs: script: | - yo ../$(project.generator) $(project.name) --platform $(project.platform) --integration $(project.integration) - workingDirectory: '$(solutiondir)' + yo ../${{ parameters.project.generator }} ${{ parameters.project.name }} --platform ${{ parameters.project.platform }} --integration ${{ parameters.project.integration }} + workingDirectory: '${{ parameters.solutiondir }}' From 43af45ec7eead0a926fea56fddfc26210b492bd3 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 14:38:23 -0700 Subject: [PATCH 43/44] formatting --- .../build/yaml/deployBotResources/deployBotResources.yml | 1 + .../functional/build/yaml/deployBotResources/dotnet/deploy.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml index b8f0899eda..f39e345b58 100644 --- a/tests/functional/build/yaml/deployBotResources/deployBotResources.yml +++ b/tests/functional/build/yaml/deployBotResources/deployBotResources.yml @@ -116,6 +116,7 @@ stages: dependency: registry: ${{ parameters.dependenciesRegistryDotNetHosts }} version: ${{ parameters.dependenciesVersionDotNetHosts }} + - name: "bfcfnemptybotdotnetfunctions" dependsOn: "Prepare_DotNetGroup" type: "Host" diff --git a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml index c387f4ead1..f3d0c6f054 100644 --- a/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml +++ b/tests/functional/build/yaml/deployBotResources/dotnet/deploy.yml @@ -200,7 +200,7 @@ stages: botName: "${{ bot.name }}" resourceSuffix: "${{ parameters.resourceSuffix }}" - # Perhaps debugging output for the workspace? + # Debugging output for the workspace - script: | cd .. dir *.* /s From 99861d652e566335f4bb953e3b7724767685e601 Mon Sep 17 00:00:00 2001 From: Ryan Lengel Isgrig Date: Wed, 16 Jun 2021 15:32:54 -0700 Subject: [PATCH 44/44] fix botstroage typo --- .../build/yaml/sharedResources/createSharedResources.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/build/yaml/sharedResources/createSharedResources.yml b/tests/functional/build/yaml/sharedResources/createSharedResources.yml index f593314d46..efdf2fcc1c 100644 --- a/tests/functional/build/yaml/sharedResources/createSharedResources.yml +++ b/tests/functional/build/yaml/sharedResources/createSharedResources.yml @@ -22,7 +22,7 @@ variables: InternalAppServicePlanDotNetName: "bfcfnbotsappservicedotnet$($env:RESOURCESUFFIX)" InternalAppServicePlanJSName: "bfcfnbotsappservicejs$($env:RESOURCESUFFIX)" InternalCosmosDBName: "bfcfnbotstatedb$($env:RESOURCESUFFIX)" - InternalStorageName: "bfcfnbotstroage$($env:RESOURCESUFFIX)" + InternalStorageName: "bfcfnbotstorage$($env:RESOURCESUFFIX)" InternalKeyVaultName: "bfcfnbotkeyvault$($env:RESOURCESUFFIX)" InternalResourceGroupName: $[coalesce(variables['RESOURCEGROUPNAME'], 'bfcfnshared')]
    -
    -
    Your bot is ready!
    -
    You can test your bot in the Bot Framework Emulator
    - by connecting to http://localhost:3978/api/messages.
    -
    -
    Visit Azure - Bot Service to register your bot and add it to
    - various channels. The bot's endpoint URL typically looks - like this:
    -
    https://your_bots_hostname/api/messages
    -
    -
    -

    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 z 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 S|B-LI|KfuG|MK5*0{;W>vfD%e diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/teams-logo.png b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/Files/teams-logo.png deleted file mode 100644 index 78b0a0c308939206aee5f15e2c052def7a18a74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6412 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 F{{vnI6G{L8 diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/SampleData.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/SampleData.cs deleted file mode 100644 index 13b7d9d744..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Cards/SampleData.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Cards -{ - public class SampleData - { - public SampleData() - { - MultiSelect = "true"; - } - - public string Question { get; set; } - - public string MultiSelect { get; set; } - - public string Option1 { get; set; } - - public string Option2 { get; set; } - - public string Option3 { get; set; } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Delete/DeleteDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Delete/DeleteDialog.cs deleted file mode 100644 index 616ddfd70c..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Delete/DeleteDialog.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Delete -{ - public class DeleteDialog : ComponentDialog - { - private readonly List _deleteSupported = new List - { - Channels.Msteams, - Channels.Slack, - Channels.Telegram - }; - - public DeleteDialog() - : base(nameof(DeleteDialog)) - { - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { HandleDeleteDialog })); - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task HandleDeleteDialog(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var channel = stepContext.Context.Activity.ChannelId; - if (_deleteSupported.Contains(channel)) - { - var id = await stepContext.Context.SendActivityAsync(MessageFactory.Text("I will delete this message in 5 seconds"), cancellationToken); - await Task.Delay(5000, cancellationToken); - await stepContext.Context.DeleteActivityAsync(id.Id, cancellationToken); - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Delete is not supported in the {channel} channel."), cancellationToken); - } - - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/FileUpload/FileUploadDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/FileUpload/FileUploadDialog.cs deleted file mode 100644 index 67a3885d27..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/FileUpload/FileUploadDialog.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.IO; -using System.Net; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.FileUpload -{ - public class FileUploadDialog : ComponentDialog - { - public FileUploadDialog() - : base(nameof(FileUploadDialog)) - { - AddDialog(new AttachmentPrompt(nameof(AttachmentPrompt))); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { PromptUploadStepAsync, HandleAttachmentStepAsync, FinalStepAsync })); - - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptUploadStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var promptOptions = new PromptOptions - { - Prompt = MessageFactory.Text("Please upload a file to continue."), - RetryPrompt = MessageFactory.Text("You must upload a file."), - }; - - return await stepContext.PromptAsync(nameof(AttachmentPrompt), promptOptions, cancellationToken); - } - - private async Task HandleAttachmentStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var fileText = string.Empty; - - foreach (var file in stepContext.Context.Activity.Attachments) - { - var remoteFileUrl = file.ContentUrl; - var localFileName = Path.Combine(Path.GetTempPath(), file.Name); - string fileContent; - - using (var webClient = new WebClient()) - { - webClient.DownloadFile(remoteFileUrl, localFileName); - using var reader = new StreamReader(localFileName); - fileContent = await reader.ReadToEndAsync(); - } - - fileText += $"Attachment \"{file.Name}\" has been received.\r\n"; - fileText += $"File content: {fileContent}\r\n"; - } - - await stepContext.Context.SendActivityAsync(MessageFactory.Text(fileText), cancellationToken); - - // Ask to upload another file or end. - const string messageText = "Do you want to upload another file?"; - const string repromptMessageText = "That's an invalid choice."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput) - }; - - return await stepContext.PromptAsync(nameof(ConfirmPrompt), options, cancellationToken); - } - - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var tryAnother = (bool)stepContext.Result; - if (tryAnother) - { - return await stepContext.ReplaceDialogAsync(InitialDialogId, cancellationToken: cancellationToken); - } - - return new DialogTurnResult(DialogTurnStatus.Complete); - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/MessageWithAttachment/MessageWithAttachmentDialog.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/MessageWithAttachment/MessageWithAttachmentDialog.cs deleted file mode 100644 index 443413e20d..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/MessageWithAttachment/MessageWithAttachmentDialog.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.MessageWithAttachment -{ - public class MessageWithAttachmentDialog : ComponentDialog - { - private const string Picture = "architecture-resize.png"; - private readonly Uri _serverUrl; - - public MessageWithAttachmentDialog(Uri serverUrl) - : base(nameof(MessageWithAttachmentDialog)) - { - _serverUrl = serverUrl; - AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { SelectAttachmentTypeAsync, SendActivityWithAttachmentAsync, FinalStepAsync })); - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task SelectAttachmentTypeAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - const string messageText = "What attachment type do you want?"; - const string repromptMessageText = "That was not a valid choice, please select a valid card type."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - Choices = new List - { - new Choice("Inline"), - new Choice("Internet") - } - }; - - // Ask the user to enter their name. - return await stepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); - } - - private async Task SendActivityWithAttachmentAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var attachmentType = ((FoundChoice)stepContext.Result).Value.ToLowerInvariant(); - var reply = new Activity(ActivityTypes.Message) { InputHint = InputHints.IgnoringInput }; - switch (attachmentType) - { - case "inline": - reply.Text = "This is an inline attachment."; - reply.Attachments = new List { GetInlineAttachment() }; - break; - - case "internet": - reply.Text = "This is an attachment from a HTTP URL."; - reply.Attachments = new List { GetInternetAttachment() }; - break; - - default: - throw new InvalidOperationException($"Invalid card type {attachmentType}"); - } - - await stepContext.Context.SendActivityAsync(reply, cancellationToken); - - // Ask to submit another or end. - const string messageText = "Do you want another type of attachment?"; - const string repromptMessageText = "That's an invalid choice."; - var options = new PromptOptions - { - Prompt = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput), - RetryPrompt = MessageFactory.Text(repromptMessageText, repromptMessageText, InputHints.ExpectingInput), - }; - - return await stepContext.PromptAsync(nameof(ConfirmPrompt), options, cancellationToken); - } - - private async Task FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var tryAnother = (bool)stepContext.Result; - if (tryAnother) - { - return await stepContext.ReplaceDialogAsync(InitialDialogId, cancellationToken: cancellationToken); - } - - return new DialogTurnResult(DialogTurnStatus.Complete); - } - - private Attachment GetInlineAttachment() - { - var imagePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "images", Picture); - var imageData = Convert.ToBase64String(File.ReadAllBytes(imagePath)); - - return new Attachment - { - Name = $"Files/{Picture}", - ContentType = "image/png", - ContentUrl = $"data:image/png;base64,{imageData}", - }; - } - - private Attachment GetInternetAttachment() - { - return new Attachment - { - Name = $"Files/{Picture}", - ContentType = "image/png", - ContentUrl = $"{_serverUrl}images/{Picture}", - }; - } - } -} diff --git a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/ContinuationParameters.cs b/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/ContinuationParameters.cs deleted file mode 100644 index ef2970a643..0000000000 --- a/tests/functional/Bots/DotNet/Skills/CodeFirst/WaterfallSkillBot/Dialogs/Proactive/ContinuationParameters.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Security.Principal; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotFrameworkFunctionalTests.WaterfallSkillBot.Dialogs.Proactive -{ - ///