@tiledesk/tiledesk-server 2.15.7 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -1
- package/event/messageEvent.js +24 -0
- package/models/kb_setting.js +5 -0
- package/models/request.js +1 -0
- package/package.json +2 -2
- package/pubmodules/queue/reconnect.js +16 -0
- package/pubmodules/routing-queue/listenerQueued.js +22 -3
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +2 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +2 -1
- package/routes/kb.js +278 -120
- package/routes/request.js +174 -92
- package/services/aiManager.js +72 -3
- package/test/fixtures/example-kb-faqs.csv +2 -2
- package/test/fixtures/exported_namespace.json +2 -1
- package/test/kbRoute.js +125 -12
- package/utils/arrayUtil.js +35 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,16 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
-
# 2.16.
|
|
8
|
+
# 2.16.0
|
|
9
|
+
- Added possibility to update Knowledge Base content
|
|
10
|
+
- Added rated only filter in Conversations History
|
|
11
|
+
- Improved pending requests management
|
|
12
|
+
|
|
13
|
+
# 2.15.8
|
|
14
|
+
- Updated tybot-connector to 2.0.45
|
|
15
|
+
- Added support for tags management in knowledge base routes
|
|
16
|
+
|
|
17
|
+
# 2.15.7
|
|
9
18
|
- Updated whatsapp-connector to 1.0.26
|
|
10
19
|
|
|
11
20
|
# 2.15.6
|
package/event/messageEvent.js
CHANGED
|
@@ -5,6 +5,7 @@ var Message = require("../models/message");
|
|
|
5
5
|
var Faq_kb = require("../models/faq_kb");
|
|
6
6
|
var MessageConstants = require("../models/messageConstants");
|
|
7
7
|
var message2Event = require("../event/message2Event");
|
|
8
|
+
var requestEvent = require("../event/requestEvent");
|
|
8
9
|
|
|
9
10
|
var cacheUtil = require('../utils/cacheUtil');
|
|
10
11
|
var cacheEnabler = require("../services/cacheEnabler");
|
|
@@ -178,6 +179,29 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
|
178
179
|
messageEvent.on('message.create.simple', populateMessageCreate);
|
|
179
180
|
messageEvent.on('message.update.simple', populateMessageUpdate);
|
|
180
181
|
|
|
182
|
+
// When the user (lead/requester) sends a message, reopen the conversation if it was pending
|
|
183
|
+
messageEvent.on('message.create.from.requester', function (messageJson) {
|
|
184
|
+
if (!messageJson.request || messageJson.request.workingStatus !== 'pending') return;
|
|
185
|
+
var request_id = messageJson.request.request_id;
|
|
186
|
+
var id_project = messageJson.request.id_project;
|
|
187
|
+
Request.findOneAndUpdate(
|
|
188
|
+
{ request_id: request_id, id_project: id_project },
|
|
189
|
+
{ $set: { workingStatus: 'open' } },
|
|
190
|
+
{ new: true },
|
|
191
|
+
function (err, updatedRequest) {
|
|
192
|
+
if (err) {
|
|
193
|
+
winston.error("Error updating request workingStatus from pending to open", err);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (updatedRequest) {
|
|
197
|
+
winston.debug("Request workingStatus set to open (was pending)", { request_id, id_project });
|
|
198
|
+
requestEvent.emit('request.workingStatus.update', { request: updatedRequest });
|
|
199
|
+
requestEvent.emit('request.update', updatedRequest);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
});
|
|
204
|
+
|
|
181
205
|
|
|
182
206
|
|
|
183
207
|
// // riattiva commentato per performance
|
package/models/kb_setting.js
CHANGED
package/models/request.js
CHANGED
|
@@ -507,6 +507,7 @@ RequestSchema.index({ id_project: 1, createdAt: -1, status: 1 })
|
|
|
507
507
|
RequestSchema.index({ id_project: 1, preflight: 1, smartAssignment: 1, "snapshot.department.routing": 1, createdAt: 1, status: 1 })
|
|
508
508
|
|
|
509
509
|
RequestSchema.index({ status: 1, hasBot: 1, updatedAt: 1 }) // For closing unresponsive requests
|
|
510
|
+
RequestSchema.index({ status: 1, hasBot: 1, workingStatus: 1, updatedAt: 1 }) // For closing unresponsive requests
|
|
510
511
|
|
|
511
512
|
// Contact search by phone / email
|
|
512
513
|
RequestSchema.index({ id_project: 1, 'contact.phone': 1 });
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
|
3
3
|
"description": "The Tiledesk server module",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.16.0",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "node ./bin/www",
|
|
7
7
|
"pretest": "mongodb-runner start",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@tiledesk/tiledesk-rasa-connector": "^1.0.10",
|
|
50
50
|
"@tiledesk/tiledesk-sms-connector": "^0.1.13",
|
|
51
51
|
"@tiledesk/tiledesk-telegram-connector": "^0.1.14",
|
|
52
|
-
"@tiledesk/tiledesk-tybot-connector": "^2.0.
|
|
52
|
+
"@tiledesk/tiledesk-tybot-connector": "^2.0.45",
|
|
53
53
|
"@tiledesk/tiledesk-voice-twilio-connector": "^0.3.2",
|
|
54
54
|
"@tiledesk/tiledesk-vxml-connector": "^0.1.91",
|
|
55
55
|
"@tiledesk/tiledesk-whatsapp-connector": "1.0.26",
|
|
@@ -175,6 +175,11 @@ function startWorker() {
|
|
|
175
175
|
winston.info("Data queue", oka)
|
|
176
176
|
});
|
|
177
177
|
|
|
178
|
+
ch.bindQueue(_ok.queue, exchange, "request_workingStatus_update", {}, function(err3, oka) {
|
|
179
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_workingStatus_update");
|
|
180
|
+
winston.info("Data queue", oka)
|
|
181
|
+
});
|
|
182
|
+
|
|
178
183
|
ch.bindQueue(_ok.queue, exchange, "message_create", {}, function(err3, oka) {
|
|
179
184
|
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: message_create");
|
|
180
185
|
winston.info("Data queue", oka)
|
|
@@ -286,6 +291,11 @@ function work(msg, cb) {
|
|
|
286
291
|
requestEvent.emit('request.close.extended.queue', JSON.parse(message_string));
|
|
287
292
|
}
|
|
288
293
|
|
|
294
|
+
if (topic === 'request_workingStatus_update') {
|
|
295
|
+
winston.debug("reconnect here topic:" + topic);
|
|
296
|
+
requestEvent.emit('request.workingStatus.update.queue', JSON.parse(message_string));
|
|
297
|
+
}
|
|
298
|
+
|
|
289
299
|
if (topic === 'message_create') {
|
|
290
300
|
winston.debug("reconnect here topic:" + topic);
|
|
291
301
|
// requestEvent.emit('request.create.queue', msg.content);
|
|
@@ -410,6 +420,12 @@ function listen() {
|
|
|
410
420
|
});
|
|
411
421
|
});
|
|
412
422
|
|
|
423
|
+
requestEvent.on('request.workingStatus.update', function(request) {
|
|
424
|
+
setImmediate(() => {
|
|
425
|
+
publish(exchange, "request_workingStatus_update", Buffer.from(JSON.stringify(request)));
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
|
|
413
429
|
requestEvent.on('request.snapshot.update', function(data) {
|
|
414
430
|
setImmediate(() => {
|
|
415
431
|
winston.debug("reconnect request.snapshot.update")
|
|
@@ -50,7 +50,7 @@ class Listener {
|
|
|
50
50
|
return winston.warn("Chatbot is not a project_user. Skip update.")
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
return Request.countDocuments({ id_project: id_project, participantsAgents: id_user, status: { $lt: 1000 }, draft: { $in: [null, false] } }, (err, requestsCount) => {
|
|
53
|
+
return Request.countDocuments({ id_project: id_project, participantsAgents: id_user, status: { $lt: 1000 }, draft: { $in: [null, false] }, workingStatus: { $ne: 'pending' } }, (err, requestsCount) => {
|
|
54
54
|
winston.verbose("requestsCount for id_user: ", id_user, "and project: ", id_project, "-->", requestsCount);
|
|
55
55
|
if (err) {
|
|
56
56
|
return winston.error(err);
|
|
@@ -236,8 +236,27 @@ class Listener {
|
|
|
236
236
|
});
|
|
237
237
|
});
|
|
238
238
|
|
|
239
|
-
|
|
240
|
-
|
|
239
|
+
var requestWorkingStatusUpdateKey = 'request.workingStatus.update';
|
|
240
|
+
if (requestEvent.queueEnabled) {
|
|
241
|
+
requestWorkingStatusUpdateKey = 'request.workingStatus.update.queue';
|
|
242
|
+
}
|
|
243
|
+
winston.debug('Route queue requestWorkingStatusUpdateKey: ' + requestWorkingStatusUpdateKey);
|
|
244
|
+
|
|
245
|
+
requestEvent.on(requestWorkingStatusUpdateKey, async (data) => {
|
|
246
|
+
winston.debug('Route queue WorkingStatus Update');
|
|
247
|
+
|
|
248
|
+
var request = data.request;
|
|
249
|
+
var participantIds = (request.participantsAgents && request.participantsAgents.length)
|
|
250
|
+
? request.participantsAgents
|
|
251
|
+
: (request.participatingAgents || []).map(u => u._id || u.id);
|
|
252
|
+
setImmediate(() => {
|
|
253
|
+
participantIds.forEach(id_user => {
|
|
254
|
+
if (id_user && !String(id_user).startsWith('bot_')) {
|
|
255
|
+
this.updateProjectUser(id_user, request.id_project, 0);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
241
260
|
}
|
|
242
261
|
|
|
243
262
|
}
|