@tiledesk/tiledesk-tybot-connector 2.0.26-rc1 → 2.0.26
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 +3 -29
- package/Logger.js +0 -2
- package/TdCache copy.js +242 -0
- package/engine/mock/MockBotsDataSource.js +2 -1
- package/index.js +0 -3
- package/logs/app1.log +1913 -0
- package/package.json +2 -2
- package/services/{LLMService.js → KbService.js} +3 -3
- package/tiledeskChatbotPlugs/DirectivesChatbotPlug.js +11 -29
- package/tiledeskChatbotPlugs/directives/DirAskGPTV2.js +5 -7
- package/tiledeskChatbotPlugs/directives/DirReply.js +1 -0
- package/tiledeskChatbotPlugs/directives/DirWebRequestV2.js +1 -1
- package/tiledeskChatbotPlugs/directives/DirWebRequestV2_old.js +418 -0
- package/tiledeskChatbotPlugs/directives/Directives.js +0 -1
- package/utils/TiledeskChatbotUtil.js +6 -14
- package/utils/constants.js +17 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-tybot-connector",
|
|
3
|
-
"version": "2.0.26
|
|
3
|
+
"version": "2.0.26",
|
|
4
4
|
"description": "Tiledesk Tybot connector",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@tiledesk/tiledesk-chatbot-client": "^0.5.30",
|
|
16
16
|
"@tiledesk/tiledesk-chatbot-util": "^0.8.39",
|
|
17
17
|
"@tiledesk/tiledesk-client": "^0.10.13",
|
|
18
|
-
"@tiledesk/tiledesk-multi-worker": "^0.3.
|
|
18
|
+
"@tiledesk/tiledesk-multi-worker": "^0.3.2",
|
|
19
19
|
"accept-language-parser": "^1.5.0",
|
|
20
20
|
"app-root-path": "^3.1.0",
|
|
21
21
|
"axios": "^1.7.7",
|
|
@@ -2,7 +2,7 @@ const httpUtils = require('../utils/HttpUtils');
|
|
|
2
2
|
const winston = require('../utils/winston');
|
|
3
3
|
const API_ENDPOINT = process.env.API_ENDPOINT;
|
|
4
4
|
|
|
5
|
-
class
|
|
5
|
+
class KBService {
|
|
6
6
|
|
|
7
7
|
constructor() { }
|
|
8
8
|
|
|
@@ -101,5 +101,5 @@ class LLMService {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
const
|
|
105
|
-
module.exports =
|
|
104
|
+
const kbService = new KBService();
|
|
105
|
+
module.exports = kbService;
|
|
@@ -54,13 +54,13 @@ const { DirMoveToUnassigned } = require('./directives/DirMoveToUnassigned');
|
|
|
54
54
|
const { DirAddTags } = require('./directives/DirAddTags');
|
|
55
55
|
const { DirSendWhatsapp } = require('./directives/DirSendWhatsapp');
|
|
56
56
|
const { DirReplaceBotV3 } = require('./directives/DirReplaceBotV3');
|
|
57
|
-
const { DirAiPrompt } = require('./directives/DirAiPrompt');
|
|
57
|
+
const { DirAiTask, DirAiPrompt } = require('./directives/DirAiPrompt');
|
|
58
58
|
const { DirWebResponse } = require('./directives/DirWebResponse');
|
|
59
59
|
const { DirConnectBlock } = require('./directives/DirConnectBlock');
|
|
60
|
-
const { DirAddKbContent } = require('./directives/DirAddKbContent');
|
|
61
|
-
const { DirFlowLog } = require('./directives/DirFlowLog');
|
|
62
60
|
|
|
63
61
|
const winston = require('../utils/winston');
|
|
62
|
+
const { DirFlowLog } = require('./directives/DirFlowLog');
|
|
63
|
+
const { DirAddKbContent } = require('./directives/DirAddKbContent');
|
|
64
64
|
|
|
65
65
|
class DirectivesChatbotPlug {
|
|
66
66
|
|
|
@@ -219,13 +219,14 @@ class DirectivesChatbotPlug {
|
|
|
219
219
|
directive_name = directive.name.toLowerCase();
|
|
220
220
|
}
|
|
221
221
|
if (directive && directive.action) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
222
|
+
const action_id = directive.action["_tdActionId"];
|
|
223
|
+
const locked_action_id = await this.chatbot.currentLockedAction(this.supportRequest.request_id);
|
|
224
|
+
if ( locked_action_id && (locked_action_id !== action_id) ) {
|
|
225
|
+
let next_dir = await this.nextDirective(this.directives);
|
|
226
|
+
this.process(next_dir);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
229
230
|
}
|
|
230
231
|
if (directive == null || (directive !== null && directive["name"] === undefined)) {
|
|
231
232
|
winston.debug("(DirectivesChatbotPlug) stop process(). directive is (null?): ", directive);
|
|
@@ -703,19 +704,6 @@ class DirectivesChatbotPlug {
|
|
|
703
704
|
}
|
|
704
705
|
});
|
|
705
706
|
}
|
|
706
|
-
else if (directive_name === Directives.WEBHOOK) {
|
|
707
|
-
// console.log(".....DirIntent")
|
|
708
|
-
new DirIntent(context).execute(directive, async (stop) => {
|
|
709
|
-
if (stop) {
|
|
710
|
-
if (context.log) { console.log("Stopping Actions on:", JSON.stringify(directive));}
|
|
711
|
-
this.theend();
|
|
712
|
-
}
|
|
713
|
-
else {
|
|
714
|
-
let next_dir = await this.nextDirective(this.directives);
|
|
715
|
-
this.process(next_dir);
|
|
716
|
-
}
|
|
717
|
-
});
|
|
718
|
-
}
|
|
719
707
|
else if (directive_name === Directives.WEB_RESPONSE) {
|
|
720
708
|
new DirWebResponse(context).execute(directive, async () => {
|
|
721
709
|
let next_dir = await this.nextDirective(this.directives);
|
|
@@ -728,12 +716,6 @@ class DirectivesChatbotPlug {
|
|
|
728
716
|
this.process(next_dir);
|
|
729
717
|
})
|
|
730
718
|
}
|
|
731
|
-
else if (directive_name === Directives.ADD_KB_CONTENT) {
|
|
732
|
-
new DirAddKbContent(context).execute(directive, async () => {
|
|
733
|
-
let next_dir = await this.nextDirective(this.directives);
|
|
734
|
-
this.process(next_dir);
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
719
|
else {
|
|
738
720
|
let next_dir = await this.nextDirective(this.directives);
|
|
739
721
|
this.process(next_dir);
|
|
@@ -11,10 +11,8 @@ const winston = require('../../utils/winston');
|
|
|
11
11
|
const httpUtils = require("../../utils/HttpUtils");
|
|
12
12
|
const integrationService = require("../../services/IntegrationService");
|
|
13
13
|
const { Logger } = require("../../Logger");
|
|
14
|
+
const kbService = require("../../services/KbService");
|
|
14
15
|
const quotasService = require("../../services/QuotasService");
|
|
15
|
-
const llmService = require("../../services/LLMService");
|
|
16
|
-
|
|
17
|
-
|
|
18
16
|
|
|
19
17
|
class DirAskGPTV2 {
|
|
20
18
|
|
|
@@ -173,7 +171,7 @@ class DirAskGPTV2 {
|
|
|
173
171
|
if (!key) {
|
|
174
172
|
this.logger.native("[Ask Knowledge Base] OpenAI key not found in Integration. Using shared OpenAI key");
|
|
175
173
|
winston.verbose("DirAskGPTV2 - Key not found in Integrations. Searching in kb settings...");
|
|
176
|
-
key = await
|
|
174
|
+
key = await kbService.getKeyFromKbSettings(this.projectId, this.token);
|
|
177
175
|
}
|
|
178
176
|
|
|
179
177
|
if (!key) {
|
|
@@ -363,7 +361,7 @@ class DirAskGPTV2 {
|
|
|
363
361
|
}
|
|
364
362
|
} else {
|
|
365
363
|
await this.#assignAttributes(action, answer, source);
|
|
366
|
-
|
|
364
|
+
kbService.addUnansweredQuestion(this.projectId, json.namespace, json.question, this.token).catch((err) => {
|
|
367
365
|
winston.error("DirAskGPTV2 - Error adding unanswered question: ", err);
|
|
368
366
|
this.logger.warn("[Ask Knowledge Base] Unable to add unanswered question", json.question, "to namespacae", json.namespace);
|
|
369
367
|
})
|
|
@@ -522,10 +520,10 @@ class DirAskGPTV2 {
|
|
|
522
520
|
return new Promise((resolve) => {
|
|
523
521
|
let engine = {
|
|
524
522
|
name: "pinecone",
|
|
525
|
-
type: isHybrid ? "serverless" :
|
|
523
|
+
type: isHybrid ? "serverless" : process.env.PINECONE_TYPE,
|
|
526
524
|
apikey: "",
|
|
527
525
|
vector_size: 1536,
|
|
528
|
-
index_name: isHybrid ?
|
|
526
|
+
index_name: isHybrid ? process.env.PINECONE_INDEX_HYBRID : process.env.PINECONE_INDEX
|
|
529
527
|
}
|
|
530
528
|
resolve(engine);
|
|
531
529
|
})
|
|
@@ -118,7 +118,7 @@ class DirWebRequestV2 {
|
|
|
118
118
|
this.logger.native("[Web Request] resbody: ", resbody);
|
|
119
119
|
|
|
120
120
|
if (err) {
|
|
121
|
-
this.logger.error("
|
|
121
|
+
this.logger.error("WebRequest error: ", err);
|
|
122
122
|
winston.log("webRequest error: ", err);
|
|
123
123
|
if (callback) {
|
|
124
124
|
if (falseIntent) {
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
let axios = require('axios');
|
|
2
|
+
let https = require("https");
|
|
3
|
+
const { Filler } = require('../Filler');
|
|
4
|
+
const { TiledeskChatbot } = require('../../engine/TiledeskChatbot');
|
|
5
|
+
const { DirIntent } = require('./DirIntent');
|
|
6
|
+
|
|
7
|
+
class DirWebRequestV2 {
|
|
8
|
+
constructor(context) {
|
|
9
|
+
if (!context) {
|
|
10
|
+
throw new Error('context object is mandatory.');
|
|
11
|
+
}
|
|
12
|
+
this.context = context;
|
|
13
|
+
this.tdcache = context.tdcache;
|
|
14
|
+
this.requestId = context.requestId;
|
|
15
|
+
this.chatbot = context.chatbot;
|
|
16
|
+
this.log = context.log;
|
|
17
|
+
|
|
18
|
+
this.intentDir = new DirIntent(context);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
execute(directive, callback) {
|
|
22
|
+
let action;
|
|
23
|
+
if (directive.action) {
|
|
24
|
+
action = directive.action;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.error("Incorrect directive:", JSON.stringify(directive));
|
|
28
|
+
callback();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.go(action, (stop) => {
|
|
32
|
+
if (this.log) {console.log("(webrequestv2, stop?", stop); }
|
|
33
|
+
callback(stop);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async go(action, callback) {
|
|
38
|
+
if (this.log) {console.log("webRequest action:", JSON.stringify(action));}
|
|
39
|
+
|
|
40
|
+
// Condition branches
|
|
41
|
+
let trueIntent = action.trueIntent;
|
|
42
|
+
let falseIntent = action.falseIntent;
|
|
43
|
+
const trueIntentAttributes = action.trueIntentAttributes;
|
|
44
|
+
const falseIntentAttributes = action.falseIntentAttributes;
|
|
45
|
+
let stopOnConditionMet = action.stopOnConditionMet;
|
|
46
|
+
if (trueIntent && trueIntent.trim() === "") {
|
|
47
|
+
trueIntent = null;
|
|
48
|
+
}
|
|
49
|
+
if (falseIntent && falseIntent.trim() === "") {
|
|
50
|
+
falseIntent = null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let requestAttributes = null;
|
|
54
|
+
if (this.tdcache) {
|
|
55
|
+
requestAttributes =
|
|
56
|
+
await TiledeskChatbot.allParametersStatic(
|
|
57
|
+
this.tdcache, this.requestId
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const filler = new Filler();
|
|
61
|
+
const url = filler.fill(action.url, requestAttributes);
|
|
62
|
+
|
|
63
|
+
let headers = {};
|
|
64
|
+
if (action.headersString) {
|
|
65
|
+
let headersDict = action.headersString
|
|
66
|
+
for (const [key, value] of Object.entries(headersDict)) {
|
|
67
|
+
if (this.log) {console.log("header:", key, "value:", value)}
|
|
68
|
+
let filled_value = filler.fill(value, requestAttributes);
|
|
69
|
+
headers[key] = filled_value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let json = null;
|
|
74
|
+
try {
|
|
75
|
+
if (action.jsonBody && action.bodyType == "json") {
|
|
76
|
+
if (this.log) {console.log("action.body is:", action.jsonBody);}
|
|
77
|
+
let jsonBody = filler.fill(action.jsonBody, requestAttributes);
|
|
78
|
+
try {
|
|
79
|
+
json = JSON.parse(jsonBody);
|
|
80
|
+
if (this.log) {console.log("json is:", json);}
|
|
81
|
+
}
|
|
82
|
+
catch(err) {
|
|
83
|
+
console.error("Error parsing webRequest jsonBody:", jsonBody);
|
|
84
|
+
if (callback) {
|
|
85
|
+
if (falseIntent) {
|
|
86
|
+
await this.chatbot.addParameter("flowError", "Error parsing jsonBody");
|
|
87
|
+
this.#executeCondition(false, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, () => {
|
|
88
|
+
console.log('herrrrr 11111' )
|
|
89
|
+
callback(true); // stop the flow
|
|
90
|
+
return;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log('herrrrr 2222' )
|
|
95
|
+
callback(false); // continue the flow
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (action.formData && action.bodyType == "form-data") {
|
|
102
|
+
let formData = filler.fill(action.formData, requestAttributes);
|
|
103
|
+
if (this.log) {console.log("action.body is form-data:", formData);}
|
|
104
|
+
// // fill
|
|
105
|
+
if (formData && formData.length > 0) {
|
|
106
|
+
for (let i = 0; i < formData.length; i++) {
|
|
107
|
+
let field = formData[i];
|
|
108
|
+
if (field.value) {
|
|
109
|
+
field.value = filler.fill(field.value, requestAttributes);
|
|
110
|
+
if (this.log) {console.log("field filled:", field.value);}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
json = {};
|
|
115
|
+
for (let i = 0; i < formData.length; i++) {
|
|
116
|
+
let field = formData[i];
|
|
117
|
+
if (field.enabled && field.value && field.type === "URL") {
|
|
118
|
+
if (this.log) {console.log("Getting file:", field.value);}
|
|
119
|
+
let response = await axios.get(field.value,
|
|
120
|
+
{
|
|
121
|
+
responseType: 'stream'
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
let stream = response.data;
|
|
125
|
+
// if (this.log) {console.log("Stream data:", stream);}
|
|
126
|
+
json[field.name] = stream;
|
|
127
|
+
// process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
else if (field.enabled && field.value && field.type === "Text") {
|
|
130
|
+
json[field.name] = field.value;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (this.log) {console.log("final json:", json);}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
if (this.log) {console.log("no action upload parts");}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
catch(error) {
|
|
141
|
+
console.error("Error", error);
|
|
142
|
+
if (callback) {
|
|
143
|
+
if (falseIntent) {
|
|
144
|
+
await this.chatbot.addParameter("flowError", "Error: " + error);
|
|
145
|
+
this.#executeCondition(false, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, () => {
|
|
146
|
+
callback(true); // stop the flow
|
|
147
|
+
return;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
callback(false); // continue the flow
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
let timeout = this.#webrequest_timeout(action, 20000, 1, 300000);
|
|
160
|
+
|
|
161
|
+
if (this.log) {console.log("webRequest URL", url);}
|
|
162
|
+
|
|
163
|
+
const HTTPREQUEST = {
|
|
164
|
+
url: url,
|
|
165
|
+
headers: headers,
|
|
166
|
+
json: json,
|
|
167
|
+
method: action.method,
|
|
168
|
+
timeout: timeout
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
if (this.log) {console.log("webRequest HTTPREQUEST", HTTPREQUEST);}
|
|
172
|
+
this.#myrequest(
|
|
173
|
+
HTTPREQUEST, async (err, res) => {
|
|
174
|
+
if (this.log && err) {
|
|
175
|
+
console.log("webRequest error:", err);
|
|
176
|
+
}
|
|
177
|
+
if (this.log) {console.log("got res:", res);}
|
|
178
|
+
let resbody = res.data;
|
|
179
|
+
let status = res.status;
|
|
180
|
+
let error = res.error;
|
|
181
|
+
await this.#assignAttributes(action, resbody, status, error)
|
|
182
|
+
if (this.log) {console.log("webRequest resbody:", resbody);}
|
|
183
|
+
if (err) {
|
|
184
|
+
if (this.log) {console.error("webRequest error:", err);}
|
|
185
|
+
if (callback) {
|
|
186
|
+
if (falseIntent) {
|
|
187
|
+
this.#executeCondition(false, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, () => {
|
|
188
|
+
callback(true); // stop the flow
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
callback(false); // continue the flow
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if(res.status >= 200 && res.status <= 299) {
|
|
197
|
+
if (trueIntent) {
|
|
198
|
+
await this.#executeCondition(true, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, () => {
|
|
199
|
+
callback(true); // stop the flow
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
callback(false); // continue the flow
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
if (falseIntent) {
|
|
208
|
+
this.#executeCondition(false, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, () => {
|
|
209
|
+
callback(true); // stop the flow
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
callback(false); // continue the flow
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async #executeCondition(result, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, callback) {
|
|
221
|
+
let trueIntentDirective = null;
|
|
222
|
+
if (trueIntent) {
|
|
223
|
+
trueIntentDirective = DirIntent.intentDirectiveFor(trueIntent, trueIntentAttributes);
|
|
224
|
+
}
|
|
225
|
+
let falseIntentDirective = null;
|
|
226
|
+
if (falseIntent) {
|
|
227
|
+
falseIntentDirective = DirIntent.intentDirectiveFor(falseIntent, falseIntentAttributes);
|
|
228
|
+
}
|
|
229
|
+
if (result === true) {
|
|
230
|
+
if (trueIntentDirective) {
|
|
231
|
+
this.intentDir.execute(trueIntentDirective, () => {
|
|
232
|
+
callback();
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
if (this.log) {console.log("No trueIntentDirective specified");}
|
|
237
|
+
callback();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
if (falseIntentDirective) {
|
|
242
|
+
this.intentDir.execute(falseIntentDirective, () => {
|
|
243
|
+
callback();
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
if (this.log) {console.log("No falseIntentDirective specified");}
|
|
248
|
+
callback();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async #assignAttributes(action, resbody, status, error) {
|
|
254
|
+
if (this.log) {
|
|
255
|
+
console.log("assignAttributes resbody:", resbody)
|
|
256
|
+
console.log("assignAttributes error:", error)
|
|
257
|
+
console.log("assignAttributes status:", status)
|
|
258
|
+
console.log("assignAttributes action:", action)
|
|
259
|
+
}
|
|
260
|
+
if (this.context.tdcache) {
|
|
261
|
+
if (action.assignResultTo && resbody) {
|
|
262
|
+
if (this.log) {console.log("assign assignResultTo:", resbody);}
|
|
263
|
+
await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignResultTo, resbody);
|
|
264
|
+
}
|
|
265
|
+
if (action.assignErrorTo && error) {
|
|
266
|
+
if (this.log) {console.log("assign assignResultTo:", error);}
|
|
267
|
+
await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignErrorTo, error);
|
|
268
|
+
}
|
|
269
|
+
if (action.assignStatusTo && status) {
|
|
270
|
+
if (this.log) {console.log("assign assignStatusTo:", status);}
|
|
271
|
+
await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, action.assignStatusTo, status);
|
|
272
|
+
}
|
|
273
|
+
// Debug log
|
|
274
|
+
if (this.log) {
|
|
275
|
+
const all_parameters = await TiledeskChatbot.allParametersStatic(this.context.tdcache, this.context.requestId);
|
|
276
|
+
for (const [key, value] of Object.entries(all_parameters)) {
|
|
277
|
+
if (this.log) {console.log("(webRequest) request parameter:", key, "value:", value, "type:", typeof value)}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
#myrequest(options, callback) {
|
|
284
|
+
try {
|
|
285
|
+
if (this.log) {
|
|
286
|
+
console.log("API URL:", options.url);
|
|
287
|
+
//console.log("** Options:", JSON.stringify(options));
|
|
288
|
+
// Stringify "options". FIX THE STRINGIFY OF CIRCULAR STRUCTURE BUG - START
|
|
289
|
+
let cache = [];
|
|
290
|
+
let str_Options = JSON.stringify(options, function(key, value) { // try to use a separate function
|
|
291
|
+
if (typeof value === 'object' && value != null) {
|
|
292
|
+
if (cache.indexOf(value) !== -1) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
cache.push(value);
|
|
296
|
+
}
|
|
297
|
+
return value;
|
|
298
|
+
});
|
|
299
|
+
console.log("** Options:", str_Options);
|
|
300
|
+
}
|
|
301
|
+
let axios_options = {
|
|
302
|
+
url: options.url,
|
|
303
|
+
method: options.method,
|
|
304
|
+
params: options.params,
|
|
305
|
+
headers: options.headers,
|
|
306
|
+
timeout: options.timeout,
|
|
307
|
+
maxContentLength: 10000000, // max 10mb response size
|
|
308
|
+
maxBodyLength: 10000000 // max 10mb request body size
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (options.json !== null) {
|
|
312
|
+
axios_options.data = options.json
|
|
313
|
+
}
|
|
314
|
+
// if (this.log) {
|
|
315
|
+
// console.log("axios_options:", JSON.stringify(axios_options));
|
|
316
|
+
// }
|
|
317
|
+
if (options.url.startsWith("https:")) {
|
|
318
|
+
const httpsAgent = new https.Agent({
|
|
319
|
+
rejectUnauthorized: false,
|
|
320
|
+
});
|
|
321
|
+
axios_options.httpsAgent = httpsAgent;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
axios(axios_options)
|
|
325
|
+
.then((res) => {
|
|
326
|
+
if (this.log) {
|
|
327
|
+
console.log("Success Response:", res);
|
|
328
|
+
console.log("Response for url:", options.url);
|
|
329
|
+
console.log("Response headers:\n", JSON.stringify(res.headers));
|
|
330
|
+
}
|
|
331
|
+
if (callback) {
|
|
332
|
+
callback(null, res);
|
|
333
|
+
}
|
|
334
|
+
})
|
|
335
|
+
.catch( (err) => {
|
|
336
|
+
if (this.log) {
|
|
337
|
+
if (err.response) {
|
|
338
|
+
console.log("Error Response data:", err.response.data);
|
|
339
|
+
}
|
|
340
|
+
// FIX THE STRINGIFY OF CIRCULAR STRUCTURE BUG - START
|
|
341
|
+
let cache = [];
|
|
342
|
+
let error_log = JSON.stringify(err, function(key, value) { // try to use a separate function
|
|
343
|
+
if (typeof value === 'object' && value != null) {
|
|
344
|
+
if (cache.indexOf(value) !== -1) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
cache.push(value);
|
|
348
|
+
}
|
|
349
|
+
return value;
|
|
350
|
+
});
|
|
351
|
+
console.error("An error occurred: ", error_log);
|
|
352
|
+
// FIX THE STRINGIFY OF CIRCULAR STRUCTURE BUG - END
|
|
353
|
+
// console.error("An error occurred:", JSON.stringify(err));
|
|
354
|
+
}
|
|
355
|
+
if (callback) {
|
|
356
|
+
let status = 1000;
|
|
357
|
+
let cache = [];
|
|
358
|
+
let str_error = JSON.stringify(err, function(key, value) { // try to use a separate function
|
|
359
|
+
if (typeof value === 'object' && value != null) {
|
|
360
|
+
if (cache.indexOf(value) !== -1) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
cache.push(value);
|
|
364
|
+
}
|
|
365
|
+
return value;
|
|
366
|
+
});
|
|
367
|
+
let error = JSON.parse(str_error) // "status" disappears without this trick
|
|
368
|
+
let errorMessage = JSON.stringify(error);
|
|
369
|
+
if (error.status) {
|
|
370
|
+
status = error.status;
|
|
371
|
+
}
|
|
372
|
+
if (error.message) {
|
|
373
|
+
errorMessage = error.message;
|
|
374
|
+
}
|
|
375
|
+
let data = null;
|
|
376
|
+
if (err.response) {
|
|
377
|
+
data = err.response.data;
|
|
378
|
+
}
|
|
379
|
+
callback(
|
|
380
|
+
null, {
|
|
381
|
+
status: status,
|
|
382
|
+
data: data,
|
|
383
|
+
error: errorMessage
|
|
384
|
+
}
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
catch(error) {
|
|
390
|
+
console.error("Error:", error);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
#webrequest_timeout(action, default_timeout, min, max) {
|
|
395
|
+
let timeout = default_timeout;
|
|
396
|
+
if (!action.settings) {
|
|
397
|
+
return timeout;
|
|
398
|
+
}
|
|
399
|
+
// console.log("default timeout:", timeout);
|
|
400
|
+
// console.log("action.settings:", action.settings);
|
|
401
|
+
// console.log("action.settings.timeout:", action.settings.timeout);
|
|
402
|
+
// console.log("typeof action.settings.timeout:", typeof action.settings.timeout);
|
|
403
|
+
// console.log("action.settings.timeout > min", action.settings.timeout > min)
|
|
404
|
+
// console.log("action.settings.timeout < max", action.settings.timeout < max)
|
|
405
|
+
|
|
406
|
+
if (action.settings.timeout) {
|
|
407
|
+
if ((typeof action.settings.timeout === "number") && action.settings.timeout > min && action.settings.timeout < max) {
|
|
408
|
+
timeout = Math.round(action.settings.timeout)
|
|
409
|
+
// console.log("new timeout:", timeout);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// console.log("returning timeout:", timeout);
|
|
413
|
+
return timeout
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
module.exports = { DirWebRequestV2 };
|
|
@@ -58,7 +58,6 @@ class Directives {
|
|
|
58
58
|
static MOVE_TO_UNASSIGNED = "move_to_unassigned";
|
|
59
59
|
static CONNECT_BLOCK = "connect_block";
|
|
60
60
|
static ADD_TAGS = 'add_tags'
|
|
61
|
-
static WEBHOOK = 'webhook';
|
|
62
61
|
static WEB_RESPONSE = "web_response";
|
|
63
62
|
static FLOW_LOG = "flow_log";
|
|
64
63
|
static ADD_KB_CONTENT = "add_kb_content";
|
|
@@ -8,6 +8,8 @@ require('dotenv').config();
|
|
|
8
8
|
let axios = require('axios');
|
|
9
9
|
const winston = require('./winston');
|
|
10
10
|
|
|
11
|
+
const { CHANNEL_NAME } = require('./constants.js')
|
|
12
|
+
|
|
11
13
|
class TiledeskChatbotUtil {
|
|
12
14
|
|
|
13
15
|
static parseIntent(explicit_intent_name) {
|
|
@@ -305,9 +307,7 @@ class TiledeskChatbotUtil {
|
|
|
305
307
|
let command = commands[i];
|
|
306
308
|
if (command.type === 'message' && command.message) {
|
|
307
309
|
if (command.message.attributes && command.message.attributes.attachment && command.message.attributes.attachment.json_buttons){
|
|
308
|
-
// console.log("command with buttons ok:")
|
|
309
310
|
let json_buttons_string = command.message.attributes.attachment.json_buttons;
|
|
310
|
-
console.log("json_buttons_string:", json_buttons_string)
|
|
311
311
|
let final_buttons = this.renderJSONButtons(json_buttons_string, flow_attributes);
|
|
312
312
|
// let final_buttons = [];
|
|
313
313
|
// try {
|
|
@@ -430,36 +430,27 @@ class TiledeskChatbotUtil {
|
|
|
430
430
|
}
|
|
431
431
|
|
|
432
432
|
static replaceJSONGalleries(message, flow_attributes) {
|
|
433
|
-
console.log("replaceJSONGalleries...");
|
|
434
433
|
if (message.attributes && message.attributes.commands) {
|
|
435
|
-
console.log("message.attributes && message.attributes.commands...");
|
|
436
434
|
let commands = message.attributes.commands;
|
|
437
435
|
if (commands.length > 0) {
|
|
438
|
-
console.log("commands.length > 0");
|
|
439
436
|
for (let i = 0; i < commands.length; i++) {
|
|
440
437
|
let command = commands[i];
|
|
441
|
-
console.log("command:", JSON.stringify(command));
|
|
442
438
|
if (command.type === 'message' && command.message) {
|
|
443
|
-
console.log("command.type === 'message' && command.message");
|
|
444
439
|
if (command.message.attributes && command.message.attributes.attachment && command.message.attributes.attachment.json_gallery){
|
|
445
|
-
console.log("command with json_galley")
|
|
446
440
|
let final_gallery = [];
|
|
447
441
|
try {
|
|
448
442
|
// fill previews
|
|
449
443
|
const filler = new Filler();
|
|
450
444
|
let json_gallery_string = command.message.attributes.attachment.json_gallery;
|
|
451
|
-
console.log("gallerystring is:", json_gallery_string)
|
|
452
445
|
json_gallery_string = filler.fill(json_gallery_string, flow_attributes);
|
|
453
446
|
let json_gallery = JSON.parse(json_gallery_string);
|
|
454
447
|
if (Array.isArray(json_gallery)) {
|
|
455
|
-
console.log("is gallery")
|
|
456
448
|
json_gallery.forEach(el => {
|
|
457
449
|
if (el.buttons) {
|
|
458
450
|
el.buttons = TiledeskChatbotUtil.renderJSONButtons(JSON.stringify(el.buttons));
|
|
459
451
|
}
|
|
460
452
|
final_gallery.push(el);
|
|
461
453
|
});
|
|
462
|
-
console.log("final: ", final_gallery)
|
|
463
454
|
}
|
|
464
455
|
else {
|
|
465
456
|
winston.verbose("Invalid json_gallery.");
|
|
@@ -530,9 +521,7 @@ class TiledeskChatbotUtil {
|
|
|
530
521
|
catch(error) {
|
|
531
522
|
winston.warn("Error on JSON gallery parsing:", error);
|
|
532
523
|
}
|
|
533
|
-
console.log("final gallery...", final_gallery)
|
|
534
524
|
if (final_gallery && final_gallery.length > 0) {
|
|
535
|
-
console.log("updating with final gallery...", final_gallery)
|
|
536
525
|
command.message.attributes.attachment.gallery = final_gallery;
|
|
537
526
|
delete command.message.attributes.attachment.json_gallery;
|
|
538
527
|
}
|
|
@@ -792,7 +781,10 @@ class TiledeskChatbotUtil {
|
|
|
792
781
|
if (message.request.lead.phone) {
|
|
793
782
|
await chatbot.addParameter(TiledeskChatbotConst.REQ_USER_PHONE_KEY, message.request.lead.phone);
|
|
794
783
|
}
|
|
795
|
-
if (message.request.lead.lead_id && message.request.lead.lead_id.startsWith("wab-")
|
|
784
|
+
if (message.request.lead.lead_id && (message.request.lead.lead_id.startsWith("wab-") ||
|
|
785
|
+
message.request.lead.lead_id.startsWith("vxml-") ||
|
|
786
|
+
message.request.lead.lead_id.startsWith(CHANNEL_NAME.VOICE_TWILIO) ||
|
|
787
|
+
message.request.lead.lead_id.startsWith(CHANNEL_NAME.SMS))) {
|
|
796
788
|
const splits = message.request.lead.lead_id.split("-");
|
|
797
789
|
if (splits && splits.length > 1) {
|
|
798
790
|
await chatbot.addParameter(TiledeskChatbotConst.REQ_CURRENT_PHONE_NUMBER_KEY,splits[1]);
|