From 3a14fc373afd034b640005d6ac6de2883e1f86c0 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Thu, 17 Aug 2023 18:19:46 -0300 Subject: [PATCH 01/12] adjust params rabbitmq --- src/whatsapp/services/whatsapp.service.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 1534a346..0a951add 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -599,11 +599,23 @@ export class WAStartupService { if (Array.isArray(rabbitmqLocal) && rabbitmqLocal.includes(we)) { const exchangeName = 'evolution_exchange'; - amqp.assertExchange(exchangeName, 'topic', { durable: false }); + amqp.assertExchange(exchangeName, 'topic', { + durable: true, + 'auto-delete': false, + arguments: { + 'x-queue-type': 'quorum', + }, + }); const queueName = `${this.instanceName}.${event}`; - amqp.assertQueue(queueName, { durable: false }); + amqp.assertQueue(queueName, { + durable: true, + 'auto-delete': false, + arguments: { + 'x-queue-type': 'quorum', + }, + }); amqp.bindQueue(queueName, exchangeName, event); @@ -666,6 +678,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: this.localWebhook.url, + sender: this.wuid, server_url: serverUrl, apikey: (expose && instanceApikey) || null, }; @@ -685,6 +698,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: this.localWebhook.url, + sender: this.wuid, server_url: serverUrl, }; @@ -734,6 +748,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: localUrl, + sender: this.wuid, server_url: serverUrl, }; @@ -752,6 +767,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: localUrl, + sender: this.wuid, server_url: serverUrl, }; From deb07d2b7fda739a592090a1dba9e50fb04f9406 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 08:44:13 -0300 Subject: [PATCH 02/12] Messages sent by the api now arrive in chatwoot --- CHANGELOG.md | 1 + src/whatsapp/services/whatsapp.service.ts | 11 ++++------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8edec3a0..ea364cfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ * Update Dockerfile * If you pass empty events in create instance and set webhook it is understood as all * Fixed issue that did not output base64 averages +* Messages sent by the api now arrive in chatwoot ### Integrations diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 0a951add..f2fad12c 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -678,6 +678,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: this.localWebhook.url, + ISODatetime: new Date().toISOString(), sender: this.wuid, server_url: serverUrl, apikey: (expose && instanceApikey) || null, @@ -1991,13 +1992,9 @@ export class WAStartupService { this.logger.verbose('Sending data to webhook in event SEND_MESSAGE'); await this.sendDataWebhook(Events.SEND_MESSAGE, messageRaw); - // if (this.localChatwoot.enabled) { - // this.chatwootService.eventWhatsapp( - // Events.SEND_MESSAGE, - // { instanceName: this.instance.name }, - // messageRaw, - // ); - // } + if (this.localChatwoot.enabled) { + this.chatwootService.eventWhatsapp(Events.SEND_MESSAGE, { instanceName: this.instance.name }, messageRaw); + } this.logger.verbose('Inserting message in database'); await this.repository.message.insert( From 680c92ecec2d1e3785694ba71595754d9e9d3870 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 09:25:34 -0300 Subject: [PATCH 03/12] Messages sent by the api now arrive in chatwoot --- src/whatsapp/services/whatsapp.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index f2fad12c..b71d8762 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -611,9 +611,9 @@ export class WAStartupService { amqp.assertQueue(queueName, { durable: true, - 'auto-delete': false, + autoDelete: false, arguments: { - 'x-queue-type': 'quorum', + queueType: 'quorum', }, }); From c4d41134b866cd3b0ed921963a7d83b652c0a2b0 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 09:33:17 -0300 Subject: [PATCH 04/12] Messages sent by the api now arrive in chatwoot --- src/libs/amqp.server.ts | 8 +++++++- src/whatsapp/services/whatsapp.service.ts | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libs/amqp.server.ts b/src/libs/amqp.server.ts index 86819c80..6f4af528 100644 --- a/src/libs/amqp.server.ts +++ b/src/libs/amqp.server.ts @@ -24,7 +24,13 @@ export const initAMQP = () => { const exchangeName = 'evolution_exchange'; - channel.assertExchange(exchangeName, 'topic', { durable: false }); + channel.assertExchange(exchangeName, 'topic', { + durable: true, + autoDelete: false, + arguments: { + queueType: 'quorum', + }, + }); amqpChannel = channel; logger.info('AMQP initialized'); diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index b71d8762..597af126 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -601,9 +601,9 @@ export class WAStartupService { amqp.assertExchange(exchangeName, 'topic', { durable: true, - 'auto-delete': false, + autoDelete: false, arguments: { - 'x-queue-type': 'quorum', + queueType: 'quorum', }, }); From 201e6f7e7bb20e41c6080322425a866d9241828d Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 10:38:32 -0300 Subject: [PATCH 05/12] Added rabbitmq to send events --- src/libs/amqp.server.ts | 4 +--- src/whatsapp/services/whatsapp.service.ts | 7 ++----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/libs/amqp.server.ts b/src/libs/amqp.server.ts index 6f4af528..cc0f13b5 100644 --- a/src/libs/amqp.server.ts +++ b/src/libs/amqp.server.ts @@ -27,10 +27,8 @@ export const initAMQP = () => { channel.assertExchange(exchangeName, 'topic', { durable: true, autoDelete: false, - arguments: { - queueType: 'quorum', - }, }); + amqpChannel = channel; logger.info('AMQP initialized'); diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 597af126..49f51c44 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -597,14 +597,11 @@ export class WAStartupService { if (amqp) { if (Array.isArray(rabbitmqLocal) && rabbitmqLocal.includes(we)) { - const exchangeName = 'evolution_exchange'; + const exchangeName = this.instanceName ?? 'evolution_exchange'; amqp.assertExchange(exchangeName, 'topic', { durable: true, autoDelete: false, - arguments: { - queueType: 'quorum', - }, }); const queueName = `${this.instanceName}.${event}`; @@ -613,7 +610,7 @@ export class WAStartupService { durable: true, autoDelete: false, arguments: { - queueType: 'quorum', + 'x-queue-type': 'quorum', }, }); From 6f99784224650a7d7eb5d4af33da000803553ef3 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 11:38:50 -0300 Subject: [PATCH 06/12] Added Typebot integration --- src/main.ts | 4 +- src/whatsapp/services/typebot.service.ts | 48 ++++++++++++++++++++---- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main.ts b/src/main.ts index adc868af..75dd95b3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,7 +27,9 @@ function bootstrap() { cors({ origin(requestOrigin, callback) { const { ORIGIN } = configService.get('CORS'); - !requestOrigin ? (requestOrigin = '*') : undefined; + if (ORIGIN.includes('*')) { + return callback(null, true); + } if (ORIGIN.indexOf(requestOrigin) !== -1) { return callback(null, true); } diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index ce307509..78cbdb1f 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -1,3 +1,4 @@ +import { delay } from '@whiskeysockets/baileys'; import axios from 'axios'; import { Logger } from '../../config/logger.config'; @@ -162,13 +163,34 @@ export class TypebotService { return request.data; } - public async sendWAMessage(instance: InstanceDto, remoteJid: string, messages: any[], input: any[]) { - processMessages(this.waMonitor.waInstances[instance.instanceName], messages, input).catch((err) => { - console.error('Erro ao processar mensagens:', err); - }); + public async sendWAMessage( + instance: InstanceDto, + remoteJid: string, + messages: any[], + input: any[], + clientSideActions: any[], + ) { + processMessages(this.waMonitor.waInstances[instance.instanceName], messages, input, clientSideActions).catch( + (err) => { + console.error('Erro ao processar mensagens:', err); + }, + ); - async function processMessages(instance, messages, input) { + function findItemAndGetSecondsToWait(array, targetId) { + if (!array) return null; + + for (const item of array) { + if (item.lastBubbleBlockId === targetId) { + return item.wait?.secondsToWaitFor; + } + } + return null; + } + + async function processMessages(instance, messages, input, clientSideActions) { for (const message of messages) { + const wait = findItemAndGetSecondsToWait(clientSideActions, message.id); + if (message.type === 'text') { let formattedText = ''; @@ -260,6 +282,10 @@ export class TypebotService { }, }); } + + if (wait) { + await delay(wait * 1000); + } } if (input) { @@ -323,7 +349,7 @@ export class TypebotService { pushName: msg.pushName, }); - await this.sendWAMessage(instance, remoteJid, data.messages, data.input); + await this.sendWAMessage(instance, remoteJid, data.messages, data.input, data.clientSideActions); return; } @@ -346,7 +372,7 @@ export class TypebotService { pushName: msg.pushName, }); - await this.sendWAMessage(instance, remoteJid, data.messages, data.input); + await this.sendWAMessage(instance, remoteJid, data.messages, data.input, data.clientSideActions); return; } @@ -414,7 +440,13 @@ export class TypebotService { const request = await axios.post(url + '/api/v1/sendMessage', reqData); - await this.sendWAMessage(instance, remoteJid, request.data.messages, request.data.input); + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); return; } From 31325d09993f5af4db33bf34e52f1090fd1d91cd Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 11:58:41 -0300 Subject: [PATCH 07/12] Added Typebot integration --- src/whatsapp/services/typebot.service.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 78cbdb1f..1179cad1 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -1,4 +1,3 @@ -import { delay } from '@whiskeysockets/baileys'; import axios from 'axios'; import { Logger } from '../../config/logger.config'; @@ -231,7 +230,8 @@ export class TypebotService { await instance.textMessage({ number: remoteJid.split('@')[0], options: { - delay: instance.localTypebot.delay_message || 1000, + // delay: instance.localTypebot.delay_message || 1000, + delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', linkPreview: linkPreview, }, @@ -245,7 +245,8 @@ export class TypebotService { await instance.mediaMessage({ number: remoteJid.split('@')[0], options: { - delay: instance.localTypebot.delay_message || 1000, + // delay: instance.localTypebot.delay_message || 1000, + delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', }, mediaMessage: { @@ -259,7 +260,8 @@ export class TypebotService { await instance.mediaMessage({ number: remoteJid.split('@')[0], options: { - delay: instance.localTypebot.delay_message || 1000, + // delay: instance.localTypebot.delay_message || 1000, + delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', }, mediaMessage: { @@ -273,7 +275,8 @@ export class TypebotService { await instance.audioWhatsapp({ number: remoteJid.split('@')[0], options: { - delay: instance.localTypebot.delay_message || 1000, + // delay: instance.localTypebot.delay_message || 1000, + delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'recording', encoding: true, }, @@ -282,10 +285,6 @@ export class TypebotService { }, }); } - - if (wait) { - await delay(wait * 1000); - } } if (input) { From 0d16a7aab0fa4d9cf07cf435d0de14445f0dea5f Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 11:59:04 -0300 Subject: [PATCH 08/12] Added Typebot integration --- src/whatsapp/services/typebot.service.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 1179cad1..43178c34 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -230,7 +230,6 @@ export class TypebotService { await instance.textMessage({ number: remoteJid.split('@')[0], options: { - // delay: instance.localTypebot.delay_message || 1000, delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', linkPreview: linkPreview, @@ -245,7 +244,6 @@ export class TypebotService { await instance.mediaMessage({ number: remoteJid.split('@')[0], options: { - // delay: instance.localTypebot.delay_message || 1000, delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', }, @@ -260,7 +258,6 @@ export class TypebotService { await instance.mediaMessage({ number: remoteJid.split('@')[0], options: { - // delay: instance.localTypebot.delay_message || 1000, delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'composing', }, @@ -275,7 +272,6 @@ export class TypebotService { await instance.audioWhatsapp({ number: remoteJid.split('@')[0], options: { - // delay: instance.localTypebot.delay_message || 1000, delay: wait ? wait * 1000 : instance.localTypebot.delay_message || 1000, presence: 'recording', encoding: true, From dd2caf720cedf28965aa0ee468c821e6516314c2 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 12:24:05 -0300 Subject: [PATCH 09/12] Added Typebot integration --- src/validate/validate.schema.ts | 12 ++++++ .../controllers/typebot.controller.ts | 5 +++ src/whatsapp/routers/typebot.router.ts | 25 ++++++++++- src/whatsapp/services/typebot.service.ts | 42 +++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index 81a61127..bce05660 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -1001,6 +1001,18 @@ export const typebotStatusSchema: JSONSchema7 = { ...isNotEmpty('remoteJid', 'status'), }; +export const typebotStartSchema: JSONSchema7 = { + $id: v4(), + type: 'object', + properties: { + remoteJid: { type: 'string' }, + url: { type: 'string' }, + typebot: { type: 'string' }, + }, + required: ['remoteJid', 'url', 'typebot'], + ...isNotEmpty('remoteJid', 'url', 'typebot'), +}; + export const proxySchema: JSONSchema7 = { $id: v4(), type: 'object', diff --git a/src/whatsapp/controllers/typebot.controller.ts b/src/whatsapp/controllers/typebot.controller.ts index 0cda7d57..53dc967f 100644 --- a/src/whatsapp/controllers/typebot.controller.ts +++ b/src/whatsapp/controllers/typebot.controller.ts @@ -38,4 +38,9 @@ export class TypebotController { logger.verbose('requested changeStatus from ' + instance.instanceName + ' instance'); return this.typebotService.changeStatus(instance, data); } + + public async startTypebot(instance: InstanceDto, data: any) { + logger.verbose('requested startTypebot from ' + instance.instanceName + ' instance'); + return this.typebotService.startTypebot(instance, data); + } } diff --git a/src/whatsapp/routers/typebot.router.ts b/src/whatsapp/routers/typebot.router.ts index 68bb6395..0f785de3 100644 --- a/src/whatsapp/routers/typebot.router.ts +++ b/src/whatsapp/routers/typebot.router.ts @@ -1,7 +1,12 @@ import { RequestHandler, Router } from 'express'; import { Logger } from '../../config/logger.config'; -import { instanceNameSchema, typebotSchema, typebotStatusSchema } from '../../validate/validate.schema'; +import { + instanceNameSchema, + typebotSchema, + typebotStartSchema, + typebotStatusSchema, +} from '../../validate/validate.schema'; import { RouterBroker } from '../abstract/abstract.router'; import { InstanceDto } from '../dto/instance.dto'; import { TypebotDto } from '../dto/typebot.dto'; @@ -47,7 +52,7 @@ export class TypebotRouter extends RouterBroker { res.status(HttpStatus.OK).json(response); }) .post(this.routerPath('changeStatus'), ...guards, async (req, res) => { - logger.verbose('request received in findTypebot'); + logger.verbose('request received in changeStatusTypebot'); logger.verbose('request body: '); logger.verbose(req.body); @@ -60,6 +65,22 @@ export class TypebotRouter extends RouterBroker { execute: (instance, data) => typebotController.changeStatus(instance, data), }); + res.status(HttpStatus.OK).json(response); + }) + .post(this.routerPath('start'), ...guards, async (req, res) => { + logger.verbose('request received in startTypebot'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + const response = await this.dataValidate({ + request: req, + schema: typebotStartSchema, + ClassRef: InstanceDto, + execute: (instance, data) => typebotController.startTypebot(instance, data), + }); + res.status(HttpStatus.OK).json(response); }); } diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 43178c34..1128bb0d 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -84,6 +84,48 @@ export class TypebotService { return { typebot: { ...instance, typebot: typebotData } }; } + public async startTypebot(instance: InstanceDto, data: any) { + const remoteJid = data.remoteJid; + const url = data.url; + const typebot = data.typebot; + + const id = Math.floor(Math.random() * 10000000000).toString(); + + const reqData = { + sessionId: id, + startParams: { + typebot: data.typebot, + prefilledVariables: { + remoteJid: data.remoteJid, + pushName: data.pushName, + instanceName: instance.instanceName, + }, + }, + }; + console.log(reqData); + + const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); + + return { + typebot: { + ...instance, + typebot: { + url: url, + remoteJid: remoteJid, + typebot: typebot, + }, + }, + }; + } + private getTypeMessage(msg: any) { this.logger.verbose('get type message'); From 04b9a070c43a5974e84d7aee50c01f1bc7083c99 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 12:46:46 -0300 Subject: [PATCH 10/12] Added send and date_time in webhook data --- src/whatsapp/services/whatsapp.service.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 49f51c44..d11946ee 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -587,6 +587,9 @@ export class WAStartupService { const serverUrl = this.configService.get('SERVER').URL; const we = event.replace(/[.-]/gm, '_').toUpperCase(); const transformedWe = we.replace(/_/gm, '-').toLowerCase(); + const tzoffset = new Date().getTimezoneOffset() * 60000; //offset in milliseconds + const localISOTime = new Date(Date.now() - tzoffset).toISOString(); + const now = localISOTime; const expose = this.configService.get('AUTHENTICATION').EXPOSE_IN_FETCH_INSTANCES; const tokenStore = await this.repository.auth.find(this.instanceName); @@ -621,6 +624,8 @@ export class WAStartupService { instance: this.instance.name, data, server_url: serverUrl, + date_time: now, + sender: this.wuid, }; if (expose && instanceApikey) { @@ -643,6 +648,8 @@ export class WAStartupService { instance: this.instance.name, data, server_url: serverUrl, + date_time: now, + sender: this.wuid, }; if (expose && instanceApikey) { @@ -675,7 +682,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: this.localWebhook.url, - ISODatetime: new Date().toISOString(), + date_time: now, sender: this.wuid, server_url: serverUrl, apikey: (expose && instanceApikey) || null, @@ -696,6 +703,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: this.localWebhook.url, + date_time: now, sender: this.wuid, server_url: serverUrl, }; @@ -746,6 +754,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: localUrl, + date_time: now, sender: this.wuid, server_url: serverUrl, }; @@ -765,6 +774,7 @@ export class WAStartupService { instance: this.instance.name, data, destination: localUrl, + date_time: now, sender: this.wuid, server_url: serverUrl, }; From 5c247e3d2c56493f68f1a8eaaa39af7a6774b6d7 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 12:46:47 -0300 Subject: [PATCH 11/12] Added send and date_time in webhook data --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea364cfb..d9f2d6f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * Added rabbitmq to send events * Added Typebot integration * Added proxy endpoint +* Added send and date_time in webhook data ### Fixed From deb8f2a0b70f6fedf3559f46b2281d84355af02f Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 18 Aug 2023 12:48:30 -0300 Subject: [PATCH 12/12] Added send and date_time in webhook data --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f2d6f5..059dd781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 1.5.0 (homolog) +# 1.5.0 (2023-08-18 12:47) ### Feature