Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 33 additions & 3 deletions Composer/packages/client/__tests__/utils/luUtil.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ describe('getReferredFiles', () => {
intentTriggers: [
{ intent: 'dia1_trigger', dialogs: ['dia1'] },
{ intent: 'dia2_trigger', dialogs: ['dia2'] },
{ intent: 'dias_trigger', dialogs: ['dia5', 'dia6'] },
{ intent: 'no_dialog', dialogs: [] },
{ intent: '', dialogs: ['start_dialog_without_intent'] },
],
},
{
Expand All @@ -48,13 +51,40 @@ describe('getReferredFiles', () => {
luFile: 'dia4',
intentTriggers: [],
},
{
id: 'dia5',
luFile: 'dia5',
intentTriggers: [],
},
{
id: 'dia6',
luFile: 'dia6',
intentTriggers: [],
},
{
id: 'start_dialog_without_intent',
luFile: 'start_dialog_without_intent',
intentTriggers: [],
},
];
const luFiles = [
{ id: 'main.en-us' },
{ id: 'dia1.en-us' },
{ id: 'dia2.en-us' },
{ id: 'dia3.en-us' },
{ id: 'dia5.en-us' },
{ id: 'dia6.en-us' },
{ id: 'start_dialog_without_intent.en-us' },
];
const luFiles = [{ id: 'main.en-us' }, { id: 'dia1.en-us' }, { id: 'dia2.en-us' }, { id: 'dia3.en-us' }];
const config = createCrossTrainConfig(dialogs as DialogInfo[], luFiles as LuFile[]);
expect(config.rootIds.length).toEqual(1);
expect(config.rootIds[0]).toEqual('main.en-us.lu');
expect(config.triggerRules['main.en-us.lu']['dia1.en-us.lu']).toEqual('dia1_trigger');
expect(config.triggerRules['dia1.en-us.lu']['dia3.en-us.lu']).toEqual('dia3_trigger');
expect(config.triggerRules['main.en-us.lu'].dia1_trigger).toEqual('dia1.en-us.lu');
expect(config.triggerRules['main.en-us.lu'].no_dialog).toEqual('');
expect(config.triggerRules['main.en-us.lu']['']).toEqual('start_dialog_without_intent.en-us.lu');
expect(config.triggerRules['main.en-us.lu'].dia1_trigger).toEqual('dia1.en-us.lu');
expect(config.triggerRules['main.en-us.lu'].dias_trigger.length).toBe(2);
expect(config.triggerRules['dia1.en-us.lu'].dia3_trigger).toEqual('dia3.en-us.lu');
expect(config.triggerRules['dia1.en-us.lu']['dia4.en-us.lu']).toBeUndefined();
});

