@app-connect/core 1.7.15 → 1.7.17

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/index.js CHANGED
@@ -333,7 +333,7 @@ function createCoreRouter() {
333
333
  }
334
334
  else {
335
335
  tracer?.trace('setAdminSettings:adminValidationFailed', {});
336
- res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
336
+ res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
337
337
  success = false;
338
338
  }
339
339
  }
@@ -395,7 +395,7 @@ function createCoreRouter() {
395
395
  }
396
396
  else {
397
397
  tracer?.trace('getAdminSettings:adminValidationFailed', {});
398
- res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
398
+ res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
399
399
  success = true;
400
400
  }
401
401
  }
@@ -447,12 +447,18 @@ function createCoreRouter() {
447
447
  const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
448
448
  if (isValidated) {
449
449
  const userMapping = await adminCore.getUserMapping({ user, hashedRcAccountId, rcExtensionList: req.body.rcExtensionList });
450
- res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
451
- success = true;
450
+ if (userMapping?.isRevokeUserSession) {
451
+ res.status(401).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
452
+ success = false;
453
+ }
454
+ else {
455
+ res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
456
+ success = true;
457
+ }
452
458
  }
453
459
  else {
454
460
  tracer?.trace('getUserMapping:adminValidationFailed', {});
455
- res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
461
+ res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
456
462
  success = true;
457
463
  }
458
464
  }
@@ -504,12 +510,18 @@ function createCoreRouter() {
504
510
  const hashedRcAccountId = util.getHashValue(rcAccountId, process.env.HASH_KEY);
505
511
  if (isValidated) {
506
512
  const userMapping = await adminCore.reinitializeUserMapping({ user, hashedRcAccountId, rcExtensionList: req.body.rcExtensionList });
507
- res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
508
- success = true;
513
+ if (userMapping?.isRevokeUserSession) {
514
+ res.status(401).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
515
+ success = false;
516
+ }
517
+ else {
518
+ res.status(200).send(tracer ? tracer.wrapResponse(userMapping) : userMapping);
519
+ success = true;
520
+ }
509
521
  }
510
522
  else {
511
523
  tracer?.trace('reinitializeUserMapping:adminValidationFailed', {});
512
- res.status(401).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
524
+ res.status(403).send(tracer ? tracer.wrapResponse('Admin validation failed') : 'Admin validation failed');
513
525
  success = true;
514
526
  }
515
527
  }
