From b004f8b4b5c40489a88f6d1c88f9beec0b8f7d6f Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Mon, 19 Aug 2024 23:03:58 -0300 Subject: [PATCH] new(all): TRUE multicloud. --- packages/admin.gbapp/dialogs/AdminDialog.ts | 2 +- .../admin.gbapp/services/GBAdminService.ts | 4 +- packages/core.gbapp/dialogs/WelcomeDialog.ts | 6 +- .../core.gbapp/services/GBConfigService.ts | 11 +- packages/core.gbapp/services/GBCoreService.ts | 163 +++++++++++++----- packages/core.gbapp/services/GBDeployer.ts | 36 ++-- packages/core.gbapp/services/GBMinService.ts | 32 ++-- packages/core.gbapp/services/router/bridge.ts | 19 +- packages/default.gbapp.gbignore/.gitkeep | 0 packages/default.gbtest/first-test.xlsx | Bin 15604 -> 0 bytes packages/kb.gbapp/services/KBService.ts | 2 +- src/RootData.ts | 1 + src/app.ts | 57 +++--- src/util.ts | 7 +- .../default.gbdialog/bot.vbs.gbignore | 0 .../default.gbdialog/delivery.vbs.gbignore | 0 .../default.gbdialog/find-on-excel.vbs | 0 .../find-or-talk.vbs.gbignore | 0 .../default.gbdialog/get-payment.vbs.gbignore | 0 .../default.gbdialog/get-set-excel.vbs | 0 .../default.gbdialog/get-stock.vbs.gbignore | 0 .../default.gbdialog/http-get-and-post.vbs | 0 .../default.gbdialog/lab.vbs.gbignore | 0 .../save-on-excel.vbs.gbignore | 0 .../sys-bot-farm-creation.vbs.gbignore | 0 .../default.gbdialog/templates.vbs | 0 .../default.gbdialog/translator.gbignore | 0 .../default.gbai}/default.gbkb/draft.md | 0 .../default.gbai}/default.gbkb/package.json | 0 .../default.gbai}/default.gbkb/pages/about.md | 0 .../default.gbai}/default.gbkb/subjects.json | 0 .../default.gbkb/subjects/bots-ai.png | Bin .../default.gbkb/subjects/cortana.png | Bin .../default.gbkb/subjects/general-bots.png | Bin .../default.gbkb/subjects/msdynamics.png | Bin .../default.gbkb/subjects/msproject.png | Bin .../default.gbkb/subjects/office365.png | Bin .../default.gbkb/subjects/powerbi.png | Bin .../default.gbkb/subjects/produtividade.png | Bin .../default.gbkb/subjects/sharepoint.png | Bin .../default.gbkb/subjects/skype.png | Bin .../default.gbkb/subjects/sobre.png | Bin .../default.gbkb/tabular/common-goodbye.tsv | Bin .../default.gbkb/tabular/common-hello.tsv | Bin .../default.gbkb/tabular/common-persona.tsv | Bin .../default.gbkb/tabular/min.tsv | Bin .../default.gbkb/videos/placeholder | 0 .../default.gbai}/default.gbtheme/css/App.css | 0 .../default.gbtheme/css/ChatPane.css | 0 .../default.gbtheme/css/Content.css | 0 .../default.gbtheme/css/Footer.css | 0 .../default.gbtheme/css/GifPlayer.css | 0 .../default.gbtheme/css/MediaPlayer.css | 0 .../default.gbtheme/css/NavBar.css | 0 .../default.gbtheme/css/SideBarMenu.css | 0 .../default.gbtheme/css/index.css | 0 .../default.gbtheme/css/webchat-style.json | 0 .../default.gbtheme/images/bot-logo-chat.png | Bin .../default.gbtheme/images/bot-logo.png | Bin .../default.gbtheme/images/bot-tv-on.png | Bin .../default.gbtheme/images/bot-tv-on2.png | Bin .../default.gbtheme/images/bot-tv.png | Bin .../images/chat-background.png | Bin .../images/chat-header-logo.png | Bin .../default.gbtheme/images/chat-header.png | Bin .../images/general-bot-background.jpg | Bin .../images/logo-Pragmatismo.png | Bin .../default.gbtheme/images/logo.jpg | Bin .../default.gbtheme/images/logo.png | Bin .../images/pragmatismo-logo.png | Bin .../images/pragmatismo-powered-by.png | Bin .../images/projector-background.jpg | Bin .../default.gbtheme/images/projetor_tela.png | Bin .../default.gbtheme/images/screen.png | Bin .../default.gbtheme/images/tela-01.png | Bin .../default.gbtheme/package.json | 0 76 files changed, 219 insertions(+), 121 deletions(-) delete mode 100644 packages/default.gbapp.gbignore/.gitkeep delete mode 100644 packages/default.gbtest/first-test.xlsx rename {packages => templates/default.gbai}/default.gbdialog/bot.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/delivery.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/find-on-excel.vbs (100%) rename {packages => templates/default.gbai}/default.gbdialog/find-or-talk.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/get-payment.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/get-set-excel.vbs (100%) rename {packages => templates/default.gbai}/default.gbdialog/get-stock.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/http-get-and-post.vbs (100%) rename {packages => templates/default.gbai}/default.gbdialog/lab.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/save-on-excel.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/sys-bot-farm-creation.vbs.gbignore (100%) rename {packages => templates/default.gbai}/default.gbdialog/templates.vbs (100%) rename {packages => templates/default.gbai}/default.gbdialog/translator.gbignore (100%) rename {packages => templates/default.gbai}/default.gbkb/draft.md (100%) rename {packages => templates/default.gbai}/default.gbkb/package.json (100%) rename {packages => templates/default.gbai}/default.gbkb/pages/about.md (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects.json (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/bots-ai.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/cortana.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/general-bots.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/msdynamics.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/msproject.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/office365.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/powerbi.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/produtividade.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/sharepoint.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/skype.png (100%) rename {packages => templates/default.gbai}/default.gbkb/subjects/sobre.png (100%) rename {packages => templates/default.gbai}/default.gbkb/tabular/common-goodbye.tsv (100%) rename {packages => templates/default.gbai}/default.gbkb/tabular/common-hello.tsv (100%) rename {packages => templates/default.gbai}/default.gbkb/tabular/common-persona.tsv (100%) rename {packages => templates/default.gbai}/default.gbkb/tabular/min.tsv (100%) rename {packages => templates/default.gbai}/default.gbkb/videos/placeholder (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/App.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/ChatPane.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/Content.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/Footer.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/GifPlayer.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/MediaPlayer.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/NavBar.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/SideBarMenu.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/index.css (100%) rename {packages => templates/default.gbai}/default.gbtheme/css/webchat-style.json (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/bot-logo-chat.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/bot-logo.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/bot-tv-on.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/bot-tv-on2.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/bot-tv.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/chat-background.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/chat-header-logo.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/chat-header.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/general-bot-background.jpg (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/logo-Pragmatismo.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/logo.jpg (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/logo.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/pragmatismo-logo.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/pragmatismo-powered-by.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/projector-background.jpg (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/projetor_tela.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/screen.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/images/tela-01.png (100%) rename {packages => templates/default.gbai}/default.gbtheme/package.json (100%) diff --git a/packages/admin.gbapp/dialogs/AdminDialog.ts b/packages/admin.gbapp/dialogs/AdminDialog.ts index c396e864..5a9acdaa 100644 --- a/packages/admin.gbapp/dialogs/AdminDialog.ts +++ b/packages/admin.gbapp/dialogs/AdminDialog.ts @@ -313,7 +313,7 @@ export class AdminDialog extends IGBDialog { } if (packageName.indexOf('.') !== -1) { - cmd1 = `deployPackage ${process.env.STORAGE_SITE} /${process.env.STORAGE_LIBRARY}/${botId}.gbai/${packageName}`; + cmd1 = `deployPackage ${process.env.STORAGE_SITE} /${GBConfigService.get('STORAGE_LIBRARY')}/${botId}.gbai/${packageName}`; } else { cmd1 = `deployPackage ${packageName}`; } diff --git a/packages/admin.gbapp/services/GBAdminService.ts b/packages/admin.gbapp/services/GBAdminService.ts index 8a274194..2b56c82c 100644 --- a/packages/admin.gbapp/services/GBAdminService.ts +++ b/packages/admin.gbapp/services/GBAdminService.ts @@ -187,8 +187,8 @@ export class GBAdminService implements IGBAdminService { await deployer['cleanupPackage'](min.instance, packageName); } - if (process.env.STORAGE_FILE) { - const path = Path.join(process.env.STORAGE_LIBRARY, gbaiPath); + if (GBConfigService.get('STORAGE_FILE')) { + const path = Path.join(GBConfigService.get('STORAGE_LIBRARY'), gbaiPath); Fs.cpSync(path, localFolder, { errorOnExist: false, force: true, recursive: true}); } else { await deployer['downloadFolder'](min, Path.join('work', `${gbai}`), Path.basename(localFolder)); diff --git a/packages/core.gbapp/dialogs/WelcomeDialog.ts b/packages/core.gbapp/dialogs/WelcomeDialog.ts index d78c4752..ca9d7192 100644 --- a/packages/core.gbapp/dialogs/WelcomeDialog.ts +++ b/packages/core.gbapp/dialogs/WelcomeDialog.ts @@ -36,11 +36,11 @@ import { BotAdapter } from 'botbuilder'; import { WaterfallDialog } from 'botbuilder-dialogs'; -import { GBLog, GBMinInstance, IGBDialog } from 'botlib'; +import { GBMinInstance, IGBDialog } from 'botlib'; import { GBServer } from '../../../src/app.js'; -import { GBConversationalService } from '../services/GBConversationalService.js'; import { Messages } from '../strings.js'; import { GBLogEx } from '../services/GBLogEx.js'; +import { GBConfigService } from '../services/GBConfigService.js'; /** * Dialog for Welcoming people. @@ -65,7 +65,7 @@ export class WelcomeDialog extends IGBDialog { async step => { if ( GBServer.globals.entryPointDialog !== null && - min.instance.botId === process.env.BOT_ID && + min.instance.botId === GBConfigService.get('BOT_ID') && step.context.activity.channelId === 'webchat' ) { return step.replaceDialog(GBServer.globals.entryPointDialog); diff --git a/packages/core.gbapp/services/GBConfigService.ts b/packages/core.gbapp/services/GBConfigService.ts index ae1a570a..38984ad9 100644 --- a/packages/core.gbapp/services/GBConfigService.ts +++ b/packages/core.gbapp/services/GBConfigService.ts @@ -42,7 +42,7 @@ import * as en from 'dotenv-extended'; */ export class GBConfigService { public static getBoolean(value: string): boolean { - return (this.get(value) as unknown) as boolean; + return this.get(value) as unknown as boolean; } public static getServerPort(): string { if (process.env.PORT) { @@ -84,8 +84,11 @@ export class GBConfigService { case 'CLOUD_USERNAME': value = undefined; break; + case 'STORAGE_LIBRARY': + value = `${process.env.HOME}/gbpackages`; + break; case 'BOT_ID': - value = undefined; + value = 'default'; break; case 'CLOUD_PASSWORD': value = undefined; @@ -103,7 +106,7 @@ export class GBConfigService { value = undefined; break; case 'STORAGE_DIALECT': - value = undefined; + value = 'sqlite'; break; case 'STORAGE_FILE': value = './data.db'; @@ -160,7 +163,7 @@ export class GBConfigService { value = true; break; case 'BOT_URL': - value = undefined; + value = 'http://localhost:4242'; break; case 'STORAGE_SERVER': value = undefined; diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index f57f48b2..e7f07af4 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -50,6 +50,7 @@ import { GBSecurityPackage } from '../../security.gbapp/index.js'; import { GBWhatsappPackage } from '../../whatsapp.gblib/index.js'; import { GuaribasApplications, GuaribasInstance, GuaribasLog } from '../models/GBModel.js'; import { GBConfigService } from './GBConfigService.js'; +import mkdirp from 'mkdirp'; import { GBAzureDeployerPackage } from '../../azuredeployer.gbapp/index.js'; import { GBSharePointPackage } from '../../sharepoint.gblib/index.js'; import { CollectionUtil } from 'pragmatismo-io-framework'; @@ -109,7 +110,7 @@ export class GBCoreService implements IGBCoreService { constructor() { this.adminService = new GBAdminService(this); } - public async ensureInstances(instances: IGBInstance[], bootInstance: any, core: IGBCoreService) { } + public async ensureInstances(instances: IGBInstance[], bootInstance: any, core: IGBCoreService) {} /** * Gets database config and connect to storage. Currently two databases @@ -138,8 +139,8 @@ export class GBCoreService implements IGBCoreService { const logging: boolean | Function = GBConfigService.get('STORAGE_LOGGING') === 'true' ? (str: string): void => { - GBLogEx.info(0, str); - } + GBLogEx.info(0, str); + } : false; const encrypt: boolean = GBConfigService.get('STORAGE_ENCRYPT') === 'true'; @@ -231,7 +232,6 @@ export class GBCoreService implements IGBCoreService { return out; } - /** * Loads all items to start several listeners. */ @@ -426,12 +426,11 @@ ENDPOINT_UPDATE=true let instances: IGBInstance[]; try { instances = await core.loadInstances(); - const group = GBConfigService.get('CLOUD_GROUP')??GBConfigService.get('BOT_ID'); + const group = GBConfigService.get('CLOUD_GROUP') ?? GBConfigService.get('BOT_ID'); if (process.env.ENDPOINT_UPDATE === 'true') { await CollectionUtil.asyncForEach(instances, async instance => { GBLogEx.info(instance.instanceId, `Updating bot endpoint for ${instance.botId}...`); try { - await installationDeployer.updateBotProxy( instance.botId, group, @@ -459,7 +458,10 @@ ENDPOINT_UPDATE=true Try setting STORAGE_SYNC to true in .env file. Error: ${error.message}.` ); } else { - GBLogEx.info(0, `Storage is empty. After collecting storage structure from all .gbapps it will get synced.`); + GBLogEx.info( + 0, + `Storage is empty. After collecting storage structure from all .gbapps it will get synced.` + ); } } else { throw new Error(`Cannot connect to operating storage: ${error.message}.`); @@ -520,7 +522,6 @@ ENDPOINT_UPDATE=true } } - public async createBootInstance( core: GBCoreService, installationDeployer: IGBInstallationDeployer, @@ -529,9 +530,10 @@ ENDPOINT_UPDATE=true return await this.createBootInstanceEx( core, installationDeployer, - proxyAddress, null, - GBConfigService.get('FREE_TIER')); - + proxyAddress, + null, + GBConfigService.get('FREE_TIER') + ); } /** * Creates the first bot instance (boot instance) used to "boot" the server. @@ -548,8 +550,10 @@ ENDPOINT_UPDATE=true ) { GBLogEx.info(0, `Deploying cognitive infrastructure (on the cloud / on premises)...`); try { - const { instance, credentials, subscriptionId, installationDeployer } - = await StartDialog.createBaseInstance(deployer, freeTier); + const { instance, credentials, subscriptionId, installationDeployer } = await StartDialog.createBaseInstance( + deployer, + freeTier + ); installationDeployer['core'] = this; const changedInstance = await installationDeployer['deployFarm2']( proxyAddress, @@ -668,27 +672,26 @@ ENDPOINT_UPDATE=true } public async setConfig(min, name: string, value: any): Promise { - // Handles calls for BASIC persistence on sheet files. - GBLog.info( `Defining Config.xlsx variable ${name}= '${value}'...`); + GBLog.info(`Defining Config.xlsx variable ${name}= '${value}'...`); let { baseUrl, client } = await GBDeployer.internalGetDriveClient(min); const maxLines = 512; - const file = "Config.xlsx"; - const path = DialogKeywords.getGBAIPath(min.botId, `gbot`);; + const file = 'Config.xlsx'; + const path = DialogKeywords.getGBAIPath(min.botId, `gbot`); - let document = await (new SystemKeywords()).internalGetDocument(client, baseUrl, path, file); + let document = await new SystemKeywords().internalGetDocument(client, baseUrl, path, file); - // Creates workbook session that will be discarded. + // Creates book session that will be discarded. - let sheets = await client - .api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets`) - .get(); + let sheets = await client.api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets`).get(); let results = await client - .api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='A1:A${maxLines}')`) + .api( + `${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='A1:A${maxLines}')` + ) .get(); const rows = results.text; @@ -708,12 +711,12 @@ ENDPOINT_UPDATE=true body.values[0][0] = value; await client - .api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='${address}')`) + .api( + `${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='${address}')` + ) .patch(body); } - - /** * Get a dynamic param from instance. Dynamic params are defined in Config.xlsx * and loaded into the work folder from comida command. @@ -729,8 +732,7 @@ ENDPOINT_UPDATE=true // Gets .gbot Params from specified bot. if (instance.params) { - - params = typeof (instance.params) === 'object' ? instance.params : JSON.parse(instance.params); + params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params); params = GBUtil.caseInsensitive(params); value = params ? params[name] : defaultValue; } @@ -740,7 +742,6 @@ ENDPOINT_UPDATE=true params = GBUtil.caseInsensitive(instance['dataValues']); if (params && !value) { - // Retrieves the value from specified bot instance (no params collection). value = instance['dataValues'][name]; @@ -749,30 +750,26 @@ ENDPOINT_UPDATE=true const minBoot = GBServer.globals.minBoot as any; - if ( - minBoot.instance && - !value && instance.botId != minBoot.instance.botId) { - + if (minBoot.instance && !value && instance.botId != minBoot.instance.botId) { instance = minBoot.instance; - - if(instance.params){ - params = typeof (instance.params) === 'object' ? instance.params : JSON.parse(instance.params); + + if (instance.params) { + params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params); params = GBUtil.caseInsensitive(params); value = params ? params[name] : defaultValue; } // If still did not found in boot bot params, try instance fields. - if (!value){ + if (!value) { value = instance['dataValues'][name]; } - if (!value){ + if (!value) { value = instance[name]; } - } } - + if (value === undefined) { value = null; } @@ -786,9 +783,9 @@ ENDPOINT_UPDATE=true if (value && typeof defaultValue === 'number') { return new Number(value ? value : defaultValue ? defaultValue : 0).valueOf(); } - - const ret = value ?? defaultValue; - return ret; + + const ret = value ?? defaultValue; + return ret; } /** @@ -798,7 +795,7 @@ ENDPOINT_UPDATE=true let params = null; const list = []; if (instance.params) { - params = typeof (instance.params) === 'object' ? instance.params : JSON.parse(instance.params); + params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params); } Object.keys(params).forEach(e => { @@ -810,5 +807,83 @@ ENDPOINT_UPDATE=true return list; } + public async ensureFolders(instances, deployer: GBDeployer) { + let libraryPath = GBConfigService.get('STORAGE_LIBRARY'); + if (!Fs.existsSync(libraryPath)) { + mkdirp.sync(libraryPath); + } + + + + await this.syncBotStorage(instances, 'default', deployer, libraryPath); + + const files = Fs.readdirSync(libraryPath); + await CollectionUtil.asyncForEach(files, async file => { + + if (file.trim().toLowerCase() !== 'default.gbai'){ + + let botId = file.replace(/\.gbai/, ''); + + await this.syncBotStorage(instances, botId, deployer, libraryPath); + } + }); + } + + private async syncBotStorage(instances: any, botId: any, deployer: GBDeployer, libraryPath: string) { + let instance = instances.find(p => p.botId.toLowerCase().trim() === botId.toLowerCase().trim()); + + if (!instance) { + + GBLog.info(`Importing package ${botId}...`); + + // Creates a bot. + + let mobile = null, + email = null; + + instance = await deployer.deployBlankBot(botId, mobile, email); + const gbaiPath = Path.join(libraryPath, `${botId}.gbai`); + + if (!Fs.existsSync(gbaiPath)) { + + Fs.mkdirSync(gbaiPath, { recursive: true }); + + const base = Path.join(process.env.PWD, 'templates', 'default.gbai'); + + Fs.cpSync(Path.join(base, `default.gbkb`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + Fs.cpSync(Path.join(base, `default.gbot`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + Fs.cpSync(Path.join(base, `default.gbtheme`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + Fs.cpSync(Path.join(base, `default.gbdata`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + Fs.cpSync(Path.join(base, `default.gbdialog`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + Fs.cpSync(Path.join(base, `default.gbdrive`), gbaiPath, { + errorOnExist: false, + force: true, + recursive: true + }); + + + } + } + } } diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index c1ac2a58..ca77d4ab 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -120,7 +120,7 @@ export class GBDeployer implements IGBDeployer { ); const siteId = process.env.STORAGE_SITE_ID; - const libraryId = process.env.STORAGE_LIBRARY; + const libraryId = GBConfigService.get('STORAGE_LIBRARY'); const client = MicrosoftGraph.Client.init({ authProvider: done => { @@ -222,22 +222,24 @@ export class GBDeployer implements IGBDeployer { const instance = await this.importer.createBotInstance(botId); const bootInstance = GBServer.globals.bootInstance; - // Gets the access token to perform service operations. + if (!GBConfigService.get('STORAGE_FILE')) { + // Gets the access token to perform service operations. - const accessToken = await (GBServer.globals.minBoot.adminService as any)['acquireElevatedToken']( - bootInstance.instanceId, - true - ); + const accessToken = await (GBServer.globals.minBoot.adminService as any)['acquireElevatedToken']( + bootInstance.instanceId, + true + ); - // Creates the MSFT application that will be associated to the bot. + // Creates the MSFT application that will be associated to the bot. - const service = await AzureDeployerService.createInstance(this); - const application = await service.createApplication(accessToken, botId); + const service = await AzureDeployerService.createInstance(this); + const application = await service.createApplication(accessToken, botId); + // Fills new instance base information and get App secret. - // Fills new instance base information and get App secret. + instance.marketplaceId = (application as any).appId; + instance.marketplacePassword = await service.createApplicationSecret(accessToken, (application as any).id); + } - instance.marketplaceId = (application as any).appId; - instance.marketplacePassword = await service.createApplicationSecret(accessToken, (application as any).id); instance.adminPass = GBAdminService.getRndPassword(); instance.title = botId; instance.activationCode = instance.botId.substring(0, 15); @@ -249,10 +251,12 @@ export class GBDeployer implements IGBDeployer { // Saves bot information to the store. await this.core.saveInstance(instance); - + if (!GBConfigService.get('STORAGE_FILE')) { + await this.deployBotOnAzure(instance, GBServer.globals.publicAddress); + } // Creates remaining objects on the cloud and updates instance information. - return await this.deployBotFull(instance, GBServer.globals.publicAddress); + return instance; } /** @@ -267,7 +271,7 @@ export class GBDeployer implements IGBDeployer { /** * Performs all tasks of deploying a new bot on the cloud. */ - public async deployBotFull(instance: IGBInstance, publicAddress: string): Promise { + public async deployBotOnAzure(instance: IGBInstance, publicAddress: string): Promise { // Reads base configuration from environent file. const service = await AzureDeployerService.createInstance(this); @@ -411,7 +415,7 @@ export class GBDeployer implements IGBDeployer { public async deployBotFromLocalPath(localPath: string, publicAddress: string): Promise { const packageName = Path.basename(localPath); const instance = await this.importer.importIfNotExistsBotPackage(undefined, packageName, localPath); - await this.deployBotFull(instance, publicAddress); + await this.deployBotOnAzure(instance, publicAddress); } /** diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 78556c36..07427417 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -42,10 +42,11 @@ import { FacebookAdapter } from 'botbuilder-adapter-facebook'; import mkdirp from 'mkdirp'; import Fs from 'fs'; import arrayBufferToBuffer from 'arraybuffer-to-buffer'; -import { v2 as webdav } from 'webdav-server'; import { NlpManager } from 'node-nlp'; import Koa from 'koa'; +import { v2 as webdav } from 'webdav-server'; import { createRpcServer } from '@push-rpc/core'; +import { start as startRouter } from '../../../packages/core.gbapp/services/router/bridge.js'; import wash from 'washyourmouthoutwithsoap'; import { AutoSaveStateMiddleware, @@ -172,6 +173,9 @@ export class GBMinService { await CollectionUtil.asyncForEach( instances, (async instance => { + + startRouter(GBServer.globals.server, instance.botId); + try { GBLog.info(`Mounting ${instance.botId}...`); await this['mountBot'](instance); @@ -256,7 +260,7 @@ export class GBMinService { // Serves individual URL for each bot conversational interface. - await this.deployer['deployPackage2'](min, user, 'packages/default.gbtheme'); + await this.deployer['deployPackage2'](min, user, 'templates/default.gbai/default.gbtheme'); // Install per bot deployed packages. @@ -280,7 +284,7 @@ export class GBMinService { const gbai = DialogKeywords.getGBAIPath(min.botId); let dir = `work/${gbai}/cache`; const botId = gbai.replace(/\.[^/.]+$/, ''); - + if (!Fs.existsSync(dir)) { mkdirp.sync(dir); } @@ -317,12 +321,12 @@ export class GBMinService { mkdirp.sync(dir); } - if (process.env.STORAGE_FILE) { - dir = Path.join(process.env.STORAGE_LIBRARY, 'work', gbai); + if (GBConfigService.get('STORAGE_FILE')) { + dir = Path.join(GBConfigService.get('STORAGE_LIBRARY'), 'work', gbai); - const server = new webdav.WebDAVServer(); + const server = GBServer.globals.webDavServer; server.setFileSystem(`/${botId}`, new webdav.PhysicalFileSystem(dir), success => { - server.start(() => console.log('WEBDAV READY')); + GBLogEx.info(1, `WebDav for ${botId} loaded.`); }); } // Loads Named Entity data for this bot. @@ -691,8 +695,8 @@ export class GBMinService { color2: this.core.getParam(instance, 'Color2', null) }; - if (process.env.STORAGE_FILE) { - config['domain'] = `http://localhost:${process.env.PORT}/directline`; + if (GBConfigService.get('STORAGE_FILE')) { + config['domain'] = `http://localhost:${process.env.PORT}/directline/${botId}`; } else { const webchatTokenContainer = await this.getWebchatToken(instance); config['conversationId']= webchatTokenContainer.conversationId, @@ -763,7 +767,7 @@ export class GBMinService { ? instance.marketplacePassword : GBConfigService.get('MARKETPLACE_SECRET') }; - if (process.env.STORAGE_FILE) { + if (GBConfigService.get('STORAGE_FILE')) { config['clientOptions'] = { baseUri: `http://localhost:${process.env.PORT}` }; } @@ -830,8 +834,6 @@ export class GBMinService { let url = `/api/messages/${instance.botId}`; GBServer.globals.server.post(url, receiver); - url = `/api/messages`; - GBServer.globals.server.post(url, receiver); // NLP Manager. @@ -843,6 +845,10 @@ export class GBMinService { GBServer.globals.minBoot.instance.marketplaceId = GBConfigService.get('MARKETPLACE_ID'); GBServer.globals.minBoot.instance.marketplacePassword = GBConfigService.get('MARKETPLACE_SECRET'); } + else{ + url = `/api/messages`; + GBServer.globals.server.post(url, receiver); + } if (min.instance.facebookWorkplaceVerifyToken) { min['fbAdapter'] = new FacebookAdapter({ @@ -1192,7 +1198,7 @@ export class GBMinService { }; try { - if (process.env.STORAGE_FILE) { + if (GBConfigService.get('STORAGE_FILE')) { const context = adapter['createContext'](req); context['_activity'] = context.activity.body; await handler(context); diff --git a/packages/core.gbapp/services/router/bridge.ts b/packages/core.gbapp/services/router/bridge.ts index 25ed4d34..2ea9e713 100644 --- a/packages/core.gbapp/services/router/bridge.ts +++ b/packages/core.gbapp/services/router/bridge.ts @@ -11,7 +11,7 @@ const conversationsCleanupInterval = 10000; const conversations: { [key: string]: IConversation } = {}; const botDataStore: { [key: string]: IBotData } = {}; -export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRequired = true): express.Router => { +export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRequired = true, botId): express.Router => { const router = express.Router(); router.use(bodyParser.json()); // for parsing application/json @@ -22,8 +22,9 @@ export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRe res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization, x-ms-bot-agent'); next(); }); + // CLIENT ENDPOINT - router.options('/directline', (req, res) => { + router.options(`/directline/${botId}/`, (req, res) => { res.status(200).end(); }); @@ -53,7 +54,7 @@ export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRe }; router.post('/v3/directline/conversations',reqs ); - router.post('/directline/conversations',reqs ); + router.post(`/directline/${botId}/conversations`,reqs ); // Reconnect API router.get('/v3/directline/conversations/:conversationId', (req, res) => { @@ -69,7 +70,7 @@ export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRe }); // Gets activities from store (local history array for now) - router.get('/directline/conversations/:conversationId/activities', (req, res) => { + router.get(`/directline/${botId}/conversations/:conversationId/activities`, (req, res) => { const watermark = req.query.watermark && req.query.watermark !== 'null' ? Number(req.query.watermark) : 0; const conversation = getConversation(req.params.conversationId, conversationInitRequired); @@ -95,7 +96,7 @@ export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRe }); // Sends message to bot. Assumes message activities - router.post('/directline/conversations/:conversationId/activities', (req, res) => { + router.post(`/directline/${botId}/conversations/:conversationId/activities`, (req, res) => { const incomingActivity = req.body; // Make copy of activity. Add required fields const activity = createMessageActivity(incomingActivity, serviceUrl, req.params.conversationId); @@ -209,11 +210,11 @@ export const getRouter = (serviceUrl: string, botUrl: string, conversationInitRe * @param conversationInitRequired Requires that a conversation is initialized before it is accessed, returning a 400 * when not the case. If set to false, a new conversation reference is created on the fly. This is true by default. */ -export const initializeRoutes = (app: express.Express, port: number, botUrl: string, conversationInitRequired = true) => { +export const initializeRoutes = (app: express.Express, port: number, botUrl: string, conversationInitRequired = true, botId) => { conversationsCleanup(); const directLineEndpoint = `http://127.0.0.1:${port}`; - const router = getRouter(directLineEndpoint, botUrl, conversationInitRequired); + const router = getRouter(directLineEndpoint, botUrl, conversationInitRequired, botId); app.use(router); console.log(`Routing messages to bot on ${botUrl}`); @@ -272,9 +273,9 @@ const setPrivateConversationData = (req: express.Request, res: express.Response) res.status(200).send(setBotData(req.params.channelId, req.params.conversationId, req.params.userId, req.body)); }; -export const start = (server)=>{ +export const start = (server, botId)=>{ - initializeRoutes(server, Number(process.env.PORT), `http://127.0.0.1:${process.env.PORT}/api/messages`); + initializeRoutes(server, Number(process.env.PORT), `http://127.0.0.1:${process.env.PORT}/api/messages/${botId}`, null, botId); } const deleteStateForUser = (req: express.Request, res: express.Response) => { diff --git a/packages/default.gbapp.gbignore/.gitkeep b/packages/default.gbapp.gbignore/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/default.gbtest/first-test.xlsx b/packages/default.gbtest/first-test.xlsx deleted file mode 100644 index a6bad648974205b6aa8bcb1d062257f544ba4b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15604 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 diff --git a/packages/kb.gbapp/services/KBService.ts b/packages/kb.gbapp/services/KBService.ts index 7829c3f2..32861cbc 100644 --- a/packages/kb.gbapp/services/KBService.ts +++ b/packages/kb.gbapp/services/KBService.ts @@ -1370,7 +1370,7 @@ export class KBService implements IGBKBService { await this.importKbPackage(min, localPath, p, instance); GBDeployer.mountGBKBAssets(packageName, min.botId, localPath); - if (!process.env.STORAGE_FILE) { + if (!GBConfigService.get('STORAGE_FILE')) { const service = await AzureDeployerService.createInstance(deployer); const searchIndex = instance.searchIndex ? instance.searchIndex : GBServer.globals.minBoot.instance.searchIndex; await deployer.rebuildIndex(instance, service.getKBSearchSchema(searchIndex)); diff --git a/src/RootData.ts b/src/RootData.ts index 62e676ad..c026333f 100644 --- a/src/RootData.ts +++ b/src/RootData.ts @@ -65,4 +65,5 @@ export class RootData { public dbg; public img; indexSemaphore: any; + public webDavServer; } diff --git a/src/app.ts b/src/app.ts index 8806eb3a..1c2c3773 100644 --- a/src/app.ts +++ b/src/app.ts @@ -40,8 +40,7 @@ import bodyParser from 'body-parser'; import { GBLog, GBMinInstance, IGBCoreService, IGBInstance } from 'botlib'; import child_process from 'child_process'; import express from 'express'; -import {start as startRouter} from '../packages/core.gbapp/services/router/bridge.js' - +import { v2 as webdav } from 'webdav-server'; import fs from 'fs'; import http from 'http'; import httpProxy from 'http-proxy'; @@ -89,7 +88,7 @@ export class GBServer { const server = express(); this.initEndpointsDocs(server); - startRouter(server); + GBServer.globals.server = server; GBServer.globals.httpsServer = null; @@ -105,6 +104,8 @@ export class GBServer { GBServer.globals.debuggers = []; GBServer.globals.users = []; GBServer.globals.indexSemaphore = new Mutex(); + GBServer.globals.webDavServer = new webdav.WebDAVServer(); + GBServer.globals.webDavServer.start(); server.use(bodyParser.json()); server.use(bodyParser.json({ limit: '1mb' })); @@ -121,7 +122,10 @@ export class GBServer { }); process.on('uncaughtException', (err, p) => { - GBLogEx.error(0, `GBEXCEPTION: ${GBUtil.toYAML(JSON.parse(JSON.stringify(err, Object.getOwnPropertyNames(err))))}`); + GBLogEx.error( + 0, + `GBEXCEPTION: ${GBUtil.toYAML(JSON.parse(JSON.stringify(err, Object.getOwnPropertyNames(err))))}` + ); }); process.on('unhandledRejection', (err, p) => { @@ -134,7 +138,10 @@ export class GBServer { } if (!bypass) { - GBLogEx.error(0,`GBREJECTION: ${GBUtil.toYAML(JSON.parse(JSON.stringify(err, Object.getOwnPropertyNames(err))))}`); + GBLogEx.error( + 0, + `GBREJECTION: ${GBUtil.toYAML(JSON.parse(JSON.stringify(err, Object.getOwnPropertyNames(err))))}` + ); } }); @@ -150,7 +157,7 @@ export class GBServer { (async () => { try { GBLogEx.info(0, `Now accepting connections on ${port}...`); - + process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; // Reads basic configuration, initialize minimal services. @@ -186,7 +193,6 @@ export class GBServer { } else if (GBConfigService.get('STORAGE_FILE')) { await core.initStorage(); } else { - runOnce = true; [GBServer.globals.bootInstance, azureDeployer] = await core['createBootInstanceEx']( core, null, @@ -194,6 +200,7 @@ export class GBServer { deployer, GBConfigService.get('FREE_TIER') ); + await core.saveInstance(GBServer.globals.bootInstance); } core.ensureAdminIsSecured(); @@ -207,10 +214,6 @@ export class GBServer { await deployer.deployPackages(core, server, GBServer.globals.appPackages); await core.syncDatabaseStructure(); - if (runOnce) { - await core.saveInstance(GBServer.globals.bootInstance); - } - // Deployment of local applications for the first time. if (GBConfigService.get('DISABLE_WEB') !== 'true') { @@ -224,23 +227,27 @@ export class GBServer { GBServer.globals.publicAddress ); - if (instances.length === 0) { - const instance = await importer.importIfNotExistsBotPackage( - GBConfigService.get('BOT_ID'), - 'boot.gbot', - 'packages/boot.gbot', - GBServer.globals.bootInstance - ); + if (instances. length === 0) { + if (!GBConfigService.get('STORAGE_FILE')) { + const instance = await importer.importIfNotExistsBotPackage( + GBConfigService.get('BOT_ID'), + 'boot.gbot', + 'packages/boot.gbot', + GBServer.globals.bootInstance + ); - instances.push(instance); - GBServer.globals.minBoot.instance = instances[0]; - GBServer.globals.bootInstance = instances[0]; - await deployer.deployBotFull(instance, GBServer.globals.publicAddress); + instances.push(instance); + GBServer.globals.minBoot.instance = instances[0]; + GBServer.globals.bootInstance = instances[0]; + await deployer.deployBotOnAzure(instance, GBServer.globals.publicAddress); - // Runs the search even with empty content to create structure. + // Runs the search even with empty content to create structure. - await azureDeployer['runSearch'](instance); + await azureDeployer['runSearch'](instance); + } } + + await core['ensureFolders'](instances, deployer); GBServer.globals.bootInstance = instances[0]; @@ -251,7 +258,7 @@ export class GBServer { const minService: GBMinService = new GBMinService(core, conversationalService, adminService, deployer); GBServer.globals.minService = minService; await minService.buildMin(instances); - + server.all('*', async (req, res, next) => { const host = req.headers.host; diff --git a/src/util.ts b/src/util.ts index fb123469..96fcf256 100644 --- a/src/util.ts +++ b/src/util.ts @@ -36,6 +36,7 @@ import * as YAML from 'yaml'; import SwaggerClient from 'swagger-client'; import Fs from 'fs'; +import { GBConfigService } from '../packages/core.gbapp/services/GBConfigService.js'; export class GBUtil { public static repeat(chr, count) { @@ -69,14 +70,14 @@ export class GBUtil { public static async getDirectLineClient(min) { let config = { - url: `http://127.0.0.1:${process.env.port}/api/messages`, + url: `http://127.0.0.1:${GBConfigService.get('PORT')}/api/messages`, spec: JSON.parse(Fs.readFileSync('directline-3.0.json', 'utf8')), requestInterceptor: req => { req.headers['Authorization'] = `Bearer ${min.instance.webchatKey}`; } }; - if (process.env.STORAGE_FILE) { - config['spec'].servers = [{ url: `http://127.0.0.1:${process.env.PORT}/api/messages` }]; + if (GBConfigService.get('STORAGE_FILE')) { + config['spec'].servers = [{ url: `http://127.0.0.1:${GBConfigService.get('PORT')}/api/messages` }]; config['openapi'] = '3.0.0'; } return await new SwaggerClient(config); diff --git a/packages/default.gbdialog/bot.vbs.gbignore b/templates/default.gbai/default.gbdialog/bot.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/bot.vbs.gbignore rename to templates/default.gbai/default.gbdialog/bot.vbs.gbignore diff --git a/packages/default.gbdialog/delivery.vbs.gbignore b/templates/default.gbai/default.gbdialog/delivery.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/delivery.vbs.gbignore rename to templates/default.gbai/default.gbdialog/delivery.vbs.gbignore diff --git a/packages/default.gbdialog/find-on-excel.vbs b/templates/default.gbai/default.gbdialog/find-on-excel.vbs similarity index 100% rename from packages/default.gbdialog/find-on-excel.vbs rename to templates/default.gbai/default.gbdialog/find-on-excel.vbs diff --git a/packages/default.gbdialog/find-or-talk.vbs.gbignore b/templates/default.gbai/default.gbdialog/find-or-talk.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/find-or-talk.vbs.gbignore rename to templates/default.gbai/default.gbdialog/find-or-talk.vbs.gbignore diff --git a/packages/default.gbdialog/get-payment.vbs.gbignore b/templates/default.gbai/default.gbdialog/get-payment.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/get-payment.vbs.gbignore rename to templates/default.gbai/default.gbdialog/get-payment.vbs.gbignore diff --git a/packages/default.gbdialog/get-set-excel.vbs b/templates/default.gbai/default.gbdialog/get-set-excel.vbs similarity index 100% rename from packages/default.gbdialog/get-set-excel.vbs rename to templates/default.gbai/default.gbdialog/get-set-excel.vbs diff --git a/packages/default.gbdialog/get-stock.vbs.gbignore b/templates/default.gbai/default.gbdialog/get-stock.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/get-stock.vbs.gbignore rename to templates/default.gbai/default.gbdialog/get-stock.vbs.gbignore diff --git a/packages/default.gbdialog/http-get-and-post.vbs b/templates/default.gbai/default.gbdialog/http-get-and-post.vbs similarity index 100% rename from packages/default.gbdialog/http-get-and-post.vbs rename to templates/default.gbai/default.gbdialog/http-get-and-post.vbs diff --git a/packages/default.gbdialog/lab.vbs.gbignore b/templates/default.gbai/default.gbdialog/lab.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/lab.vbs.gbignore rename to templates/default.gbai/default.gbdialog/lab.vbs.gbignore diff --git a/packages/default.gbdialog/save-on-excel.vbs.gbignore b/templates/default.gbai/default.gbdialog/save-on-excel.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/save-on-excel.vbs.gbignore rename to templates/default.gbai/default.gbdialog/save-on-excel.vbs.gbignore diff --git a/packages/default.gbdialog/sys-bot-farm-creation.vbs.gbignore b/templates/default.gbai/default.gbdialog/sys-bot-farm-creation.vbs.gbignore similarity index 100% rename from packages/default.gbdialog/sys-bot-farm-creation.vbs.gbignore rename to templates/default.gbai/default.gbdialog/sys-bot-farm-creation.vbs.gbignore diff --git a/packages/default.gbdialog/templates.vbs b/templates/default.gbai/default.gbdialog/templates.vbs similarity index 100% rename from packages/default.gbdialog/templates.vbs rename to templates/default.gbai/default.gbdialog/templates.vbs diff --git a/packages/default.gbdialog/translator.gbignore b/templates/default.gbai/default.gbdialog/translator.gbignore similarity index 100% rename from packages/default.gbdialog/translator.gbignore rename to templates/default.gbai/default.gbdialog/translator.gbignore diff --git a/packages/default.gbkb/draft.md b/templates/default.gbai/default.gbkb/draft.md similarity index 100% rename from packages/default.gbkb/draft.md rename to templates/default.gbai/default.gbkb/draft.md diff --git a/packages/default.gbkb/package.json b/templates/default.gbai/default.gbkb/package.json similarity index 100% rename from packages/default.gbkb/package.json rename to templates/default.gbai/default.gbkb/package.json diff --git a/packages/default.gbkb/pages/about.md b/templates/default.gbai/default.gbkb/pages/about.md similarity index 100% rename from packages/default.gbkb/pages/about.md rename to templates/default.gbai/default.gbkb/pages/about.md diff --git a/packages/default.gbkb/subjects.json b/templates/default.gbai/default.gbkb/subjects.json similarity index 100% rename from packages/default.gbkb/subjects.json rename to templates/default.gbai/default.gbkb/subjects.json diff --git a/packages/default.gbkb/subjects/bots-ai.png b/templates/default.gbai/default.gbkb/subjects/bots-ai.png similarity index 100% rename from packages/default.gbkb/subjects/bots-ai.png rename to templates/default.gbai/default.gbkb/subjects/bots-ai.png diff --git a/packages/default.gbkb/subjects/cortana.png b/templates/default.gbai/default.gbkb/subjects/cortana.png similarity index 100% rename from packages/default.gbkb/subjects/cortana.png rename to templates/default.gbai/default.gbkb/subjects/cortana.png diff --git a/packages/default.gbkb/subjects/general-bots.png b/templates/default.gbai/default.gbkb/subjects/general-bots.png similarity index 100% rename from packages/default.gbkb/subjects/general-bots.png rename to templates/default.gbai/default.gbkb/subjects/general-bots.png diff --git a/packages/default.gbkb/subjects/msdynamics.png b/templates/default.gbai/default.gbkb/subjects/msdynamics.png similarity index 100% rename from packages/default.gbkb/subjects/msdynamics.png rename to templates/default.gbai/default.gbkb/subjects/msdynamics.png diff --git a/packages/default.gbkb/subjects/msproject.png b/templates/default.gbai/default.gbkb/subjects/msproject.png similarity index 100% rename from packages/default.gbkb/subjects/msproject.png rename to templates/default.gbai/default.gbkb/subjects/msproject.png diff --git a/packages/default.gbkb/subjects/office365.png b/templates/default.gbai/default.gbkb/subjects/office365.png similarity index 100% rename from packages/default.gbkb/subjects/office365.png rename to templates/default.gbai/default.gbkb/subjects/office365.png diff --git a/packages/default.gbkb/subjects/powerbi.png b/templates/default.gbai/default.gbkb/subjects/powerbi.png similarity index 100% rename from packages/default.gbkb/subjects/powerbi.png rename to templates/default.gbai/default.gbkb/subjects/powerbi.png diff --git a/packages/default.gbkb/subjects/produtividade.png b/templates/default.gbai/default.gbkb/subjects/produtividade.png similarity index 100% rename from packages/default.gbkb/subjects/produtividade.png rename to templates/default.gbai/default.gbkb/subjects/produtividade.png diff --git a/packages/default.gbkb/subjects/sharepoint.png b/templates/default.gbai/default.gbkb/subjects/sharepoint.png similarity index 100% rename from packages/default.gbkb/subjects/sharepoint.png rename to templates/default.gbai/default.gbkb/subjects/sharepoint.png diff --git a/packages/default.gbkb/subjects/skype.png b/templates/default.gbai/default.gbkb/subjects/skype.png similarity index 100% rename from packages/default.gbkb/subjects/skype.png rename to templates/default.gbai/default.gbkb/subjects/skype.png diff --git a/packages/default.gbkb/subjects/sobre.png b/templates/default.gbai/default.gbkb/subjects/sobre.png similarity index 100% rename from packages/default.gbkb/subjects/sobre.png rename to templates/default.gbai/default.gbkb/subjects/sobre.png diff --git a/packages/default.gbkb/tabular/common-goodbye.tsv b/templates/default.gbai/default.gbkb/tabular/common-goodbye.tsv similarity index 100% rename from packages/default.gbkb/tabular/common-goodbye.tsv rename to templates/default.gbai/default.gbkb/tabular/common-goodbye.tsv diff --git a/packages/default.gbkb/tabular/common-hello.tsv b/templates/default.gbai/default.gbkb/tabular/common-hello.tsv similarity index 100% rename from packages/default.gbkb/tabular/common-hello.tsv rename to templates/default.gbai/default.gbkb/tabular/common-hello.tsv diff --git a/packages/default.gbkb/tabular/common-persona.tsv b/templates/default.gbai/default.gbkb/tabular/common-persona.tsv similarity index 100% rename from packages/default.gbkb/tabular/common-persona.tsv rename to templates/default.gbai/default.gbkb/tabular/common-persona.tsv diff --git a/packages/default.gbkb/tabular/min.tsv b/templates/default.gbai/default.gbkb/tabular/min.tsv similarity index 100% rename from packages/default.gbkb/tabular/min.tsv rename to templates/default.gbai/default.gbkb/tabular/min.tsv diff --git a/packages/default.gbkb/videos/placeholder b/templates/default.gbai/default.gbkb/videos/placeholder similarity index 100% rename from packages/default.gbkb/videos/placeholder rename to templates/default.gbai/default.gbkb/videos/placeholder diff --git a/packages/default.gbtheme/css/App.css b/templates/default.gbai/default.gbtheme/css/App.css similarity index 100% rename from packages/default.gbtheme/css/App.css rename to templates/default.gbai/default.gbtheme/css/App.css diff --git a/packages/default.gbtheme/css/ChatPane.css b/templates/default.gbai/default.gbtheme/css/ChatPane.css similarity index 100% rename from packages/default.gbtheme/css/ChatPane.css rename to templates/default.gbai/default.gbtheme/css/ChatPane.css diff --git a/packages/default.gbtheme/css/Content.css b/templates/default.gbai/default.gbtheme/css/Content.css similarity index 100% rename from packages/default.gbtheme/css/Content.css rename to templates/default.gbai/default.gbtheme/css/Content.css diff --git a/packages/default.gbtheme/css/Footer.css b/templates/default.gbai/default.gbtheme/css/Footer.css similarity index 100% rename from packages/default.gbtheme/css/Footer.css rename to templates/default.gbai/default.gbtheme/css/Footer.css diff --git a/packages/default.gbtheme/css/GifPlayer.css b/templates/default.gbai/default.gbtheme/css/GifPlayer.css similarity index 100% rename from packages/default.gbtheme/css/GifPlayer.css rename to templates/default.gbai/default.gbtheme/css/GifPlayer.css diff --git a/packages/default.gbtheme/css/MediaPlayer.css b/templates/default.gbai/default.gbtheme/css/MediaPlayer.css similarity index 100% rename from packages/default.gbtheme/css/MediaPlayer.css rename to templates/default.gbai/default.gbtheme/css/MediaPlayer.css diff --git a/packages/default.gbtheme/css/NavBar.css b/templates/default.gbai/default.gbtheme/css/NavBar.css similarity index 100% rename from packages/default.gbtheme/css/NavBar.css rename to templates/default.gbai/default.gbtheme/css/NavBar.css diff --git a/packages/default.gbtheme/css/SideBarMenu.css b/templates/default.gbai/default.gbtheme/css/SideBarMenu.css similarity index 100% rename from packages/default.gbtheme/css/SideBarMenu.css rename to templates/default.gbai/default.gbtheme/css/SideBarMenu.css diff --git a/packages/default.gbtheme/css/index.css b/templates/default.gbai/default.gbtheme/css/index.css similarity index 100% rename from packages/default.gbtheme/css/index.css rename to templates/default.gbai/default.gbtheme/css/index.css diff --git a/packages/default.gbtheme/css/webchat-style.json b/templates/default.gbai/default.gbtheme/css/webchat-style.json similarity index 100% rename from packages/default.gbtheme/css/webchat-style.json rename to templates/default.gbai/default.gbtheme/css/webchat-style.json diff --git a/packages/default.gbtheme/images/bot-logo-chat.png b/templates/default.gbai/default.gbtheme/images/bot-logo-chat.png similarity index 100% rename from packages/default.gbtheme/images/bot-logo-chat.png rename to templates/default.gbai/default.gbtheme/images/bot-logo-chat.png diff --git a/packages/default.gbtheme/images/bot-logo.png b/templates/default.gbai/default.gbtheme/images/bot-logo.png similarity index 100% rename from packages/default.gbtheme/images/bot-logo.png rename to templates/default.gbai/default.gbtheme/images/bot-logo.png diff --git a/packages/default.gbtheme/images/bot-tv-on.png b/templates/default.gbai/default.gbtheme/images/bot-tv-on.png similarity index 100% rename from packages/default.gbtheme/images/bot-tv-on.png rename to templates/default.gbai/default.gbtheme/images/bot-tv-on.png diff --git a/packages/default.gbtheme/images/bot-tv-on2.png b/templates/default.gbai/default.gbtheme/images/bot-tv-on2.png similarity index 100% rename from packages/default.gbtheme/images/bot-tv-on2.png rename to templates/default.gbai/default.gbtheme/images/bot-tv-on2.png diff --git a/packages/default.gbtheme/images/bot-tv.png b/templates/default.gbai/default.gbtheme/images/bot-tv.png similarity index 100% rename from packages/default.gbtheme/images/bot-tv.png rename to templates/default.gbai/default.gbtheme/images/bot-tv.png diff --git a/packages/default.gbtheme/images/chat-background.png b/templates/default.gbai/default.gbtheme/images/chat-background.png similarity index 100% rename from packages/default.gbtheme/images/chat-background.png rename to templates/default.gbai/default.gbtheme/images/chat-background.png diff --git a/packages/default.gbtheme/images/chat-header-logo.png b/templates/default.gbai/default.gbtheme/images/chat-header-logo.png similarity index 100% rename from packages/default.gbtheme/images/chat-header-logo.png rename to templates/default.gbai/default.gbtheme/images/chat-header-logo.png diff --git a/packages/default.gbtheme/images/chat-header.png b/templates/default.gbai/default.gbtheme/images/chat-header.png similarity index 100% rename from packages/default.gbtheme/images/chat-header.png rename to templates/default.gbai/default.gbtheme/images/chat-header.png diff --git a/packages/default.gbtheme/images/general-bot-background.jpg b/templates/default.gbai/default.gbtheme/images/general-bot-background.jpg similarity index 100% rename from packages/default.gbtheme/images/general-bot-background.jpg rename to templates/default.gbai/default.gbtheme/images/general-bot-background.jpg diff --git a/packages/default.gbtheme/images/logo-Pragmatismo.png b/templates/default.gbai/default.gbtheme/images/logo-Pragmatismo.png similarity index 100% rename from packages/default.gbtheme/images/logo-Pragmatismo.png rename to templates/default.gbai/default.gbtheme/images/logo-Pragmatismo.png diff --git a/packages/default.gbtheme/images/logo.jpg b/templates/default.gbai/default.gbtheme/images/logo.jpg similarity index 100% rename from packages/default.gbtheme/images/logo.jpg rename to templates/default.gbai/default.gbtheme/images/logo.jpg diff --git a/packages/default.gbtheme/images/logo.png b/templates/default.gbai/default.gbtheme/images/logo.png similarity index 100% rename from packages/default.gbtheme/images/logo.png rename to templates/default.gbai/default.gbtheme/images/logo.png diff --git a/packages/default.gbtheme/images/pragmatismo-logo.png b/templates/default.gbai/default.gbtheme/images/pragmatismo-logo.png similarity index 100% rename from packages/default.gbtheme/images/pragmatismo-logo.png rename to templates/default.gbai/default.gbtheme/images/pragmatismo-logo.png diff --git a/packages/default.gbtheme/images/pragmatismo-powered-by.png b/templates/default.gbai/default.gbtheme/images/pragmatismo-powered-by.png similarity index 100% rename from packages/default.gbtheme/images/pragmatismo-powered-by.png rename to templates/default.gbai/default.gbtheme/images/pragmatismo-powered-by.png diff --git a/packages/default.gbtheme/images/projector-background.jpg b/templates/default.gbai/default.gbtheme/images/projector-background.jpg similarity index 100% rename from packages/default.gbtheme/images/projector-background.jpg rename to templates/default.gbai/default.gbtheme/images/projector-background.jpg diff --git a/packages/default.gbtheme/images/projetor_tela.png b/templates/default.gbai/default.gbtheme/images/projetor_tela.png similarity index 100% rename from packages/default.gbtheme/images/projetor_tela.png rename to templates/default.gbai/default.gbtheme/images/projetor_tela.png diff --git a/packages/default.gbtheme/images/screen.png b/templates/default.gbai/default.gbtheme/images/screen.png similarity index 100% rename from packages/default.gbtheme/images/screen.png rename to templates/default.gbai/default.gbtheme/images/screen.png diff --git a/packages/default.gbtheme/images/tela-01.png b/templates/default.gbai/default.gbtheme/images/tela-01.png similarity index 100% rename from packages/default.gbtheme/images/tela-01.png rename to templates/default.gbai/default.gbtheme/images/tela-01.png diff --git a/packages/default.gbtheme/package.json b/templates/default.gbai/default.gbtheme/package.json similarity index 100% rename from packages/default.gbtheme/package.json rename to templates/default.gbai/default.gbtheme/package.json