@app-connect/core 1.7.25 → 1.7.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/.env.test +5 -5
- package/README.md +441 -441
- package/connector/developerPortal.js +31 -31
- package/connector/mock.js +84 -77
- package/connector/proxy/engine.js +164 -164
- package/connector/proxy/index.js +500 -500
- package/connector/registry.js +252 -252
- package/docs/README.md +50 -50
- package/docs/architecture.md +93 -93
- package/docs/connectors.md +116 -116
- package/docs/handlers.md +125 -125
- package/docs/libraries.md +101 -101
- package/docs/models.md +144 -144
- package/docs/routes.md +115 -115
- package/docs/tests.md +73 -73
- package/handlers/admin.js +523 -523
- package/handlers/appointment.js +193 -0
- package/handlers/auth.js +296 -296
- package/handlers/calldown.js +99 -99
- package/handlers/contact.js +280 -280
- package/handlers/disposition.js +82 -80
- package/handlers/log.js +984 -973
- package/handlers/managedAuth.js +446 -446
- package/handlers/plugin.js +208 -208
- package/handlers/user.js +142 -142
- package/index.js +3140 -2652
- package/jest.config.js +56 -56
- package/lib/analytics.js +54 -54
- package/lib/authSession.js +109 -109
- package/lib/cacheCleanup.js +21 -0
- package/lib/callLogComposer.js +898 -898
- package/lib/callLogLookup.js +34 -0
- package/lib/constants.js +8 -8
- package/lib/debugTracer.js +177 -177
- package/lib/encode.js +30 -30
- package/lib/errorHandler.js +218 -206
- package/lib/generalErrorMessage.js +41 -41
- package/lib/jwt.js +18 -18
- package/lib/logger.js +190 -190
- package/lib/migrateCallLogsSchema.js +116 -0
- package/lib/ringcentral.js +266 -266
- package/lib/s3ErrorLogReport.js +65 -65
- package/lib/sharedSMSComposer.js +471 -471
- package/lib/util.js +67 -67
- package/mcp/README.md +412 -395
- package/mcp/lib/validator.js +91 -91
- package/mcp/mcpHandler.js +425 -425
- package/mcp/tools/cancelAppointment.js +101 -0
- package/mcp/tools/checkAuthStatus.js +105 -105
- package/mcp/tools/confirmAppointment.js +101 -0
- package/mcp/tools/createAppointment.js +157 -0
- package/mcp/tools/createCallLog.js +327 -316
- package/mcp/tools/createContact.js +117 -117
- package/mcp/tools/createMessageLog.js +287 -287
- package/mcp/tools/doAuth.js +60 -60
- package/mcp/tools/findContactByName.js +93 -93
- package/mcp/tools/findContactByPhone.js +101 -101
- package/mcp/tools/getCallLog.js +111 -102
- package/mcp/tools/getGoogleFilePicker.js +99 -99
- package/mcp/tools/getHelp.js +43 -43
- package/mcp/tools/getPublicConnectors.js +94 -94
- package/mcp/tools/getSessionInfo.js +90 -90
- package/mcp/tools/index.js +51 -41
- package/mcp/tools/listAppointments.js +163 -0
- package/mcp/tools/logout.js +96 -96
- package/mcp/tools/rcGetCallLogs.js +65 -65
- package/mcp/tools/updateAppointment.js +154 -0
- package/mcp/tools/updateCallLog.js +130 -126
- package/mcp/ui/App/App.tsx +358 -358
- package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
- package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
- package/mcp/ui/App/components/ConnectorList.tsx +82 -82
- package/mcp/ui/App/components/DebugPanel.tsx +43 -43
- package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
- package/mcp/ui/App/lib/callTool.ts +130 -130
- package/mcp/ui/App/lib/debugLog.ts +41 -41
- package/mcp/ui/App/lib/developerPortal.ts +111 -111
- package/mcp/ui/App/main.css +5 -5
- package/mcp/ui/App/root.tsx +13 -13
- package/mcp/ui/index.html +13 -13
- package/mcp/ui/package-lock.json +6356 -6356
- package/mcp/ui/package.json +25 -25
- package/mcp/ui/tsconfig.json +26 -26
- package/mcp/ui/vite.config.ts +16 -16
- package/models/accountDataModel.js +33 -33
- package/models/adminConfigModel.js +35 -35
- package/models/cacheModel.js +30 -26
- package/models/callDownListModel.js +34 -34
- package/models/callLogModel.js +33 -27
- package/models/dynamo/connectorSchema.js +146 -146
- package/models/dynamo/lockSchema.js +24 -24
- package/models/dynamo/noteCacheSchema.js +29 -29
- package/models/llmSessionModel.js +17 -17
- package/models/messageLogModel.js +25 -25
- package/models/sequelize.js +16 -16
- package/models/userModel.js +45 -45
- package/package.json +1 -1
- package/releaseNotes.json +1093 -1081
- package/test/connector/proxy/engine.test.js +126 -126
- package/test/connector/proxy/index.test.js +279 -279
- package/test/connector/proxy/sample.json +161 -161
- package/test/connector/registry.test.js +415 -415
- package/test/handlers/admin.test.js +616 -616
- package/test/handlers/auth.test.js +1018 -1018
- package/test/handlers/contact.test.js +1014 -1014
- package/test/handlers/log.test.js +1298 -1160
- package/test/handlers/managedAuth.test.js +457 -457
- package/test/handlers/plugin.test.js +380 -380
- package/test/index.test.js +105 -105
- package/test/lib/cacheCleanup.test.js +42 -0
- package/test/lib/callLogComposer.test.js +1231 -1231
- package/test/lib/debugTracer.test.js +328 -328
- package/test/lib/jwt.test.js +176 -176
- package/test/lib/logger.test.js +206 -206
- package/test/lib/oauth.test.js +359 -359
- package/test/lib/ringcentral.test.js +467 -467
- package/test/lib/sharedSMSComposer.test.js +1084 -1084
- package/test/lib/util.test.js +329 -329
- package/test/mcp/tools/checkAuthStatus.test.js +83 -83
- package/test/mcp/tools/createCallLog.test.js +436 -436
- package/test/mcp/tools/createContact.test.js +58 -58
- package/test/mcp/tools/createMessageLog.test.js +595 -595
- package/test/mcp/tools/doAuth.test.js +113 -113
- package/test/mcp/tools/findContactByName.test.js +275 -275
- package/test/mcp/tools/findContactByPhone.test.js +296 -296
- package/test/mcp/tools/getCallLog.test.js +298 -298
- package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
- package/test/mcp/tools/getPublicConnectors.test.js +107 -107
- package/test/mcp/tools/getSessionInfo.test.js +127 -127
- package/test/mcp/tools/logout.test.js +233 -233
- package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
- package/test/mcp/tools/updateCallLog.test.js +360 -360
- package/test/models/accountDataModel.test.js +98 -98
- package/test/models/dynamo/connectorSchema.test.js +189 -189
- package/test/models/models.test.js +568 -539
- package/test/routes/managedAuthRoutes.test.js +104 -104
- package/test/setup.js +178 -178
|
@@ -1,316 +1,327 @@
|
|
|
1
|
-
const jwt = require('../../lib/jwt');
|
|
2
|
-
const connectorRegistry = require('../../connector/registry');
|
|
3
|
-
const logCore = require('../../handlers/log');
|
|
4
|
-
const contactCore = require('../../handlers/contact');
|
|
5
|
-
const util = require('../../lib/util');
|
|
6
|
-
const { CallLogModel } = require('../../models/callLogModel');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
*
|
|
189
|
-
* @param {Object}
|
|
190
|
-
* @param {string} args.
|
|
191
|
-
* @
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (!
|
|
207
|
-
throw new Error('
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
//
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (
|
|
230
|
-
throw new Error(
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
//
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
1
|
+
const jwt = require('../../lib/jwt');
|
|
2
|
+
const connectorRegistry = require('../../connector/registry');
|
|
3
|
+
const logCore = require('../../handlers/log');
|
|
4
|
+
const contactCore = require('../../handlers/contact');
|
|
5
|
+
const util = require('../../lib/util');
|
|
6
|
+
const { CallLogModel } = require('../../models/callLogModel');
|
|
7
|
+
const { buildCallLogSessionWhere, getCallLogExtensionNumber } = require('../../lib/callLogLookup');
|
|
8
|
+
/**
|
|
9
|
+
* MCP Tool: Create Call Log
|
|
10
|
+
*
|
|
11
|
+
* This tool creates a call log in the CRM platform.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const toolDefinition = {
|
|
15
|
+
name: 'createCallLog',
|
|
16
|
+
description: '⚠️ REQUIRES CRM CONNECTION. | Create only one call log in the CRM platform. Returns the created log ID if successful. To use with `rcGetCallLogs`: pass a single item from the `records[]` array directly as `incomingData.logInfo`.',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
incomingData: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
description: 'Call log data to create',
|
|
23
|
+
properties: {
|
|
24
|
+
logInfo: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
description: 'A single record from `rcGetCallLogs` — pass the object exactly as returned, with no changes.',
|
|
27
|
+
properties: {
|
|
28
|
+
id: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Call log ID from RingCentral'
|
|
31
|
+
},
|
|
32
|
+
sessionId: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Unique session identifier for the call'
|
|
35
|
+
},
|
|
36
|
+
extensionNumber: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'RingCentral extension number for this call log'
|
|
39
|
+
},
|
|
40
|
+
telephonySessionId: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'Telephony session ID'
|
|
43
|
+
},
|
|
44
|
+
startTime: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Call start time in ISO 8601 format'
|
|
47
|
+
},
|
|
48
|
+
duration: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: 'Call duration in seconds'
|
|
51
|
+
},
|
|
52
|
+
type: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Call type (e.g., Voice)'
|
|
55
|
+
},
|
|
56
|
+
direction: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Call direction: "Inbound" or "Outbound"'
|
|
59
|
+
},
|
|
60
|
+
action: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Call action (e.g., Phone Call)'
|
|
63
|
+
},
|
|
64
|
+
result: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: 'Call result (e.g., Accepted, Missed, Voicemail)'
|
|
67
|
+
},
|
|
68
|
+
to: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
description: 'Recipient information',
|
|
71
|
+
properties: {
|
|
72
|
+
phoneNumber: {
|
|
73
|
+
type: 'string',
|
|
74
|
+
description: 'Recipient phone number in E.164 format'
|
|
75
|
+
},
|
|
76
|
+
name: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Recipient name'
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
from: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
description: 'Caller information',
|
|
85
|
+
properties: {
|
|
86
|
+
phoneNumber: {
|
|
87
|
+
type: 'string',
|
|
88
|
+
description: 'Caller phone number in E.164 format'
|
|
89
|
+
},
|
|
90
|
+
name: {
|
|
91
|
+
type: 'string',
|
|
92
|
+
description: 'Caller name'
|
|
93
|
+
},
|
|
94
|
+
location: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
description: 'Caller location'
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
recording: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
description: 'Recording information',
|
|
103
|
+
properties: {
|
|
104
|
+
link: {
|
|
105
|
+
type: 'string',
|
|
106
|
+
description: 'Recording link URL'
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
customSubject: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Custom subject for the call log'
|
|
113
|
+
},
|
|
114
|
+
legs: {
|
|
115
|
+
type: 'array',
|
|
116
|
+
description: 'Call legs information (for multi-party calls)',
|
|
117
|
+
items: {
|
|
118
|
+
type: 'object'
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
accountId: {
|
|
122
|
+
type: 'string',
|
|
123
|
+
description: 'RingCentral account ID'
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
required: ['id', 'sessionId', 'direction', 'startTime', 'duration', 'to', 'from']
|
|
127
|
+
},
|
|
128
|
+
note: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'User-entered call note/description'
|
|
131
|
+
},
|
|
132
|
+
aiNote: {
|
|
133
|
+
type: 'string',
|
|
134
|
+
description: 'AI-generated summary of the phone call'
|
|
135
|
+
},
|
|
136
|
+
transcript: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: 'Call transcript text'
|
|
139
|
+
},
|
|
140
|
+
additionalSubmission: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
description: 'Additional platform-specific custom fields (e.g., deals, matters, nonBillable flags, assigned users)',
|
|
143
|
+
properties: {
|
|
144
|
+
isAssignedToUser: {
|
|
145
|
+
type: 'boolean',
|
|
146
|
+
description: 'Whether to assign to a specific user'
|
|
147
|
+
},
|
|
148
|
+
adminAssignedUserToken: {
|
|
149
|
+
type: 'string',
|
|
150
|
+
description: 'JWT token of the assigned user'
|
|
151
|
+
},
|
|
152
|
+
adminAssignedUserRcId: {
|
|
153
|
+
type: 'string',
|
|
154
|
+
description: 'RingCentral extension ID of the assigned user'
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
contactName: {
|
|
159
|
+
type: 'string',
|
|
160
|
+
description: 'Contact name'
|
|
161
|
+
},
|
|
162
|
+
contactType: {
|
|
163
|
+
type: 'string',
|
|
164
|
+
description: 'Contact type'
|
|
165
|
+
},
|
|
166
|
+
extensionNumber: {
|
|
167
|
+
type: 'string',
|
|
168
|
+
description: 'RingCentral extension number for this call log'
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
required: ['logInfo', 'contactName']
|
|
172
|
+
},
|
|
173
|
+
contactId: {
|
|
174
|
+
type: 'string',
|
|
175
|
+
description: 'OPTIONAL: CRM contact ID to associate with the call.'
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
required: ['incomingData']
|
|
179
|
+
},
|
|
180
|
+
annotations: {
|
|
181
|
+
readOnlyHint: false,
|
|
182
|
+
openWorldHint: true,
|
|
183
|
+
destructiveHint: false
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Execute the createCallLog tool
|
|
189
|
+
* @param {Object} args - The tool arguments
|
|
190
|
+
* @param {string} args.jwtToken - JWT token with user and platform info
|
|
191
|
+
* @param {Object} args.incomingData - Call log data including logInfo (RingCentral call log schema), contactName, contactType, note, aiNote, transcript, and additionalSubmission
|
|
192
|
+
* @param {Object} args.incomingData.logInfo - RingCentral call log information with sessionId, direction, startTime, duration, from, to, result, recording, customSubject, etc.
|
|
193
|
+
* @param {string} [args.incomingData.contactName] - Contact name
|
|
194
|
+
* @param {string} [args.incomingData.contactType] - Contact type in CRM
|
|
195
|
+
* @param {string} [args.incomingData.note] - User-entered call note
|
|
196
|
+
* @param {string} [args.incomingData.aiNote] - AI-generated call summary
|
|
197
|
+
* @param {string} [args.incomingData.transcript] - Call transcript
|
|
198
|
+
* @param {Object} [args.incomingData.additionalSubmission] - Platform-specific custom fields
|
|
199
|
+
* @param {string} args.contactId - OPTIONAL: CRM contact ID to associate with the call
|
|
200
|
+
* @returns {Object} Result object with created log ID
|
|
201
|
+
*/
|
|
202
|
+
async function execute(args) {
|
|
203
|
+
try {
|
|
204
|
+
const { jwtToken, incomingData } = args;
|
|
205
|
+
|
|
206
|
+
if (!jwtToken) {
|
|
207
|
+
throw new Error('Please go to Settings and authorize CRM platform');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (!incomingData) {
|
|
211
|
+
throw new Error('Incoming data must be provided');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Validate logInfo exists
|
|
215
|
+
if (!incomingData.logInfo) {
|
|
216
|
+
throw new Error('incomingData.logInfo is required');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const { logInfo } = incomingData;
|
|
220
|
+
const extensionNumber = getCallLogExtensionNumber(incomingData);
|
|
221
|
+
|
|
222
|
+
// Check in DB if the call log already exists
|
|
223
|
+
const existingCallLog = await CallLogModel.findOne({
|
|
224
|
+
where: buildCallLogSessionWhere({
|
|
225
|
+
sessionId: logInfo.sessionId,
|
|
226
|
+
extensionNumber,
|
|
227
|
+
})
|
|
228
|
+
});
|
|
229
|
+
if (existingCallLog) {
|
|
230
|
+
throw new Error(`Call log already exists for session ${logInfo.sessionId}`);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Decode JWT to get userId and platform
|
|
234
|
+
const decodedToken = jwt.decodeJwt(jwtToken);
|
|
235
|
+
if (!decodedToken) {
|
|
236
|
+
throw new Error('Invalid JWT token');
|
|
237
|
+
}
|
|
238
|
+
const { id: userId, platform } = decodedToken;
|
|
239
|
+
|
|
240
|
+
if (!userId) {
|
|
241
|
+
throw new Error('Invalid JWT token: userId not found');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Get the platform connector module
|
|
245
|
+
const platformModule = connectorRegistry.getConnector(platform);
|
|
246
|
+
|
|
247
|
+
if (!platformModule) {
|
|
248
|
+
throw new Error(`Platform connector not found for: ${platform}`);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Check if createCallLog is implemented
|
|
252
|
+
if (!platformModule.createCallLog) {
|
|
253
|
+
throw new Error(`createCallLog is not implemented for platform: ${platform}`);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Calculate hashed account ID
|
|
257
|
+
const hashedAccountId = incomingData.logInfo?.accountId
|
|
258
|
+
? util.getHashValue(incomingData.logInfo.accountId, process.env.HASH_KEY)
|
|
259
|
+
: undefined;
|
|
260
|
+
|
|
261
|
+
// Get contact Id from conversation
|
|
262
|
+
let contactId = args.contactId ?? null;
|
|
263
|
+
// Get contact Id from conversation if not provided
|
|
264
|
+
if (!contactId) {
|
|
265
|
+
const callDirection = logInfo.direction;
|
|
266
|
+
const contactNumber = callDirection === 'Inbound' ? logInfo.from.phoneNumber : logInfo.to.phoneNumber;
|
|
267
|
+
const contactInfo = await contactCore.findContact({
|
|
268
|
+
platform,
|
|
269
|
+
userId,
|
|
270
|
+
phoneNumber: contactNumber,
|
|
271
|
+
overridingFormat: '',
|
|
272
|
+
isExtension: false
|
|
273
|
+
});
|
|
274
|
+
const filteredContact = contactInfo.contact?.filter(c => !c.isNewContact);
|
|
275
|
+
if (contactInfo.successful && filteredContact?.length > 0) {
|
|
276
|
+
contactId = filteredContact[0].id;
|
|
277
|
+
incomingData.contactId = contactId;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
return {
|
|
281
|
+
success: false,
|
|
282
|
+
message: 'Cannot find the contact. Please create the contact first.',
|
|
283
|
+
error: 'Failed to get contact with number ' + contactNumber
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
incomingData.contactId = contactId;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Call the createCallLog method
|
|
292
|
+
const { successful, logId, returnMessage } = await logCore.createCallLog({
|
|
293
|
+
platform,
|
|
294
|
+
userId,
|
|
295
|
+
incomingData,
|
|
296
|
+
hashedAccountId,
|
|
297
|
+
isFromSSCL: false
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
if (successful) {
|
|
301
|
+
return {
|
|
302
|
+
success: true,
|
|
303
|
+
data: {
|
|
304
|
+
logId,
|
|
305
|
+
message: returnMessage?.message || 'Call log created successfully'
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
return {
|
|
311
|
+
success: false,
|
|
312
|
+
error: returnMessage?.message || 'Failed to create call log',
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
error: error.message || 'Unknown error occurred',
|
|
320
|
+
errorDetails: error.stack
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
exports.definition = toolDefinition;
|
|
326
|
+
exports.execute = execute;
|
|
327
|
+
|