@@ -825,8 +837,7 @@ function createCoreRouter() {
825
837
  const stateParams = new URLSearchParams(state ? decodeURIComponent(state) : '');
826
838
  platformName = stateParams.get('platform');
827
839
  // backward compatibility
828
- if(!platformName)
829
- {
840
+ if (!platformName) {
830
841
  platformName = req.query.callbackUri?.split('platform=')[1] ?? state.split('platform=')[1];
831
842
  }
832
843
  // Extract mcp auth sessionId if present
@@ -870,7 +881,7 @@ function createCoreRouter() {
870
881
  res.status(200).send("Authentication successful. Please go back to AI Agent and confirm it.");
871
882
  success = true;
872
883
  }
873
- else {
884
+ else {
874
885
  res.status(200).send(tracer ? tracer.wrapResponse({ jwtToken, name: userInfo.name, returnMessage }) : { jwtToken, name: userInfo.name, returnMessage });
875
886
  success = true;
876
887
  }
@@ -1057,7 +1068,7 @@ function createCoreRouter() {
1057
1068
  }
1058
1069
  const { id: userId, platform } = decodedToken;
1059
1070
  platformName = platform;
1060
- const { successful, returnMessage, contact, extraDataTracking } = await contactCore.findContact({
1071
+ const { successful, returnMessage, contact, extraDataTracking, isRevokeUserSession } = await contactCore.findContact({
1061
1072
  platform,
1062
1073
  userId,
1063
1074
  phoneNumber: req.query.phoneNumber.replace(' ', '+'),
@@ -1066,15 +1077,21 @@ function createCoreRouter() {
1066
1077
  tracer,
1067
1078
  isForceRefreshAccountData: req.query?.isForceRefreshAccountData === 'true'
1068
1079
  });
1069
- tracer?.trace('findContact:result', { successful, returnMessage, contact });
1070
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1071
- if (successful) {
1072
- const nonNewContact = contact?.filter(c => !c.isNewContact) ?? [];
1073
- resultCount = nonNewContact.length;
1080
+ if (isRevokeUserSession) {
1081
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1082
+ success = false;
1074
1083
  }
1075
- success = successful;
1076
- if (extraDataTracking) {
1077
- extraData = extraDataTracking;
1084
+ else {
1085
+ tracer?.trace('findContact:result', { successful, returnMessage, contact });
1086
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1087
+ if (successful) {
1088
+ const nonNewContact = contact?.filter(c => !c.isNewContact) ?? [];
1089
+ resultCount = nonNewContact.length;
1090
+ }
1091
+ success = successful;
1092
+ if (extraDataTracking) {
1093
+ extraData = extraDataTracking;
1094
+ }
1078
1095
  }
1079
1096
  }
1080
1097
  else {
@@ -1128,11 +1145,17 @@ function createCoreRouter() {
1128
1145
  }
1129
1146
  const { id: userId, platform } = decodedToken;
1130
1147
  platformName = platform;
1131
- const { successful, returnMessage, contact, extraDataTracking } = await contactCore.createContact({ platform, userId, phoneNumber: req.body.phoneNumber, newContactName: req.body.newContactName, newContactType: req.body.newContactType, additionalSubmission: req.body.additionalSubmission });
1132
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1133
- success = true;
1134
- if (extraDataTracking) {
1135
- extraData = extraDataTracking;
1148
+ const { successful, returnMessage, contact, extraDataTracking, isRevokeUserSession } = await contactCore.createContact({ platform, userId, phoneNumber: req.body.phoneNumber, newContactName: req.body.newContactName, newContactType: req.body.newContactType, additionalSubmission: req.body.additionalSubmission });
1149
+ if (isRevokeUserSession) {
1150
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1151
+ success = false;
1152
+ }
1153
+ else {
1154
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1155
+ success = true;
1156
+ if (extraDataTracking) {
1157
+ extraData = extraDataTracking;
1158
+ }
1136
1159
  }
1137
1160
  }
1138
1161
  else {
@@ -1236,13 +1259,19 @@ function createCoreRouter() {
1236
1259
  }
1237
1260
  const { id: userId, platform } = decodedToken;
1238
1261
  platformName = platform;
1239
- const { successful, logs, returnMessage, extraDataTracking } = await logCore.getCallLog({ userId, sessionIds: req.query.sessionIds, platform, requireDetails: req.query.requireDetails === 'true' });
1240
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, logs, returnMessage }) : { successful, logs, returnMessage });
1241
- success = true;
1242
- if (extraDataTracking) {
1243
- extraData = extraDataTracking;
1262
+ const { successful, logs, returnMessage, extraDataTracking, isRevokeUserSession } = await logCore.getCallLog({ userId, sessionIds: req.query.sessionIds, platform, requireDetails: req.query.requireDetails === 'true' });
1263
+ if (isRevokeUserSession) {
1264
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1265
+ success = false;
1266
+ }
1267
+ else {
1268
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, logs, returnMessage }) : { successful, logs, returnMessage });
1269
+ success = true;
1270
+ if (extraDataTracking) {
1271
+ extraData = extraDataTracking;
1272
+ }
1273
+ extraData.requireDetails = req.query.requireDetails === 'true';
1244
1274
  }
1245
- extraData.requireDetails = req.query.requireDetails === 'true';
1246
1275
  }
1247
1276
  else {
1248
1277
  tracer?.trace('getCallLog:noToken', {});
@@ -1294,12 +1323,18 @@ function createCoreRouter() {
1294
1323
  }
1295
1324
  const { id: userId, platform } = decodedToken;
1296
1325
  platformName = platform;
1297
- const { successful, logId, returnMessage, extraDataTracking } = await logCore.createCallLog({ platform, userId, incomingData: req.body, hashedAccountId: hashedAccountId ?? util.getHashValue(req.body.logInfo?.accountId, process.env.HASH_KEY), isFromSSCL: userAgent === 'SSCL' });
1298
- if (extraDataTracking) {
1299
- extraData = extraDataTracking;
1326
+ const { successful, logId, returnMessage, extraDataTracking, isRevokeUserSession } = await logCore.createCallLog({ platform, userId, incomingData: req.body, hashedAccountId: hashedAccountId ?? util.getHashValue(req.body.logInfo?.accountId, process.env.HASH_KEY), isFromSSCL: userAgent === 'SSCL' });
1327
+ if (isRevokeUserSession) {
1328
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1329
+ success = false;
1330
+ }
1331
+ else {
1332
+ if (extraDataTracking) {
1333
+ extraData = extraDataTracking;
1334
+ }
1335
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, returnMessage }) : { successful, logId, returnMessage });
1336
+ success = true;
1300
1337
  }
1301
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, logId, returnMessage }) : { successful, logId, returnMessage });
1302
- success = true;
1303
1338
  }
