@tiledesk/tiledesk-server 2.3.91 → 2.3.93
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 +19 -1
- package/package.json +1 -1
- package/pubmodules/apps/listener.js +14 -1
- package/routes/faq_kb.js +19 -15
- package/services/chatbotService.js +1 -1
- package/services/subscriptionNotifier.js +5 -4
- package/services/trainingService.js +26 -14
- package/test/chatbot-mock.js +3 -3
- package/test/example-json.txt +1 -1
- package/test/faqkbRoute.js +10 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,8 +5,26 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
+
# 2.3.93 -> PROD v3
|
|
9
|
+
- subscriptionNotifier secret fix
|
|
8
10
|
|
|
9
|
-
# 2.3.
|
|
11
|
+
# 2.3.92
|
|
12
|
+
- Apps module fix for public secret key
|
|
13
|
+
|
|
14
|
+
# 2.3.91
|
|
15
|
+
- subscription webhook fix for global webhook secret creation for token
|
|
16
|
+
- added jsonRequest field to subscriptionLog to save request body payload
|
|
17
|
+
|
|
18
|
+
# 2.3.90
|
|
19
|
+
- Dependency updated tiledesk-tybot-connector 0.1.59
|
|
20
|
+
|
|
21
|
+
# 2.3.89
|
|
22
|
+
- added as_attachment query parameter to images endpoint to download the images
|
|
23
|
+
|
|
24
|
+
# 2.3.88
|
|
25
|
+
- added score, publishedBy and publishedAt to bot model
|
|
26
|
+
|
|
27
|
+
# 2.3.87
|
|
10
28
|
- Geo Service fix with queue enabled
|
|
11
29
|
|
|
12
30
|
# 2.3.86
|
package/package.json
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
const apps = require("@tiledesk/tiledesk-apps");
|
|
2
2
|
var winston = require('../../config/winston');
|
|
3
3
|
|
|
4
|
+
var config = require('../../config/database'); // get db config file
|
|
5
|
+
|
|
6
|
+
let configSecretOrPubicKay = process.env.GLOBAL_SECRET || config.secret;
|
|
7
|
+
|
|
8
|
+
var pKey = process.env.GLOBAL_SECRET_OR_PUB_KEY;
|
|
9
|
+
// console.log("pKey",pKey);
|
|
10
|
+
|
|
11
|
+
if (pKey) {
|
|
12
|
+
configSecretOrPubicKay = pKey.replace(/\\n/g, '\n');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// console.log("configSecretOrPubicKay",configSecretOrPubicKay);
|
|
16
|
+
|
|
4
17
|
class Listener {
|
|
5
18
|
|
|
6
19
|
listen(config) {
|
|
@@ -12,7 +25,7 @@ class Listener {
|
|
|
12
25
|
}
|
|
13
26
|
|
|
14
27
|
apps.startApp({
|
|
15
|
-
ACCESS_TOKEN_SECRET: process.env.APPS_ACCESS_TOKEN_SECRET ||
|
|
28
|
+
ACCESS_TOKEN_SECRET: process.env.APPS_ACCESS_TOKEN_SECRET || configSecretOrPubicKay,
|
|
16
29
|
MONGODB_URI: process.env.APPS_MONGODB_URI || config.databaseUri,
|
|
17
30
|
KALEYRA_ENABLED: process.env.KALEYRA_ENABLED || config.kaleyra_enabled
|
|
18
31
|
}, () => {
|
package/routes/faq_kb.js
CHANGED
|
@@ -525,7 +525,7 @@ router.post('/fork/:id_faq_kb', async (req, res) => {
|
|
|
525
525
|
})
|
|
526
526
|
|
|
527
527
|
|
|
528
|
-
router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) => {
|
|
528
|
+
router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), async (req, res) => {
|
|
529
529
|
|
|
530
530
|
let id_faq_kb = req.params.id_faq_kb;
|
|
531
531
|
winston.info('import on id_faq_kb: ', id_faq_kb);
|
|
@@ -545,7 +545,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
545
545
|
|
|
546
546
|
winston.info("intents only")
|
|
547
547
|
|
|
548
|
-
json.intents.forEach((intent) => {
|
|
548
|
+
await json.intents.forEach((intent) => {
|
|
549
549
|
|
|
550
550
|
let new_faq = {
|
|
551
551
|
id_faq_kb: id_faq_kb,
|
|
@@ -573,7 +573,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
573
573
|
winston.info("updated existing intent")
|
|
574
574
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
575
575
|
} else {
|
|
576
|
-
winston.info("new intent
|
|
576
|
+
winston.info("new intent created")
|
|
577
577
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
578
578
|
}
|
|
579
579
|
}
|
|
@@ -588,7 +588,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
588
588
|
winston.error("Duplicate intent_display_name.");
|
|
589
589
|
winston.info("Skip duplicated intent_display_name");
|
|
590
590
|
} else {
|
|
591
|
-
winston.info("new intent
|
|
591
|
+
winston.info("new intent created")
|
|
592
592
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
593
593
|
}
|
|
594
594
|
}
|
|
@@ -596,17 +596,17 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
596
596
|
}
|
|
597
597
|
|
|
598
598
|
})
|
|
599
|
-
|
|
599
|
+
faqBotEvent.emit('faq_train.importedall', id_faq_kb);
|
|
600
600
|
return res.status(200).send({ success: true, msg: "Intents imported successfully" })
|
|
601
601
|
|
|
602
602
|
} else {
|
|
603
603
|
|
|
604
604
|
if (req.query.create && req.query.create == 'true') {
|
|
605
|
-
faqService.create(json.name, undefined, req.projectid, req.user.id, "tilebot", json.description, json.webhook_url, json.webhook_enabled, json.language, undefined, undefined, undefined, json.attributes).then((savedFaq_kb) => {
|
|
605
|
+
faqService.create(json.name, undefined, req.projectid, req.user.id, "tilebot", json.description, json.webhook_url, json.webhook_enabled, json.language, undefined, undefined, undefined, json.attributes).then( async (savedFaq_kb) => {
|
|
606
606
|
winston.debug("saved (and imported) faq kb: ", savedFaq_kb);
|
|
607
607
|
botEvent.emit('faqbot.create', savedFaq_kb);
|
|
608
608
|
|
|
609
|
-
json.intents.forEach((intent) => {
|
|
609
|
+
await json.intents.forEach((intent) => {
|
|
610
610
|
|
|
611
611
|
let new_faq = {
|
|
612
612
|
id_faq_kb: savedFaq_kb._id,
|
|
@@ -635,7 +635,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
635
635
|
winston.info("updated existing intent")
|
|
636
636
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
637
637
|
} else {
|
|
638
|
-
winston.info("new intent
|
|
638
|
+
winston.info("new intent created")
|
|
639
639
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
640
640
|
}
|
|
641
641
|
|
|
@@ -652,7 +652,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
652
652
|
winston.error("Duplicate intent_display_name.");
|
|
653
653
|
winston.info("Skip duplicated intent_display_name");
|
|
654
654
|
} else {
|
|
655
|
-
winston.info("new intent
|
|
655
|
+
winston.info("new intent created")
|
|
656
656
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
657
657
|
}
|
|
658
658
|
}
|
|
@@ -660,6 +660,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
660
660
|
}
|
|
661
661
|
|
|
662
662
|
})
|
|
663
|
+
faqBotEvent.emit('faq_train.importedall', savedFaq_kb._id);
|
|
663
664
|
return res.status(200).send(savedFaq_kb);
|
|
664
665
|
|
|
665
666
|
}).catch((err) => {
|
|
@@ -699,15 +700,18 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
699
700
|
if (json.attributes) {
|
|
700
701
|
faq_kb.attributes = json.attributes;
|
|
701
702
|
}
|
|
703
|
+
// if (json.intentsEngine) {
|
|
704
|
+
// faq_kb.intentsEngine = json.intentsEngine;
|
|
705
|
+
// }
|
|
702
706
|
|
|
703
|
-
Faq_kb.findByIdAndUpdate(id_faq_kb, faq_kb, { new: true }, (err, updatedFaq_kb) => {
|
|
707
|
+
Faq_kb.findByIdAndUpdate(id_faq_kb, faq_kb, { new: true }, async (err, updatedFaq_kb) => {
|
|
704
708
|
if (err) {
|
|
705
709
|
return res.status(500).send({ success: false, msg: "Error updating bot." });
|
|
706
710
|
}
|
|
707
711
|
|
|
708
712
|
botEvent.emit('faqbot.update', updatedFaq_kb);
|
|
709
713
|
|
|
710
|
-
json.intents.forEach((intent) => {
|
|
714
|
+
await json.intents.forEach((intent) => {
|
|
711
715
|
|
|
712
716
|
let new_faq = {
|
|
713
717
|
id_faq_kb: updatedFaq_kb._id,
|
|
@@ -736,7 +740,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
736
740
|
winston.info("updated existing intent")
|
|
737
741
|
faqBotEvent.emit('faq.update', savingResult.value);
|
|
738
742
|
} else {
|
|
739
|
-
winston.info("new intent
|
|
743
|
+
winston.info("new intent created")
|
|
740
744
|
faqBotEvent.emit('faq.create', savingResult.value);
|
|
741
745
|
}
|
|
742
746
|
|
|
@@ -753,7 +757,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
753
757
|
winston.error("Duplicate intent_display_name.");
|
|
754
758
|
winston.info("Skip duplicated intent_display_name");
|
|
755
759
|
} else {
|
|
756
|
-
winston.info("new intent
|
|
760
|
+
winston.info("new intent created")
|
|
757
761
|
faqBotEvent.emit('faq.create', savedFaq);
|
|
758
762
|
}
|
|
759
763
|
}
|
|
@@ -761,7 +765,7 @@ router.post('/importjson/:id_faq_kb', upload.single('uploadFile'), (req, res) =>
|
|
|
761
765
|
}
|
|
762
766
|
|
|
763
767
|
})
|
|
764
|
-
|
|
768
|
+
faqBotEvent.emit('faq_train.importedall', id_faq_kb);
|
|
765
769
|
return res.send(updatedFaq_kb);
|
|
766
770
|
|
|
767
771
|
})
|
|
@@ -796,7 +800,7 @@ router.get('/exportjson/:id_faq_kb', (req, res) => {
|
|
|
796
800
|
webhook_url: faq_kb.webhook_url,
|
|
797
801
|
language: faq_kb.language,
|
|
798
802
|
name: faq_kb.name,
|
|
799
|
-
|
|
803
|
+
type: faq_kb.type,
|
|
800
804
|
attributes: faq_kb.attributes,
|
|
801
805
|
intents: intents
|
|
802
806
|
}
|
|
@@ -69,6 +69,7 @@ class SubscriptionNotifier {
|
|
|
69
69
|
|
|
70
70
|
// winston.debug("s",s);
|
|
71
71
|
var secret = s.secret;
|
|
72
|
+
var xHookSecret = secret;
|
|
72
73
|
|
|
73
74
|
let sJson = s.toObject();
|
|
74
75
|
delete sJson.secret;
|
|
@@ -91,17 +92,17 @@ class SubscriptionNotifier {
|
|
|
91
92
|
if (alg) {
|
|
92
93
|
signOptions.algorithm = alg;
|
|
93
94
|
}
|
|
94
|
-
|
|
95
|
+
secret = process.env.GLOBAL_SECRET || config.secret;
|
|
95
96
|
var pKey = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY;
|
|
96
97
|
// console.log("pKey",pKey);
|
|
97
98
|
|
|
98
99
|
if (pKey) {
|
|
99
|
-
|
|
100
|
+
secret = pKey.replace(/\\n/g, '\n');
|
|
100
101
|
}
|
|
101
102
|
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
var token = jwt.sign(sJson,
|
|
105
|
+
var token = jwt.sign(sJson, secret, signOptions); //priv_jwt pp_jwt
|
|
105
106
|
json["token"] = token;
|
|
106
107
|
|
|
107
108
|
winston.debug("Calling subscription " + s.event + " TO " + s.target + " with secret " +secret+ " with json " , json);
|
|
@@ -111,7 +112,7 @@ class SubscriptionNotifier {
|
|
|
111
112
|
url: s.target,
|
|
112
113
|
headers: {
|
|
113
114
|
'Content-Type' : 'application/json',
|
|
114
|
-
'x-hook-secret':
|
|
115
|
+
'x-hook-secret': xHookSecret,
|
|
115
116
|
'User-Agent': 'tiledesk-webhooks',
|
|
116
117
|
'Origin': webhook_origin
|
|
117
118
|
},
|
|
@@ -10,19 +10,27 @@ let chatbot_training_api_url = "http://34.65.210.38/model/train"
|
|
|
10
10
|
class TrainingService {
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
train(eventName, id_faq_kb) {
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
Faq_kb.findById(id_faq_kb, (err, faq_kb) => {
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
if (err) {
|
|
18
|
+
winston.error("train error: ", err)
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!faq_kb) {
|
|
23
|
+
winston.error("faq_kb is undefined");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
18
26
|
|
|
19
27
|
if (faq_kb.intentsEngine !== 'tiledesk-ai') {
|
|
20
28
|
winston.info("intentsEngine: off")
|
|
21
29
|
return null;
|
|
22
30
|
}
|
|
23
31
|
|
|
24
|
-
winston.
|
|
25
|
-
Faq.find({ id_faq_kb:
|
|
32
|
+
winston.debug("intentsEngine: on")
|
|
33
|
+
Faq.find({ id_faq_kb: id_faq_kb }, (err, faqs) => {
|
|
26
34
|
|
|
27
35
|
if (err) {
|
|
28
36
|
winston.error("[Training] find all error: ", err);
|
|
@@ -31,7 +39,7 @@ class TrainingService {
|
|
|
31
39
|
let json = {
|
|
32
40
|
"configuration": {
|
|
33
41
|
"language": faq_kb.language,
|
|
34
|
-
"pipeline":
|
|
42
|
+
"pipeline":["lstm"]
|
|
35
43
|
},
|
|
36
44
|
"model": faq_kb._id,
|
|
37
45
|
"nlu": []
|
|
@@ -76,23 +84,27 @@ class TrainingService {
|
|
|
76
84
|
start() {
|
|
77
85
|
winston.info('TrainingService start');
|
|
78
86
|
|
|
79
|
-
faqBotEvent.on('
|
|
87
|
+
faqBotEvent.on('faq_train.importedall', (id_faq_kb) => {
|
|
88
|
+
setImmediate(() => {
|
|
89
|
+
trainingService.train('faq.importedall', id_faq_kb);
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
faqBotEvent.on('faq_train.create', (id_faq_kb) => {
|
|
80
94
|
setImmediate(() => {
|
|
81
|
-
trainingService.train('
|
|
95
|
+
trainingService.train('faq_train.create', id_faq_kb);
|
|
82
96
|
})
|
|
83
97
|
})
|
|
84
98
|
|
|
85
|
-
faqBotEvent.on('
|
|
86
|
-
winston.debug("--> event faq: ", faq);
|
|
99
|
+
faqBotEvent.on('faq_train.update', (id_faq_kb) => {
|
|
87
100
|
setImmediate(() => {
|
|
88
|
-
trainingService.train('
|
|
101
|
+
trainingService.train('faq_train.update', id_faq_kb);
|
|
89
102
|
})
|
|
90
103
|
})
|
|
91
104
|
|
|
92
|
-
faqBotEvent.on('
|
|
93
|
-
console.log("--> event faq: ", faq);
|
|
105
|
+
faqBotEvent.on('faq_train.delete', (id_faq_kb) => {
|
|
94
106
|
setImmediate(() => {
|
|
95
|
-
trainingService.train('
|
|
107
|
+
trainingService.train('faq_train.delete', id_faq_kb);
|
|
96
108
|
})
|
|
97
109
|
})
|
|
98
110
|
|
package/test/chatbot-mock.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const existing_chatbot_mock = {
|
|
2
2
|
_id: "63234fd6c69f188814749e1b",
|
|
3
3
|
webhook_enabled: false,
|
|
4
|
-
type: "
|
|
4
|
+
type: "tilebot",
|
|
5
5
|
secret: "a3577185-a8bf-4547-a000-6ba81ccb0460",
|
|
6
6
|
language: "en",
|
|
7
|
-
description: "
|
|
7
|
+
description: "A Tiledesk bot",
|
|
8
8
|
id_project: "63234fd6c69f188814749e15",
|
|
9
9
|
trashed: false,
|
|
10
10
|
createdBy: "system",
|
|
@@ -104,7 +104,7 @@ const existing_chatbot_mock = {
|
|
|
104
104
|
|
|
105
105
|
const empty_chatbot_mock = {
|
|
106
106
|
webhook_enabled: false,
|
|
107
|
-
type: '
|
|
107
|
+
type: 'tilebot',
|
|
108
108
|
secret: '0896478d-8eb3-4240-a6eb-cf2ea27b1a8e',
|
|
109
109
|
language: 'en',
|
|
110
110
|
public: false,
|
package/test/example-json.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"webhook_enabled":false,"language":"en","name":"examplebot","intents":[{"webhook_enabled":false,"enabled":true,"question":"\\start","answer":"Hi","intent_display_name":"start","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"question1","answer":"question1","intent_display_name":"question1","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"defaultFallback","answer":"I can not provide an adequate answer. Write a new question or talk to a human agent.\n* Back to start tdAction:start\n* See the docs https://docs.tiledesk.com/\n* 👨🏻🦰 I want an agent","intent_display_name":"defaultFallback","language":"en"}]}
|
|
1
|
+
{"webhook_enabled":false,"language":"en","name":"examplebot","intentsEngine":"tiledesk-ai","intents":[{"webhook_enabled":false,"enabled":true,"question":"\\start","answer":"Hi","intent_display_name":"start","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"question1","answer":"question1","intent_display_name":"question1","language":"en"},{"webhook_enabled":false,"enabled":true,"question":"defaultFallback","answer":"I can not provide an adequate answer. Write a new question or talk to a human agent.\n* Back to start tdAction:start\n* See the docs https://docs.tiledesk.com/\n* 👨🏻🦰 I want an agent","intent_display_name":"defaultFallback","language":"en"}]}
|
package/test/faqkbRoute.js
CHANGED
|
@@ -30,6 +30,7 @@ describe('FaqKBRoute', () => {
|
|
|
30
30
|
describe('/create', () => {
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
|
|
33
34
|
it('create', (done) => {
|
|
34
35
|
|
|
35
36
|
|
|
@@ -53,7 +54,15 @@ describe('FaqKBRoute', () => {
|
|
|
53
54
|
expect(res.body.name).to.equal("testbot");
|
|
54
55
|
expect(res.body.language).to.equal("fr");
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
chai.request(server)
|
|
58
|
+
.get('/' + savedProject._id + '/faq_kb/' + res.body._id)
|
|
59
|
+
.auth(email, pwd)
|
|
60
|
+
.end((err, res) => {
|
|
61
|
+
console.log("res.body", res.body);
|
|
62
|
+
res.should.have.status(200);
|
|
63
|
+
|
|
64
|
+
done();
|
|
65
|
+
});
|
|
57
66
|
});
|
|
58
67
|
|
|
59
68
|
|