Expand Down
2 changes: 1 addition & 1 deletion Composer/packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"@bfc/ui-plugin-select-skill-dialog": "*",
"@bfc/visual-designer": "*",
"@emotion/core": "^10.0.7",
"@microsoft/bf-lu": "^4.9.0-preview.121038",
"@microsoft/bf-lu": "4.9.0-preview.121555",
"@reach/router": "^1.2.1",
"@uifabric/fluent-theme": "^7.1.13",
"@uifabric/icons": "^7.3.4",
Expand Down
57 changes: 30 additions & 27 deletions Composer/packages/client/src/utils/luUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,14 @@ function addLocaleToConfig(config: ICrossTrainConfig, luFiles: LuFile[]) {
...fileNames.reduce((result, name) => {
const locale = getFileLocale(name);
const triggers = triggerRules[key];
keys(triggers).forEach(id => {
keys(triggers).forEach(trigger => {
if (!result[name]) result[name] = {};
result[name][`${id}.${locale}.lu`] = triggers[id];
const ids = triggers[trigger];
if (Array.isArray(ids)) {
result[name][trigger] = ids.map(id => (id ? `${id}.${locale}.lu` : id));
} else {
result[name][trigger] = ids ? `${ids}.${locale}.lu` : ids;
}
});
return result;
}, {}),
Expand All @@ -74,15 +79,15 @@ interface ICrossTrainConfig {
],
triggerRules: {
'main.en-us.lu': {
'dia1.en-us.lu': 'dia1_trigger',
'dia2.en-us.lu': 'dia2_trigger'
'dia1_trigger': 'dia1.en-us.lu',
'dia2_trigger': 'dia2.en-us.lu'
},
'dia2.en-us.lu': {
'dia3.en-us.lu': 'dia3_trigger',
'dia4.en-us.lu': 'dia4_trigger'
'dia3_trigger': 'dia3.en-us.lu',
'dia4_trigger': 'dia4.en-us.lu'
},
'main.fr-fr.lu': {
'dia1.fr-fr.lu': 'dia1_trigger'
'dia1_trigger': 'dia1.fr-fr.lu'
}
},
intentName: '_Interruption',
Expand All @@ -95,7 +100,7 @@ export function createCrossTrainConfig(dialogs: DialogInfo[], luFiles: LuFile[])

//map all referred lu files
luFiles.forEach(file => {
countMap[getBaseName(file.id)] = 0;
countMap[getBaseName(file.id)] = 1;
});

let rootId = '';
Expand All @@ -104,25 +109,23 @@ export function createCrossTrainConfig(dialogs: DialogInfo[], luFiles: LuFile[])

const { intentTriggers } = dialog;
const fileId = dialog.id;
if (intentTriggers.length) {
//find the trigger's dialog that use a recognizer
intentTriggers.forEach(item => {
const used = item.dialogs.filter(dialog => {
if (typeof countMap[dialog] === 'number') {
countMap[dialog]++;
return true;
}
return false;
});
if (used.length) {
const result = used.reduce((result, temp) => {
result[temp] = item.intent;
return result;
}, {});
triggerRules[fileId] = { ...triggerRules[fileId], ...result };
}
});
}
//find the trigger's dialog that use a recognizer
intentTriggers.forEach(item => {
//find all dialogs in trigger that has a luis recognizer
const used = item.dialogs.filter(dialog => !!countMap[dialog]);

const deduped = Array.from(new Set<string>(used));

const result = {};
if (deduped.length === 1) {
result[item.intent] = deduped[0];
} else if (deduped.length) {
result[item.intent] = deduped;
}

if (!item.dialogs.length) result[item.intent] = '';
triggerRules[fileId] = { ...triggerRules[fileId], ...result };
});
});

const crossTrainConfig: ICrossTrainConfig = {
Expand Down
4 changes: 2 additions & 2 deletions Composer/packages/lib/bot-deploy/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
"@azure/graph": "^5.0.1",
"@azure/ms-rest-browserauth": "^0.1.4",
"@azure/ms-rest-nodeauth": "^3.0.3",
"@microsoft/bf-lu": "^4.9.0-preview.121038",
"@microsoft/bf-luis-cli": "^4.9.0-preview.121038",
"@microsoft/bf-lu": "4.9.0-preview.121555",
"@microsoft/bf-luis-cli": "4.9.0-preview.121555",
"@types/archiver": "^3.1.0",
"@types/fs-extra": "^8.1.0",
"@types/request": "^2.48.4",
Expand Down
2 changes: 1 addition & 1 deletion Composer/packages/lib/indexers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
},
"dependencies": {
"@bfc/shared": "*",
"@microsoft/bf-lu": "^4.9.0-preview.121038",
"@microsoft/bf-lu": "4.9.0-preview.121555",
"adaptive-expressions": "^4.8.0-preview-110700",
"botbuilder-lg": "^4.9.0-preview-119754",
"lodash": "^4.17.15"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,42 +1,50 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import { SDKKinds, IIntentTrigger } from '@bfc/shared';
import { SDKKinds, IIntentTrigger, FieldNames } from '@bfc/shared';

import { VisitorFunc, JsonWalk } from '../utils/jsonWalk';

// find out all properties from given dialog
function ExtractIntentTriggers(value: any): IIntentTrigger[] {
const triggers: IIntentTrigger[] = [];
function ExtractAllBeginDialogs(value: any): string[] {
const dialogs: string[] = [];

const visitor: VisitorFunc = (path: string, value: any): boolean => {
if (value?.$kind === SDKKinds.OnIntent) {
if (value.intent) {
const dialogs: string[] = [];

const visitor: VisitorFunc = (path: string, value: any): boolean => {
if (value?.$kind === SDKKinds.BeginDialog) {
if (value.dialog) {
dialogs.push(value.dialog);
}
return true;
}
return false;
};
JsonWalk('$', value, visitor);
if (dialogs.length) {
triggers.push({
intent: value.intent,
dialogs,
});
}
}
if (value?.$kind === SDKKinds.BeginDialog && value?.dialog) {
dialogs.push(value.dialog);
return true;
}
return false;
};

JsonWalk('$', value, visitor);

return triggers;
return dialogs;
}

// find out all properties from given dialog
function ExtractIntentTriggers(value: any): IIntentTrigger[] {
const intentTriggers: IIntentTrigger[] = [];
const triggers = value?.[FieldNames.Events];

if (triggers && triggers.length) {
for (const trigger of triggers) {
const dialogs = ExtractAllBeginDialogs(trigger);

if (trigger.$kind === SDKKinds.OnIntent && trigger.intent && trigger.actions?.length) {
intentTriggers.push({ intent: trigger.intent, dialogs });
} else if (trigger.$kind !== SDKKinds.OnIntent && dialogs.length) {
const emptyIntent = intentTriggers.find(e => e.intent === '');
if (emptyIntent) {
//remove the duplication dialogs
const all = new Set<string>([...emptyIntent.dialogs, ...dialogs]);
emptyIntent.dialogs = Array.from(all);
} else {
intentTriggers.push({ intent: '', dialogs });
}
}
}
}

return intentTriggers;
}

export default ExtractIntentTriggers;
2 changes: 1 addition & 1 deletion Composer/packages/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"@bfc/lg-languageserver": "*",
"@bfc/lu-languageserver": "*",
"@bfc/shared": "*",
"@microsoft/bf-lu": "^4.9.0-preview.121038",
"@microsoft/bf-lu": "4.9.0-preview.121555",
"archiver": "^3.0.0",
"axios": "^0.18.0",
"azure-storage": "^2.10.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
},
"dependencies": {
"@microsoft/bf-cli-command": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/@microsoft/bf-cli-command/-/@microsoft/bf-cli-command-1.0.1.tgz",
"@microsoft/bf-lu": "4.9.0-preview.121038",
"@microsoft/bf-lu": "4.9.0-preview.121555",
"express": "^4.15.2",
"monaco-languageclient": "^0.10.0",
"normalize-url": "^2.0.1",
Expand Down
40 changes: 25 additions & 15 deletions Composer/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3330,10 +3330,9 @@
"@types/yargs" "^15.0.0"
chalk "^3.0.0"

"@microsoft/bf-cli-command@4.9.0-preview.121038":
version "4.9.0-preview.121038"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-cli-command/-/@microsoft/bf-cli-command-4.9.0-preview.121038.tgz#88ccaab82381cab1e4e9d3daaa1daa70538ec16b"
integrity sha1-iMyquCOByrHk6dPaqh2qcFOOwWs=
"@microsoft/bf-cli-command@4.9.0-preview.121555":
version "4.9.0-preview.121555"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-cli-command/-/@microsoft/bf-cli-command-4.9.0-preview.121555.tgz#5cab42704d346dcc0bcb6f0d997de1bc7e222fc7"
dependencies:
"@oclif/command" "~1.5.19"
"@oclif/config" "~1.13.3"
Expand All @@ -3359,10 +3358,10 @@
fs-extra "^7.0.1"
tslib "~1.10.0"

"@microsoft/bf-lu@4.9.0-preview.121038", "@microsoft/bf-lu@^4.9.0-preview.121038":
version "4.9.0-preview.121038"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-lu/-/@microsoft/bf-lu-4.9.0-preview.121038.tgz#9bdc967043c358f83c382cbb44cf509ea3884c92"
integrity sha1-m9yWcEPDWPg8OCy7RM9QnqOITJI=
"@microsoft/bf-lu@4.9.0-preview.121555":
version "4.9.0-preview.121555"
uid "3c9e4959c03117e1fea8360f78ae83022cb4751e"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-lu/-/@microsoft/bf-lu-4.9.0-preview.121555#3c9e4959c03117e1fea8360f78ae83022cb4751e"
dependencies:
"@azure/cognitiveservices-luis-authoring" "4.0.0-preview.1"
"@azure/ms-rest-azure-js" "2.0.1"
Expand All @@ -3383,16 +3382,15 @@
semver "^5.5.1"
tslib "^1.10.0"

"@microsoft/bf-luis-cli@^4.9.0-preview.121038":
version "4.9.0-preview.121038"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-luis-cli/-/@microsoft/bf-luis-cli-4.9.0-preview.121038.tgz#52a8cde2fee47aa3248b7682cca6760ce1ca729a"
integrity sha1-UqjN4v7keqMki3aCzKZ2DOHKcpo=
"@microsoft/bf-luis-cli@4.9.0-preview.121555":
version "4.9.0-preview.121555"
resolved "https://botbuilder.myget.org/F/botframework-cli/npm/@microsoft/bf-luis-cli/-/@microsoft/bf-luis-cli-4.9.0-preview.121555.tgz#a88c32a1d161e052987f7a165c8cba0b1b9012d7"
dependencies:
"@azure/cognitiveservices-luis-authoring" "4.0.0-preview.1"
"@azure/cognitiveservices-luis-runtime" "5.0.0"
"@azure/ms-rest-azure-js" "2.0.1"
"@microsoft/bf-cli-command" "4.9.0-preview.121038"
"@microsoft/bf-lu" "4.9.0-preview.121038"
"@microsoft/bf-cli-command" "4.9.0-preview.121555"
"@microsoft/bf-lu" "4.9.0-preview.121555"
"@oclif/command" "~1.5.19"
"@oclif/config" "~1.13.3"
"@oclif/errors" "~1.2.2"
Expand Down Expand Up @@ -3459,7 +3457,19 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"

"@oclif/command@^1.5.1", "@oclif/command@^1.5.13", "@oclif/command@~1.5.19":
"@oclif/command@^1.5.1":
version "1.5.20"
resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.20.tgz#bb0693586d7d66a457c49b719e394c02ff0169a7"
integrity sha512-lzst5RU/STfoutJJv4TLE/cm1WtW3xy6Aqvqy3r1lPsGdNifgbEq4dCOYyc/ZEuhV/IStQLDFTnAlqTdolkz1Q==
dependencies:
"@oclif/config" "^1"
"@oclif/errors" "^1.2.2"
"@oclif/parser" "^3.8.3"
"@oclif/plugin-help" "^2"
debug "^4.1.1"
semver "^5.6.0"

"@oclif/command@^1.5.13", "@oclif/command@~1.5.19":
version "1.5.19"
resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.19.tgz#13f472450eb83bd6c6871a164c03eadb5e1a07ed"
integrity sha512-6+iaCMh/JXJaB2QWikqvGE9//wLEVYYwZd5sud8aLoLKog1Q75naZh2vlGVtg5Mq/NqpqGQvdIjJb3Bm+64AUQ==
Expand Down