diff --git a/Composer/packages/client/src/pages/botProject/AllowedCallers.tsx b/Composer/packages/client/src/pages/botProject/AllowedCallers.tsx index 92e57bd593..df5fa8e1a2 100644 --- a/Composer/packages/client/src/pages/botProject/AllowedCallers.tsx +++ b/Composer/packages/client/src/pages/botProject/AllowedCallers.tsx @@ -12,6 +12,7 @@ import { Stack } from 'office-ui-fabric-react/lib/components/Stack'; import { ITextField, TextField } from 'office-ui-fabric-react/lib/components/TextField'; import cloneDeep from 'lodash/cloneDeep'; import formatMessage from 'format-message'; +import { MessageBar, MessageBarType } from 'office-ui-fabric-react/lib/MessageBar'; import { dispatcherState, rootBotProjectIdSelector, settingsState } from '../../recoilModel'; import { mergePropertiesManagedByRootBot } from '../../recoilModel/dispatchers/utils/project'; @@ -100,43 +101,47 @@ export const AllowedCallers: React.FC = ({ projectId }) => { const rootBotProjectId = useRecoilValue(rootBotProjectIdSelector) || ''; const settings = useRecoilValue(settingsState(projectId)); const mergedSettings = mergePropertiesManagedByRootBot(projectId, rootBotProjectId, settings); - const { skillConfiguration } = mergedSettings; + const { runtimeSettings } = mergedSettings; const updateAllowedCallers = React.useCallback( (allowedCallers: string[] = []) => { const updatedSetting = { ...cloneDeep(mergedSettings), - skillConfiguration: { ...skillConfiguration, allowedCallers }, + runtimeSettings: { ...runtimeSettings, skills: { ...runtimeSettings?.skills, allowedCallers } }, }; setSettings(projectId, updatedSetting); }, - [mergedSettings, projectId, skillConfiguration] + [mergedSettings, projectId, runtimeSettings?.skills] ); const onBlur = React.useCallback(() => { - updateAllowedCallers(skillConfiguration?.allowedCallers?.filter(Boolean)); - }, [skillConfiguration?.allowedCallers, updateAllowedCallers]); + updateAllowedCallers(runtimeSettings?.skills?.allowedCallers?.filter(Boolean)); + }, [runtimeSettings?.skills?.allowedCallers, updateAllowedCallers]); const onChange = React.useCallback( (index: number) => (_: React.FormEvent, newValue = '') => { - const updatedAllowedCallers = [...(skillConfiguration?.allowedCallers || [])]; + const updatedAllowedCallers = [...(runtimeSettings?.skills?.allowedCallers || [])]; updatedAllowedCallers[index] = newValue; updateAllowedCallers(updatedAllowedCallers); }, - [skillConfiguration?.allowedCallers, updateAllowedCallers] + [runtimeSettings?.skills?.allowedCallers, updateAllowedCallers] ); const onRemove = React.useCallback( (index: number) => () => { - const updatedAllowedCallers = skillConfiguration?.allowedCallers?.filter((_, itemIndex) => itemIndex !== index); + const updatedAllowedCallers = runtimeSettings?.skills?.allowedCallers?.filter( + (_, itemIndex) => itemIndex !== index + ); updateAllowedCallers(updatedAllowedCallers); }, - [skillConfiguration?.allowedCallers, updateAllowedCallers] + [runtimeSettings?.skills?.allowedCallers, updateAllowedCallers] ); const onAddNewAllowedCaller = React.useCallback(() => { - updateAllowedCallers([...skillConfiguration?.allowedCallers, '']); - }, [skillConfiguration?.allowedCallers, updateAllowedCallers]); + runtimeSettings?.skills?.allowedCallers + ? updateAllowedCallers([...runtimeSettings?.skills?.allowedCallers, '']) + : updateAllowedCallers(['']); + }, [runtimeSettings?.skills?.allowedCallers, updateAllowedCallers]); return ( @@ -146,16 +151,19 @@ export const AllowedCallers: React.FC = ({ projectId }) => { )} - {skillConfiguration?.allowedCallers?.map((caller, index) => { + {runtimeSettings?.skills?.allowedCallers?.map((caller, index) => { return ( ); })} - {!skillConfiguration?.allowedCallers?.length && ( -
+ + {formatMessage('Add caller')} + + {!runtimeSettings?.skills?.allowedCallers?.length && ( + {formatMessage('This bot cannot be called as a skill since the allowed caller list is empty')} -
+ )} {formatMessage('Add new caller')} diff --git a/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterModal.tsx b/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterModal.tsx index d9813a0a49..a27e99a694 100644 --- a/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterModal.tsx +++ b/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterModal.tsx @@ -15,17 +15,12 @@ import { JSONSchema7 } from '@botframework-composer/types'; import { EditorExtension, PluginConfig } from '@bfc/extension-client'; import mapValues from 'lodash/mapValues'; import { JSONSchema7Type } from 'json-schema'; +import { AdapterRecord } from '@botframework-composer/types'; import { settingsState, dispatcherState } from '../../../recoilModel'; import { useShell } from '../../../shell'; import plugins, { mergePluginConfigs } from '../../../plugins'; -export type AdapterRecord = { - name: string; - route: string; - enabled: boolean; -}; - type Props = { adapterKey: string; packageName: string; diff --git a/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterSettings.tsx b/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterSettings.tsx index 7422a36e42..7074336028 100644 --- a/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterSettings.tsx +++ b/Composer/packages/client/src/pages/botProject/adapters/ExternalAdapterSettings.tsx @@ -14,12 +14,13 @@ import { IconButton } from 'office-ui-fabric-react/lib/Button'; import { TooltipHost, DirectionalHint } from 'office-ui-fabric-react/lib/Tooltip'; import { SharedColors } from '@uifabric/fluent-theme'; import { JSONSchema7 } from '@botframework-composer/types'; +import { AdapterRecord } from '@botframework-composer/types/src'; import { useRouterCache } from '../../../utils/hooks'; import { schemasState, settingsState, dispatcherState } from '../../../recoilModel'; import { subtitle, tableRow, tableRowItem, tableColumnHeader, columnSizes } from '../styles'; -import AdapterModal, { AdapterRecord, hasRequired } from './ExternalAdapterModal'; +import AdapterModal, { hasRequired } from './ExternalAdapterModal'; ////////// diff --git a/Composer/packages/lib/shared/src/settings.ts b/Composer/packages/lib/shared/src/settings.ts index 8bc424ac9a..a0794a875c 100644 --- a/Composer/packages/lib/shared/src/settings.ts +++ b/Composer/packages/lib/shared/src/settings.ts @@ -37,6 +37,9 @@ export const applyPublishingProfileToSettings = (settings: DialogSetting, profil connectionString: profile.settings.blobStorage.connectionString, containerName: profile.settings.blobStorage.container, }, + setSpeak: { + ...settings.runtimeSettings.features?.setSpeak, + }, }; } diff --git a/Composer/packages/server/src/models/settings/defaultSettingManager.ts b/Composer/packages/server/src/models/settings/defaultSettingManager.ts index 04593455fa..b0c77cadab 100644 --- a/Composer/packages/server/src/models/settings/defaultSettingManager.ts +++ b/Composer/packages/server/src/models/settings/defaultSettingManager.ts @@ -32,6 +32,28 @@ export class DefaultSettingManager extends FileSettingManager { protected createDefaultSettings = (): DialogSetting => { return { + runtimeSettings: { + features: { + removeRecipientMentions: false, + showTyping: false, + traceTranscript: false, + useInspection: false, + setSpeak: { + voiceFontName: 'en-US-AriaNeural', + fallbackToTextForSpeechIfEmpty: true, + }, + }, + components: [], + skills: { + allowedCallers: [], + }, + storage: '', + telemetry: { + instrumentationKey: '', + logActivities: true, + logPersonalInformation: false, + }, + }, feature: { UseShowTypingMiddleware: false, UseInspectionMiddleware: false, @@ -98,11 +120,6 @@ export class DefaultSettingManager extends FileSettingManager { downsampling: { maxImbalanceRatio: -1, }, - skillConfiguration: { - // TODO: Setting isSkill property to true for now. A runtime change is required to remove dependancy on isSkill prop #4501 - isSkill: true, - allowedCallers: [], - }, skill: {}, defaultLanguage: 'en-us', languages: ['en-us'], diff --git a/Composer/packages/types/src/settings.ts b/Composer/packages/types/src/settings.ts index 15e82dc9b6..84781a01d1 100644 --- a/Composer/packages/types/src/settings.ts +++ b/Composer/packages/types/src/settings.ts @@ -1,5 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +import { JSONSchema7Type } from 'json-schema'; + import type { PublishTarget } from './publish'; export interface LibraryRef { @@ -9,6 +11,13 @@ export interface LibraryRef { location: string; } +export type AdapterRecord = { + name: string; + route?: JSONSchema7Type; + type?: JSONSchema7Type; + enabled: boolean; +}; + export type CodeEditorSettings = { lineNumbers: boolean; wordWrap: boolean; @@ -44,6 +53,38 @@ export type SkillSetting = { endpointUrl: string; }; +export type RuntimeSettings = { + adapters?: AdapterRecord[]; + features?: { + removeRecipientMentions?: boolean; + showTyping?: boolean; + traceTranscript?: boolean; + useInspection?: boolean; + blobTranscript?: { + connectionString?: string; + containerName?: string; + }; + setSpeak?: { + voiceFontName?: string; + fallbackToTextForSpeechIfEmpty?: true; + }; + }; + components?: []; + skills?: { + allowedCallers?: string[]; + }; + storage?: string; + telemetry?: { + options?: { + connectionString?: string; + instrumentationKey?: string; + }; + instrumentationKey?: string; + logActivities?: boolean; + logPersonalInformation?: boolean; + }; +}; + export type DialogSetting = { MicrosoftAppId?: string; MicrosoftAppPassword?: string; @@ -67,6 +108,8 @@ export type DialogSetting = { botId?: string; skillHostEndpoint?: string; customFunctions: string[]; + defaultLocale?: string; + runtimeSettings?: RuntimeSettings; [key: string]: any; };