1304
1339
  else {
1305
1340
  tracer?.trace('createCallLog:noToken', {});
@@ -1407,18 +1442,24 @@ function createCoreRouter() {
1407
1442
  res.status(400).send(tracer ? tracer.wrapResponse('Please go to Settings and authorize CRM platform') : 'Please go to Settings and authorize CRM platform');
1408
1443
  return;
1409
1444
  }
1410
- const { successful, returnMessage, extraDataTracking } = await dispositionCore.upsertCallDisposition({
1445
+ const { successful, returnMessage, extraDataTracking, isRevokeUserSession } = await dispositionCore.upsertCallDisposition({
1411
1446
  platform,
1412
1447
  userId,
1413
1448
  sessionId: req.body.sessionId,
1414
1449
  dispositions: req.body.dispositions,
1415
1450
  additionalSubmission: req.body.additionalSubmission
1416
1451
  });
1417
- if (extraDataTracking) {
1418
- extraData = extraDataTracking;
1452
+ if (isRevokeUserSession) {
1453
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1454
+ success = false;
1455
+ }
1456
+ else {
1457
+ if (extraDataTracking) {
1458
+ extraData = extraDataTracking;
1459
+ }
1460
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1461
+ success = true;
1419
1462
  }
1420
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1421
- success = true;
1422
1463
  }
1423
1464
  else {
1424
1465
  tracer?.trace('upsertCallDisposition:noToken', {});
@@ -1435,8 +1476,8 @@ function createCoreRouter() {
1435
1476
  }
1436
1477
  const requestEndTime = new Date().getTime();
1437
1478
  analytics.track({
1438
- eventName: 'Create call log',
1439
- interfaceName: 'createCallLog',
1479
+ eventName: 'Disposition call log',
1480
+ interfaceName: 'dispositionCallLog',
1440
1481
  connectorName: platformName,
1441
1482
  accountId: hashedAccountId,
1442
1483
  extensionId: hashedExtensionId,
@@ -1471,12 +1512,18 @@ function createCoreRouter() {
1471
1512
  }
1472
1513
  const { id: userId, platform } = decodedToken;
1473
1514
  platformName = platform;
1474
- const { successful, returnMessage, logIds, extraDataTracking } = await logCore.createMessageLog({ platform, userId, incomingData: req.body });
1475
- if (extraDataTracking) {
1476
- extraData = extraDataTracking;
1515
+ const { successful, returnMessage, logIds, extraDataTracking, isRevokeUserSession } = await logCore.createMessageLog({ platform, userId, incomingData: req.body });
1516
+ if (isRevokeUserSession) {
1517
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1518
+ success = false;
1519
+ }
1520
+ else {
1521
+ if (extraDataTracking) {
1522
+ extraData = extraDataTracking;
1523
+ }
1524
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, logIds }) : { successful, returnMessage, logIds });
1525
+ success = true;
1477
1526
  }
1478
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, logIds }) : { successful, returnMessage, logIds });
1479
- success = true;
1480
1527
  }
