Skip to content

Commit c3cba72

Browse files
committed
Merge branch 'master-COLLAUDO' into features-2605/delete-sitemap-coll1
2 parents 15a38f4 + 3d20345 commit c3cba72

104 files changed

Lines changed: 6958 additions & 1378 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.sample

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,9 @@ WIDGET_TEST_LOCATION=http://localhost:4200/assets/test_widget_page/index.html
139139

140140
#NPM_TOKEN=XXXX
141141
#Enable enterprise module with npm private token
142+
143+
# Analytics ingest sidecar (tiledesk-analytics)
144+
# Uncomment and set these to forward analytics events to the ingest service.
145+
# ANALYTICS_INGEST_URL is required; without it all analytics events are silently dropped.
146+
#ANALYTICS_INGEST_URL=http://localhost:3003
147+
#ANALYTICS_INGEST_API_KEY=

.gitignore

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ config/.firebase-key
44
data
55
.firebasekey-pre.json
66
.firebasekey.json
7-
.env
7+
.env*
88
copyfiles
9-
logs
9+
logs
10+
.idea
11+
**/.DS_Store
12+
CLAUDE.md
13+
.claude

.vscode/launch.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
// Usare IntelliSense per informazioni sui possibili attributi.
3+
// Al passaggio del mouse vengono visualizzate le descrizioni degli attributi esistenti.
4+
// Per altre informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Attach",
9+
"port": 9229,
10+
"request": "attach",
11+
"skipFiles": [
12+
"<node_internals>/**"
13+
],
14+
"type": "node"
15+
},
16+
{
17+
"type": "node",
18+
"request": "launch",
19+
"name": "Avvia programma",
20+
"skipFiles": [
21+
"<node_internals>/**"
22+
],
23+
"program": "${workspaceFolder}/bin/www"
24+
}
25+
]
26+
}

CHANGELOG.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,25 @@
1414
- Enabled Situated Context for enhanced Knowledge Base content indexing
1515
- Bumped tybot-connector version to 2.0.48
1616

17+
# 2.18.4-rc35
18+
- Disabled Authentication in URL Preview
19+
- Added Max 10 URLs per request — returns 422 if exceeded
20+
- Added SSRF Validation
21+
22+
# 2.18.4-rc32
23+
- Updated maxContentLength limit
24+
25+
# 2.18.4-rc31
26+
- Updated url-preview service
27+
28+
# 2.18.4-rc27
29+
- Added url-preview service
30+
1731
# 2.18.3
1832
- Added permissions logic
1933
- Added custom roles support
34+
35+
# 2.17.5
2036
- Add answered questions functionality
2137
- Added AnsweredQuestion schema with TTL index for automatic deletion.
2238
- Updated UnansweredQuestion schema to include additional fields and improved query handling for searching and sorting.
@@ -75,7 +91,7 @@
7591
- Added migration script to add the contact field in request object improving the search by phone number
7692

7793
# 2.15.2
78-
- Updated GitHub actions
94+
- Updated GitHub actionsm
7995

8096
# 2.15.1
8197
- Updated whatsapp-connector to 1.0.24

Dockerfile-en

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ WORKDIR /usr/src/app
1111
ARG NPM_TOKEN
1212
ARG VOICE_TOKEN
1313
ARG VOICE_TWILIO_TOKEN
14+
ARG VOICE_ENGHOUSE_TOKEN
1415

1516
COPY .npmrc_ .npmrc
1617

1718
# Set environment variable based on build argument
1819
ENV VOICE_TOKEN=${VOICE_TOKEN}
1920
ENV VOICE_TWILIO_TOKEN=${VOICE_TWILIO_TOKEN}
21+
ENV VOICE_ENGHOUSE_TOKEN=${VOICE_ENGHOUSE_TOKEN}
2022

2123
# Install app dependencies
2224
# A wildcard is used to ensure both package.json AND package-lock.json are copied

app.js

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ winston.info("DB AutoIndex: " + autoIndex);
6969
let useUnifiedTopology = process.env.MONGOOSE_UNIFIED_TOPOLOGY === 'true';
7070
winston.info("DB useUnifiedTopology: ", useUnifiedTopology, typeof useUnifiedTopology);
7171