1481
1528
  else {
1482
1529
  tracer?.trace('createMessageLog:noToken', {});
@@ -1707,9 +1754,15 @@ function createCoreRouter() {
1707
1754
  if (jwtToken) {
1708
1755
  const { id: userId, platform } = jwt.decodeJwt(jwtToken);
1709
1756
  platformName = platform;
1710
- const { successful, returnMessage, contact } = await contactCore.findContactWithName({ platform, userId, name: req.query.name });
1711
- res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1712
- success = successful;
1757
+ const { successful, returnMessage, contact, isRevokeUserSession } = await contactCore.findContactWithName({ platform, userId, name: req.query.name });
1758
+ if (isRevokeUserSession) {
1759
+ res.status(401).send(tracer ? tracer.wrapResponse({ successful, returnMessage }) : { successful, returnMessage });
1760
+ success = false;
1761
+ }
1762
+ else {
1763
+ res.status(200).send(tracer ? tracer.wrapResponse({ successful, returnMessage, contact }) : { successful, returnMessage, contact });
1764
+ success = successful;
1765
+ }
1713
1766
  }
1714
1767
  else {
1715
1768
  tracer?.trace('contactSearchByName:noToken', {});
@@ -1896,7 +1949,7 @@ function createCoreRouter() {
1896
1949
  res.status(200).send(mockUser ? 'Mock user registered' : 'Mock user already existed');
1897
1950
  }
1898
1951
  else {
1899
- res.status(401).send('Unauthorized');
1952
+ res.status(403).send('Unauthorized');
1900
1953
  }
1901
1954
  });
1902
1955
  router.delete('/deleteMockUser', async function (req, res) {
@@ -1906,7 +1959,7 @@ function createCoreRouter() {
1906
1959
  res.status(200).send(foundAndDeleted ? 'Mock user deleted' : 'Mock user not found');
1907
1960
  }
1908
1961
  else {
1909
- res.status(401).send('Unauthorized');
1962
+ res.status(403).send('Unauthorized');
1910
1963
  }
1911
1964
  });
1912
1965
  router.get('/mockCallLog', async function (req, res) {
@@ -1916,7 +1969,7 @@ function createCoreRouter() {
1916
1969
  res.status(200).send(callLogs);
1917
1970
  }
1918
1971
  else {
1919
- res.status(401).send('Unauthorized');
1972
+ res.status(403).send('Unauthorized');
1920
1973
  }
1921
1974
  });
1922
1975
  router.post('/mockCallLog', async function (req, res) {
@@ -1926,7 +1979,7 @@ function createCoreRouter() {
1926
1979
  res.status(200).send('Mock call log created');
1927
1980
  }
1928
1981
  else {
1929
- res.status(401).send('Unauthorized');
1982
+ res.status(403).send('Unauthorized');
1930
1983
  }
1931
1984
  });
1932
1985
  router.delete('/mockCallLog', async function (req, res) {
@@ -1936,7 +1989,7 @@ function createCoreRouter() {
1936
1989
  res.status(200).send('Mock call logs cleaned up');
1937
1990
  }
1938
1991
  else {
1939
- res.status(401).send('Unauthorized');
1992
+ res.status(403).send('Unauthorized');
1940
1993
  }
1941
1994
  });
1942
1995
  }