72+
7273
var connection = mongoose.connect(databaseUri, { "useNewUrlParser": true, "autoIndex": autoIndex, "useUnifiedTopology": useUnifiedTopology }, function(err) {
7374
if (err) {
7475
winston.error('Failed to connect to MongoDB on ' + databaseUri + " ", err);
@@ -77,11 +78,13 @@ var connection = mongoose.connect(databaseUri, { "useNewUrlParser": true, "autoI
7778
winston.info("Mongoose connection done on host: "+mongoose.connection.host + " on port: " + mongoose.connection.port + " with name: "+ mongoose.connection.name)// , mongoose.connection.db);
7879
});
7980
if (process.env.MONGOOSE_DEBUG==="true") {
81+
winston.info("Mongoose log enabled");
8082
mongoose.set('debug', true);
8183
}
8284
mongoose.set('useFindAndModify', false); // https://mongoosejs.com/docs/deprecations.html#-findandmodify-
8385
mongoose.set('useCreateIndex', true);
8486
//mongoose.set('useUnifiedTopology', false);
87+
//mongoose.set('useUnifiedTopology', useUnifiedTopology);
8588

8689
// CONNECT REDIS - CHECK IT
8790
const { TdCache } = require('./utils/TdCache');
@@ -93,6 +96,9 @@ let tdCache = new TdCache({
9396

9497
tdCache.connect();
9598

99+
var cacheManager = require('./utils/cacheManager');
100+
cacheManager.setClient(tdCache);
101+
96102
// ROUTES DECLARATION
97103
var troubleshooting = require('./routes/troubleshooting');
98104
var auth = require('./routes/auth');
@@ -125,6 +131,7 @@ var widgets = require('./routes/widget');
125131
var widgetsLoader = require('./routes/widgetLoader');
126132
var openai = require('./routes/openai');
127133
var llm = require('./routes/llm');
134+
var urlPreview = require('./routes/urlPreview');
128135
var quotes = require('./routes/quotes');
129136
var integration = require('./routes/integration')
130137
var kbsettings = require('./routes/kbsettings');
@@ -153,6 +160,8 @@ var webhooks = require('./routes/webhooks');
153160
var roles = require('./routes/roles');
154161
var copilot = require('./routes/copilot');
155162
var mcp = require('./routes/mcp');
163+
var scheduler = require('./routes/scheduledJobs');
164+
var voice = require('./routes/voice');
156165

157166
var bootDataLoader = require('./services/bootDataLoader');
158167
var settingDataLoader = require('./services/settingDataLoader');
@@ -267,6 +276,7 @@ app.set('chatbot_service', new ChatbotService())
267276
app.set('redis_client', tdCache);
268277
app.set('quote_manager', qm);
269278
app.set('rate_manager', rm);
279+
app.set('trust proxy', true);
270280

271281
// TODO DELETE IT IN THE NEXT RELEASE
272282
if (process.env.ENABLE_ALTERNATIVE_CORS_MIDDLEWARE === "true") {
@@ -349,32 +359,38 @@ if (process.env.DISABLE_SESSION_STRATEGY==true || process.env.DISABLE_SESSION_S
349359
// redisClient.connect().catch(console.error)
350360

351361
let cacheClient = undefined;
352-
if (pubModulesManager.cache) {
362+
if (pubModulesManager.cache && pubModulesManager.cache._cache && pubModulesManager.cache._cache._cache) {
353363
cacheClient = pubModulesManager.cache._cache._cache; //_cache._cache to jump directly to redis modules without cacheoose wrapper (don't support await)
354364
}
365+
366+
if (cacheClient) {
355367
// winston.info("Express Session cacheClient",cacheClient);
356368

357369

358-
let redisStore = new RedisStore({
359-
client: cacheClient,
360-
prefix: "sessions:",
361-
})
362-
363-
app.use(
364-
session({
365-
store: redisStore,
366-
resave: false, // required: force lightweight session keep alive (touch)
367-
saveUninitialized: false, // recommended: only save session when data exists
368-
secret: sessionSecret,
369-
cookie: {
370-
secure: true, // ✅ Use HTTPS
371-
httpOnly: true, // ✅ Only accessible by the server (not client-side JS)
372-
sameSite: 'None' // ✅ Allows cross-origin (e.g., Keycloak on a different domain)
373-
}
370+
let redisStore = new RedisStore({
371+
client: cacheClient,
372+
prefix: "sessions:",
374373
})
375-
)
376-
winston.info("Express Session with Redis enabled with Secret: " + sessionSecret);
377374

375+
app.use(
376+
session({
377+
store: redisStore,
378+
resave: false, // required: force lightweight session keep alive (touch)
379+
saveUninitialized: false, // recommended: only save session when data exists
380+
secret: sessionSecret,
381+
cookie: {
382+
secure: true, // ✅ Use HTTPS
383+
httpOnly: true, // ✅ Only accessible by the server (not client-side JS)
384+
sameSite: 'None' // ✅ Allows cross-origin (e.g., Keycloak on a different domain)
385+
}
386+
})
387+
)
388+
winston.info("Express Session with Redis enabled with Secret: " + sessionSecret);
389+
} else {
390+
winston.warn("ENABLE_REDIS_SESSION is true but Redis cache is not available (pubmodules cache not initialized). Using default in-memory session store.");
391+
app.use(session({ secret: sessionSecret}));
392+
winston.info("Express Session enabled with Secret: " + sessionSecret);
393+
}
378394

379395
} else {
380396
app.use(session({ secret: sessionSecret}));
@@ -634,8 +650,10 @@ app.use('/:projectid/emails',[passport.authenticate(['basic', 'jwt'], { session:
634650
app.use('/:projectid/properties',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], property);
635651
app.use('/:projectid/segments',[passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], segment);
636652

637-
app.use('/:projectid/llm', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('admin', ['bot','subscription'])], llm);
653+
//app.use('/:projectid/llm', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('admin', ['bot','subscription'])], llm);
654+
app.use('/:projectid/llm', llm);
638655
app.use('/:projectid/openai', openai);
656+
app.use('/:projectid/url-preview', urlPreview);
639657
app.use('/:projectid/quotes', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], quotes)
640658

641659
app.use('/:projectid/integration', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('admin', ['bot','subscription'])], integration )
@@ -650,7 +668,9 @@ app.use('/:projectid/kb', [passport.authenticate(['basic', 'jwt'], { session: fa
650668
app.use('/:projectid/logs', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], logs);
651669

652670
app.use('/:projectid/webhooks', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], webhooks);
671+
app.use('/:projectid/scheduler', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('admin', ['bot','subscription'])], scheduler);
653672
app.use('/:projectid/copilot', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], copilot);
673+
app.use('/:projectid/voice', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], voice);
654674
app.use('/:projectid/roles', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], roles);
655675

656676
app.use('/:projectid/files', filesp);

channels/chat21/chat21Handler.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,9 +527,15 @@ class Chat21Handler {
527527
requestEvent.on('request.create', function(request) {
528528

529529
winston.debug("chat21Handler requestEvent request.create called" , request);
530+
console.log('[WELCOME_MSG_FLOW] chat21Handler: received request.create', { request_id: request.request_id, channelOutbound: request.channelOutbound?.name, first_text: request.first_text });
530531
// setImmediate(() => {
531532
// perche nn c'è setImmedite? per performace
532-
if (request.channelOutbound.name === ChannelConstants.CHAT21) {
533+
if (request.channelOutbound && request.channelOutbound.name === ChannelConstants.CHAT21) {
534+
console.log('[WELCOME_MSG_FLOW] chat21Handler: channelOutbound is CHAT21, creating group');
535+
} else {
536+
console.log('[WELCOME_MSG_FLOW] chat21Handler: channelOutbound is NOT CHAT21, skipping group creation', { channelOutbound: request.channelOutbound, channelOutboundName: request.channelOutbound?.name, expected: ChannelConstants.CHAT21 });
537+
}
538+
if (request.channelOutbound && request.channelOutbound.name === ChannelConstants.CHAT21) {
533539

534540
chat21.auth.setAdminToken(adminToken);
535541

@@ -619,6 +625,7 @@ class Chat21Handler {
619625
// performance console log
620626
// console.log("************* after request.support_group.created: "+new Date().toISOString());
621627

628+
console.log('[WELCOME_MSG_FLOW] chat21Handler: emitting request.support_group.created', { request_id: request.request_id, id_project: request.id_project });
622629
requestEvent.emit('request.support_group.created', request);
623630

624631
chat21Event.emit('group.create', data);

0 commit comments

Comments
 (0)