@@ -1944,7 +1997,7 @@ function createCoreRouter() {
1944
1997
  router.get('/.well-known/openai-apps-challenge', (req, res) => {
1945
1998
  res.send(process.env.CHATGPT_VERIFICATION_CODE);
1946
1999
  });
1947
-
2000
+
1948
2001
  // --- METADATA ENDPOINT 1: Resource Metadata ---
1949
2002
  // Tells the client "I am protected" and "Here is who protects me"
1950
2003
  router.get('/.well-known/oauth-protected-resource', (req, res) => {
package/lib/oauth.js CHANGED
@@ -101,41 +101,48 @@ async function checkAndRefreshAccessToken(oauthApp, user, tokenLockTimeout = 20)
101
101
  try {
102
102
  const startRefreshTime = moment();
103
103
  const token = oauthApp.createToken(user.accessToken, user.refreshToken);
104
- logger.info('token refreshing...')
104
+ logger.info('token refreshing...')
105
105
  const { accessToken, refreshToken, expires } = await token.refresh();
106
106
  user.accessToken = accessToken;
107
107
  user.refreshToken = refreshToken;
108
108
  user.tokenExpiry = expires;
109
- try {
110
- await user.save();
111
- }
112
- catch (error) {
113
- return handleDatabaseError(error, 'Error saving user');
114
- }
109
+ try {
110
+ await user.save();
111
+ }
112
+ catch (error) {
113
+ return handleDatabaseError(error, 'Error saving user');
114
+ }
115
115
  if (newLock) {
116
116
  const deletionStartTime = moment();
117
117
  await newLock.delete();
118
118
  const deletionEndTime = moment();
119
- logger.info(`lock deleted in ${deletionEndTime.diff(deletionStartTime)}ms`)
119
+ logger.info(`lock deleted in ${deletionEndTime.diff(deletionStartTime)}ms`)
120
120
  }
121
121
  const endRefreshTime = moment();
122
- logger.info(`token refreshing finished in ${endRefreshTime.diff(startRefreshTime)}ms`)
122
+ logger.info(`token refreshing finished in ${endRefreshTime.diff(startRefreshTime)}ms`)
123
123
  }
124
124
  catch (e) {
125
125
  console.log('token refreshing failed', e.stack)
126
126
  if (newLock) {
127
127
  await newLock.delete();
128
128
  }
129
+ return null;
129
130
  }
130
131
  }
131
132
  // case: run withou token refresh lock
132
133
  else {
133
- logger.info('token refreshing...')
134
- const token = oauthApp.createToken(user.accessToken, user.refreshToken);
135
- const { accessToken, refreshToken, expires } = await token.refresh();
136
- user.accessToken = accessToken;
137
- user.refreshToken = refreshToken;
138
- user.tokenExpiry = expires;
134
+ try {
135
+ logger.info('token refreshing...')
136
+ const token = oauthApp.createToken(user.accessToken, user.refreshToken);
137
+ const { accessToken, refreshToken, expires } = await token.refresh();
138
+ user.accessToken = accessToken;
139
+ user.refreshToken = refreshToken;
140
+ user.tokenExpiry = expires;
141
+ }
142
+ catch (e) {
143
+ console.log('token refreshing failed', e.stack)
144
+ return null;
145
+ }
139
146
  try {
140
147
  await user.save();
141
148
  }
package/package.json CHANGED
@@ -1,72 +1,72 @@
1
- {
2
- "name": "@app-connect/core",
3
- "version": "1.7.15",
4
- "description": "RingCentral App Connect Core",
5
- "main": "index.js",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/ringcentral/rc-unified-crm-extension.git"
9
- },
10
- "keywords": [
11
- "RingCentral",
12
- "App Connect"
13
- ],
14
- "author": "RingCentral Labs",
15
- "license": "MIT",
16
- "peerDependencies": {
17
- "axios": "^1.12.2",
18
- "express": "^4.22.1",
19
- "moment": "^2.29.4",
20
- "moment-timezone": "^0.5.39",
21
- "pg": "^8.8.0",
22
- "sequelize": "^6.29.0"
23
- },
24
- "dependencies": {
25
- "@aws-sdk/client-dynamodb": "^3.751.0",
26
- "@aws-sdk/client-s3": "^3.947.0",
27
- "@aws-sdk/s3-request-presigner": "^3.947.0",
28
- "@modelcontextprotocol/sdk": "^1.21.1",
29
- "awesome-phonenumber": "^5.6.0",
30
- "body-parser": "^1.20.4",
31
- "body-parser-xml": "^2.0.5",
32
- "client-oauth2": "^4.3.3",
33
- "cors": "^2.8.5",
34
- "country-state-city": "^3.2.1",
35
- "dotenv": "^16.0.3",
36
- "dynamoose": "^4.0.3",
37
- "jsonwebtoken": "^9.0.0",
38
- "mixpanel": "^0.18.0",
39
- "shortid": "^2.2.17",
40
- "tz-lookup": "^6.1.25",
41
- "ua-parser-js": "^1.0.38"
42
- },
43
- "scripts": {
44
- "test": "jest",
45
- "test:watch": "jest --watch",
46
- "test:coverage": "jest --coverage",
47
- "test:ci": "jest --ci --coverage --watchAll=false"
48
- },
49
- "devDependencies": {
50
- "@eslint/js": "^9.22.0",
51
- "@octokit/rest": "^19.0.5",
52
- "axios": "^1.12.2",
53
- "eslint": "^9.22.0",
54
- "express": "^4.22.1",
55
- "globals": "^16.0.0",
56
- "jest": "^29.3.1",
57
- "moment": "^2.29.4",
58
- "moment-timezone": "^0.5.39",
59
- "nock": "^13.2.9",
60
- "pg": "^8.8.0",
61
- "sequelize": "^6.29.0",
62
- "sqlite3": "^5.1.2",
63
- "supertest": "^6.3.1"
64
- },
65
- "overrides": {
66
- "js-object-utilities": "2.2.1"
67
- },
68
- "bugs": {
69
- "url": "https://github.com/ringcentral/rc-unified-crm-extension/issues"
70
- },
71
- "homepage": "https://github.com/ringcentral/rc-unified-crm-extension#readme"
72
- }
1
+ {
2
+ "name": "@app-connect/core",
3
+ "version": "1.7.17",
4
+ "description": "RingCentral App Connect Core",
5
+ "main": "index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/ringcentral/rc-unified-crm-extension.git"
9
+ },
10
+ "keywords": [
11
+ "RingCentral",
12
+ "App Connect"
13
+ ],
14
+ "author": "RingCentral Labs",
15
+ "license": "MIT",
16
+ "peerDependencies": {
17
+ "axios": "^1.12.2",
18
+ "express": "^4.22.1",
19
+ "moment": "^2.29.4",
20
+ "moment-timezone": "^0.5.39",
21
+ "pg": "^8.8.0",
22
+ "sequelize": "^6.29.0"
23
+ },
24
+ "dependencies": {
25
+ "@aws-sdk/client-dynamodb": "^3.751.0",
26
+ "@aws-sdk/client-s3": "^3.947.0",
27
+ "@aws-sdk/s3-request-presigner": "^3.947.0",
28
+ "@modelcontextprotocol/sdk": "^1.21.1",
29
+ "awesome-phonenumber": "^5.6.0",
30
+ "body-parser": "^1.20.4",
31
+ "body-parser-xml": "^2.0.5",
32
+ "client-oauth2": "^4.3.3",
33
+ "cors": "^2.8.5",
34
+ "country-state-city": "^3.2.1",
35
+ "dotenv": "^16.0.3",
36
+ "dynamoose": "^4.0.3",
37
+ "jsonwebtoken": "^9.0.0",
38
+ "mixpanel": "^0.18.0",
39
+ "shortid": "^2.2.17",
40
+ "tz-lookup": "^6.1.25",
41
+ "ua-parser-js": "^1.0.38"
42
+ },
43
+ "scripts": {
44
+ "test": "jest",
45
+ "test:watch": "jest --watch",
46
+ "test:coverage": "jest --coverage",
47
+ "test:ci": "jest --ci --coverage --watchAll=false"
48
+ },
49
+ "devDependencies": {
50
+ "@eslint/js": "^9.22.0",
51
+ "@octokit/rest": "^19.0.5",
52
+ "axios": "^1.12.2",
53
+ "eslint": "^9.22.0",
54
+ "express": "^4.22.1",
55
+ "globals": "^16.0.0",
56
+ "jest": "^29.3.1",
57
+ "moment": "^2.29.4",
58
+ "moment-timezone": "^0.5.39",
59
+ "nock": "^13.2.9",
60
+ "pg": "^8.8.0",
61
+ "sequelize": "^6.29.0",
62
+ "sqlite3": "^5.1.2",
63
+ "supertest": "^6.3.1"
64
+ },
65
+ "overrides": {
66
+ "js-object-utilities": "2.2.1"
67
+ },
68
+ "bugs": {
69
+ "url": "https://github.com/ringcentral/rc-unified-crm-extension/issues"
70
+ },
71
+ "homepage": "https://github.com/ringcentral/rc-unified-crm-extension#readme"
72
+ }
package/releaseNotes.json CHANGED
@@ -1,4 +1,32 @@
1
1
  {
2
+ "1.7.17": {
3
+ "global": [
4
+ {
5
+ "type": "New",
6
+ "description": "Support for Group SMS logging"
7
+ },
8
+ {
9
+ "type": "Better",
10
+ "description": "User session will log be revoked is token refresh fails"
11
+ },
12
+ {
13
+ "type": "Fix",
14
+ "description": "Contact call pop issue"
15
+ }
16
+ ]
17
+ },
18
+ "1.7.16": {
19
+ "global": [
20
+ {
21
+ "type": "Fix",
22
+ "description": "SMS logging issue of repeatedly logging same messages"
23
+ },
24
+ {
25
+ "type": "Fix",
26
+ "description": "Mixpanel token issue that blocks certain webpage access"
27
+ }
28
+ ]
29
+ },
2
30
  "1.7.15": {
3
31
  "global": [
4
32
  {