@app-connect/core 1.7.25 → 1.7.27

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.
Files changed (138) hide show
  1. package/.env.test +5 -5
  2. package/README.md +441 -441
  3. package/connector/developerPortal.js +31 -31
  4. package/connector/mock.js +84 -77
  5. package/connector/proxy/engine.js +164 -164
  6. package/connector/proxy/index.js +500 -500
  7. package/connector/registry.js +252 -252
  8. package/docs/README.md +50 -50
  9. package/docs/architecture.md +93 -93
  10. package/docs/connectors.md +116 -116
  11. package/docs/handlers.md +125 -125
  12. package/docs/libraries.md +101 -101
  13. package/docs/models.md +144 -144
  14. package/docs/routes.md +115 -115
  15. package/docs/tests.md +73 -73
  16. package/handlers/admin.js +523 -523
  17. package/handlers/appointment.js +193 -0
  18. package/handlers/auth.js +320 -296
  19. package/handlers/calldown.js +99 -99
  20. package/handlers/contact.js +280 -280
  21. package/handlers/disposition.js +82 -80
  22. package/handlers/log.js +990 -973
  23. package/handlers/managedAuth.js +446 -446
  24. package/handlers/managedOAuth.js +247 -0
  25. package/handlers/plugin.js +208 -208
  26. package/handlers/user.js +142 -142
  27. package/index.js +3162 -2652
  28. package/jest.config.js +56 -56
  29. package/lib/analytics.js +54 -54
  30. package/lib/authSession.js +109 -109
  31. package/lib/cacheCleanup.js +21 -0
  32. package/lib/callLogComposer.js +898 -898
  33. package/lib/callLogLookup.js +34 -0
  34. package/lib/constants.js +8 -8
  35. package/lib/debugTracer.js +177 -177
  36. package/lib/encode.js +30 -30
  37. package/lib/errorHandler.js +218 -206
  38. package/lib/generalErrorMessage.js +41 -41
  39. package/lib/jwt.js +18 -18
  40. package/lib/logger.js +190 -190
  41. package/lib/migrateCallLogsSchema.js +116 -0
  42. package/lib/ringcentral.js +266 -266
  43. package/lib/s3ErrorLogReport.js +65 -65
  44. package/lib/sharedSMSComposer.js +471 -471
  45. package/lib/util.js +67 -67
  46. package/mcp/README.md +412 -395
  47. package/mcp/lib/validator.js +91 -91
  48. package/mcp/mcpHandler.js +425 -425
  49. package/mcp/tools/cancelAppointment.js +101 -0
  50. package/mcp/tools/checkAuthStatus.js +105 -105
  51. package/mcp/tools/confirmAppointment.js +101 -0
  52. package/mcp/tools/createAppointment.js +157 -0
  53. package/mcp/tools/createCallLog.js +327 -316
  54. package/mcp/tools/createContact.js +117 -117
  55. package/mcp/tools/createMessageLog.js +287 -287
  56. package/mcp/tools/doAuth.js +60 -60
  57. package/mcp/tools/findContactByName.js +93 -93
  58. package/mcp/tools/findContactByPhone.js +101 -101
  59. package/mcp/tools/getCallLog.js +111 -102
  60. package/mcp/tools/getGoogleFilePicker.js +99 -99
  61. package/mcp/tools/getHelp.js +43 -43
  62. package/mcp/tools/getPublicConnectors.js +94 -94
  63. package/mcp/tools/getSessionInfo.js +90 -90
  64. package/mcp/tools/index.js +51 -41
  65. package/mcp/tools/listAppointments.js +163 -0
  66. package/mcp/tools/logout.js +99 -96
  67. package/mcp/tools/rcGetCallLogs.js +65 -65
  68. package/mcp/tools/updateAppointment.js +154 -0
  69. package/mcp/tools/updateCallLog.js +130 -126
  70. package/mcp/ui/App/App.tsx +358 -358
  71. package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
  72. package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
  73. package/mcp/ui/App/components/ConnectorList.tsx +82 -82
  74. package/mcp/ui/App/components/DebugPanel.tsx +43 -43
  75. package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
  76. package/mcp/ui/App/lib/callTool.ts +130 -130
  77. package/mcp/ui/App/lib/debugLog.ts +41 -41
  78. package/mcp/ui/App/lib/developerPortal.ts +111 -111
  79. package/mcp/ui/App/main.css +5 -5
  80. package/mcp/ui/App/root.tsx +13 -13
  81. package/mcp/ui/index.html +13 -13
  82. package/mcp/ui/package-lock.json +6356 -6356
  83. package/mcp/ui/package.json +25 -25
  84. package/mcp/ui/tsconfig.json +26 -26
  85. package/mcp/ui/vite.config.ts +16 -16
  86. package/models/accountDataModel.js +33 -33
  87. package/models/adminConfigModel.js +35 -35
  88. package/models/cacheModel.js +30 -26
  89. package/models/callDownListModel.js +34 -34
  90. package/models/callLogModel.js +33 -27
  91. package/models/dynamo/connectorSchema.js +146 -146
  92. package/models/dynamo/lockSchema.js +24 -24
  93. package/models/dynamo/noteCacheSchema.js +29 -29
  94. package/models/llmSessionModel.js +17 -17
  95. package/models/messageLogModel.js +25 -25
  96. package/models/sequelize.js +16 -16
  97. package/models/userModel.js +45 -45
  98. package/package.json +1 -1
  99. package/releaseNotes.json +1101 -1081
  100. package/test/connector/proxy/engine.test.js +126 -126
  101. package/test/connector/proxy/index.test.js +279 -279
  102. package/test/connector/proxy/sample.json +161 -161
  103. package/test/connector/registry.test.js +415 -415
  104. package/test/handlers/admin.test.js +616 -616
  105. package/test/handlers/auth.test.js +1092 -1018
  106. package/test/handlers/contact.test.js +1014 -1014
  107. package/test/handlers/log.test.js +1298 -1160
  108. package/test/handlers/managedAuth.test.js +457 -457
  109. package/test/handlers/plugin.test.js +380 -380
  110. package/test/index.test.js +105 -105
  111. package/test/lib/cacheCleanup.test.js +42 -0
  112. package/test/lib/callLogComposer.test.js +1231 -1231
  113. package/test/lib/debugTracer.test.js +328 -328
  114. package/test/lib/jwt.test.js +176 -176
  115. package/test/lib/logger.test.js +206 -206
  116. package/test/lib/oauth.test.js +359 -359
  117. package/test/lib/ringcentral.test.js +467 -467
  118. package/test/lib/sharedSMSComposer.test.js +1084 -1084
  119. package/test/lib/util.test.js +329 -329
  120. package/test/mcp/tools/checkAuthStatus.test.js +83 -83
  121. package/test/mcp/tools/createCallLog.test.js +436 -436
  122. package/test/mcp/tools/createContact.test.js +58 -58
  123. package/test/mcp/tools/createMessageLog.test.js +595 -595
  124. package/test/mcp/tools/doAuth.test.js +113 -113
  125. package/test/mcp/tools/findContactByName.test.js +275 -275
  126. package/test/mcp/tools/findContactByPhone.test.js +296 -296
  127. package/test/mcp/tools/getCallLog.test.js +298 -298
  128. package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
  129. package/test/mcp/tools/getPublicConnectors.test.js +107 -107
  130. package/test/mcp/tools/getSessionInfo.test.js +127 -127
  131. package/test/mcp/tools/logout.test.js +233 -233
  132. package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
  133. package/test/mcp/tools/updateCallLog.test.js +360 -360
  134. package/test/models/accountDataModel.test.js +98 -98
  135. package/test/models/dynamo/connectorSchema.test.js +189 -189
  136. package/test/models/models.test.js +568 -539
  137. package/test/routes/managedAuthRoutes.test.js +235 -104
  138. package/test/setup.js +178 -178
package/docs/handlers.md CHANGED
@@ -1,125 +1,125 @@
1
- # Handlers
2
-
3
- Handlers contain the shared business workflows behind the route layer.
4
-
5
- ## Handler Overview
6
-
7
- | File | Responsibility | Main exports |
8
- | --- | --- | --- |
9
- | `handlers/auth.js` | Connector login, OAuth callback handling, user persistence, and auth validation | `onOAuthCallback`, `onApiKeyLogin`, `authValidation`, `getLicenseStatus`, `onRingcentralOAuthCallback` |
10
- | `handlers/contact.js` | Contact search, creation, and account-data caching | `findContact`, `createContact`, `findContactWithName` |
11
- | `handlers/log.js` | Call logging, message logging, plugin execution, call-log lookup, and note cache writes | `createCallLog`, `updateCallLog`, `createMessageLog`, `getCallLog`, `saveNoteCache` |
12
- | `handlers/admin.js` | Admin settings, RingCentral reporting, server logging settings, and user mapping | `validateAdminRole`, `upsertAdminSettings`, `getAdminSettings`, `updateAdminRcTokens`, `getServerLoggingSettings`, `updateServerLoggingSettings`, `getAdminReport`, `getUserReport`, `getUserMapping`, `reinitializeUserMapping` |
13
- | `handlers/user.js` | User setting reads, admin/user setting merge, and updates | `getUserSettingsByAdmin`, `getUserSettings`, `updateUserSettings` |
14
- | `handlers/disposition.js` | Call-disposition writes against an existing log | `upsertCallDisposition` |
15
- | `handlers/calldown.js` | User-owned call-down scheduling | `schedule`, `list`, `remove`, `markCalled`, `update` |
16
- | `handlers/plugin.js` | Async plugin task polling and cleanup | `getPluginAsyncTasks` |
17
- | `handlers/managedAuth.js` | Shared API-key auth field discovery, secure storage, and login-time field resolution | `getManagedAuthAdminSettings`, `getManagedAuthState`, `resolveApiKeyLoginFields`, `upsertOrgManagedAuthValues`, `upsertUserManagedAuthValues` |
18
-
19
- ## Common Execution Pattern
20
-
21
- Most connector-backed handlers follow the same sequence:
22
-
23
- 1. Load the current `UserModel` row.
24
- 2. Derive `proxyId` and optional proxy configuration from `platformAdditionalInfo`.
25
- 3. Resolve the connector from `connectorRegistry`.
26
- 4. Ask the connector for its auth type.
27
- 5. Refresh OAuth tokens through `lib/oauth.js` or build API-key auth.
28
- 6. Call the connector method with normalized inputs.
29
- 7. Return a shared `successful` plus `returnMessage` shape.
30
-
31
- ## `auth.js`
32
-
33
- Key behavior:
34
-
35
- - `onOAuthCallback()` completes the external OAuth code exchange, calls `getUserInfo()`, and persists the user through `saveUserInfo()`.
36
- - `onApiKeyLogin()` uses connector-provided basic-auth construction and the same user persistence path.
37
- - `onApiKeyLogin()` resolves shared API-key fields from `handlers/managedAuth.js`, ignores end-user overrides for shared fields, and returns `missingRequiredFieldConsts` when required fields are missing.
38
- - `saveUserInfo()` updates or creates `UserModel`, preserving existing `platformAdditionalInfo` keys and adding `proxyId`.
39
- - `authValidation()` refreshes OAuth tokens when needed, then delegates session validation to the connector.
40
- - `getLicenseStatus()` is connector-defined and only wrapped here.
41
- - `onRingcentralOAuthCallback()` stores admin RingCentral tokens in `AdminConfigModel`.
42
-
43
- ## `contact.js`
44
-
45
- Key behavior:
46
-
47
- - `findContact()` checks `AccountDataModel` cache first using `contact-${phoneNumber}` as the data key.
48
- - Found contacts are cached per `rcAccountId` and `platformName`.
49
- - Cache refresh can be forced with `isForceRefreshAccountData`.
50
- - Missing or expired users return warning-style response objects rather than throwing.
51
- - `findContactWithName()` mirrors the phone lookup path without the account-data cache.
52
-
53
- Known caveat called out in code:
54
-
55
- - account-data contact caching assumes one RingCentral account does not need separate caches for multiple CRM platforms at the same time
56
-
57
- ## `log.js`
58
-
59
- This is the heaviest handler in the package.
60
-
61
- Key responsibilities:
62
-
63
- - prevents duplicate call-log creation by checking `CallLogModel` on `sessionId`
64
- - loads note cache from DynamoDB when `USE_CACHE` and server-side call logging are enabled
65
- - runs configured plugins before creating or updating logs
66
- - composes log body content with `composeCallLog()` or `composeSharedSMSLog()`
67
- - stores local mappings between telephony ids and CRM log ids
68
- - handles normal SMS, fax, group SMS, and shared SMS cases
69
- - enriches tracking metadata for analytics callers
70
-
71
- Important persistence behavior:
72
-
73
- - `CallLogModel` stores the App Connect to CRM mapping for call logs
74
- - `MessageLogModel` stores the App Connect to CRM mapping for message logs
75
- - `CacheModel` stores async plugin task state
76
- - `NoteCache` stores temporary notes keyed by session id
77
-
78
- ## `admin.js`
79
-
80
- Key responsibilities:
81
-
82
- - validates RingCentral admin role from the current extension token
83
- - validates arbitrary RingCentral user tokens with `validateRcUserToken()`
84
- - stores and reads account-level admin configuration
85
- - stores admin OAuth tokens used for RingCentral reporting
86
- - fetches call aggregation and user activity metrics from RingCentral
87
- - delegates server-side logging settings to connector-specific methods when available
88
- - builds CRM user to RingCentral extension mappings through `getUserList()`
89
-
90
- ## `user.js`
91
-
92
- This module is mainly about merging account-level policy with per-user preferences.
93
-
94
- Rules implemented here:
95
-
96
- - if no admin settings exist, return user settings directly
97
- - admin settings can override or hide user settings
98
- - plugin settings merge at both the plugin level and nested config-field level
99
- - connectors can intercept setting updates with `onUpdateUserSettings()`
100
-
101
- ## Smaller Handler Modules
102
-
103
- `disposition.js`:
104
-
105
- - requires an existing local call-log mapping before writing disposition data
106
-
107
- `calldown.js`:
108
-
109
- - decodes the JWT directly
110
- - keeps operations scoped to the authenticated user
111
- - supports schedule, list, remove, mark-as-called, and partial update flows
112
-
113
- `plugin.js`:
114
-
115
- - returns cached async task status
116
- - deletes terminal task cache records after the client reads them
117
-
118
- `managedAuth.js`:
119
-
120
- - reads API-key field definitions from either the developer portal manifest or the connector registry manifest
121
- - isolates managed field definitions with `managed: true` and `managedScope` (`account` or `user`)
122
- - encrypts managed auth values before writing to `AccountDataModel`
123
- - provides admin views with stored values using `{ hasValue, value }` while keeping database values encrypted at rest
124
- - resolves login fields by merging stored managed values and non-managed end-user inputs
125
-
1
+ # Handlers
2
+
3
+ Handlers contain the shared business workflows behind the route layer.
4
+
5
+ ## Handler Overview
6
+
7
+ | File | Responsibility | Main exports |
8
+ | --- | --- | --- |
9
+ | `handlers/auth.js` | Connector login, OAuth callback handling, user persistence, and auth validation | `onOAuthCallback`, `onApiKeyLogin`, `authValidation`, `getLicenseStatus`, `onRingcentralOAuthCallback` |
10
+ | `handlers/contact.js` | Contact search, creation, and account-data caching | `findContact`, `createContact`, `findContactWithName` |
11
+ | `handlers/log.js` | Call logging, message logging, plugin execution, call-log lookup, and note cache writes | `createCallLog`, `updateCallLog`, `createMessageLog`, `getCallLog`, `saveNoteCache` |
12
+ | `handlers/admin.js` | Admin settings, RingCentral reporting, server logging settings, and user mapping | `validateAdminRole`, `upsertAdminSettings`, `getAdminSettings`, `updateAdminRcTokens`, `getServerLoggingSettings`, `updateServerLoggingSettings`, `getAdminReport`, `getUserReport`, `getUserMapping`, `reinitializeUserMapping` |
13
+ | `handlers/user.js` | User setting reads, admin/user setting merge, and updates | `getUserSettingsByAdmin`, `getUserSettings`, `updateUserSettings` |
14
+ | `handlers/disposition.js` | Call-disposition writes against an existing log | `upsertCallDisposition` |
15
+ | `handlers/calldown.js` | User-owned call-down scheduling | `schedule`, `list`, `remove`, `markCalled`, `update` |
16
+ | `handlers/plugin.js` | Async plugin task polling and cleanup | `getPluginAsyncTasks` |
17
+ | `handlers/managedAuth.js` | Shared API-key auth field discovery, secure storage, and login-time field resolution | `getManagedAuthAdminSettings`, `getManagedAuthState`, `resolveApiKeyLoginFields`, `upsertOrgManagedAuthValues`, `upsertUserManagedAuthValues` |
18
+
19
+ ## Common Execution Pattern
20
+
21
+ Most connector-backed handlers follow the same sequence:
22
+
23
+ 1. Load the current `UserModel` row.
24
+ 2. Derive `proxyId` and optional proxy configuration from `platformAdditionalInfo`.
25
+ 3. Resolve the connector from `connectorRegistry`.
26
+ 4. Ask the connector for its auth type.
27
+ 5. Refresh OAuth tokens through `lib/oauth.js` or build API-key auth.
28
+ 6. Call the connector method with normalized inputs.
29
+ 7. Return a shared `successful` plus `returnMessage` shape.
30
+
31
+ ## `auth.js`
32
+
33
+ Key behavior:
34
+
35
+ - `onOAuthCallback()` completes the external OAuth code exchange, calls `getUserInfo()`, and persists the user through `saveUserInfo()`.
36
+ - `onApiKeyLogin()` uses connector-provided basic-auth construction and the same user persistence path.
37
+ - `onApiKeyLogin()` resolves shared API-key fields from `handlers/managedAuth.js`, ignores end-user overrides for shared fields, and returns `missingRequiredFieldConsts` when required fields are missing.
38
+ - `saveUserInfo()` updates or creates `UserModel`, preserving existing `platformAdditionalInfo` keys and adding `proxyId`.
39
+ - `authValidation()` refreshes OAuth tokens when needed, then delegates session validation to the connector.
40
+ - `getLicenseStatus()` is connector-defined and only wrapped here.
41
+ - `onRingcentralOAuthCallback()` stores admin RingCentral tokens in `AdminConfigModel`.
42
+
43
+ ## `contact.js`
44
+
45
+ Key behavior:
46
+
47
+ - `findContact()` checks `AccountDataModel` cache first using `contact-${phoneNumber}` as the data key.
48
+ - Found contacts are cached per `rcAccountId` and `platformName`.
49
+ - Cache refresh can be forced with `isForceRefreshAccountData`.
50
+ - Missing or expired users return warning-style response objects rather than throwing.
51
+ - `findContactWithName()` mirrors the phone lookup path without the account-data cache.
52
+
53
+ Known caveat called out in code:
54
+
55
+ - account-data contact caching assumes one RingCentral account does not need separate caches for multiple CRM platforms at the same time
56
+
57
+ ## `log.js`
58
+
59
+ This is the heaviest handler in the package.
60
+
61
+ Key responsibilities:
62
+
63
+ - prevents duplicate call-log creation by checking `CallLogModel` on `sessionId`
64
+ - loads note cache from DynamoDB when `USE_CACHE` and server-side call logging are enabled
65
+ - runs configured plugins before creating or updating logs
66
+ - composes log body content with `composeCallLog()` or `composeSharedSMSLog()`
67
+ - stores local mappings between telephony ids and CRM log ids
68
+ - handles normal SMS, fax, group SMS, and shared SMS cases
69
+ - enriches tracking metadata for analytics callers
70
+
71
+ Important persistence behavior:
72
+
73
+ - `CallLogModel` stores the App Connect to CRM mapping for call logs
74
+ - `MessageLogModel` stores the App Connect to CRM mapping for message logs
75
+ - `CacheModel` stores async plugin task state
76
+ - `NoteCache` stores temporary notes keyed by session id
77
+
78
+ ## `admin.js`
79
+
80
+ Key responsibilities:
81
+
82
+ - validates RingCentral admin role from the current extension token
83
+ - validates arbitrary RingCentral user tokens with `validateRcUserToken()`
84
+ - stores and reads account-level admin configuration
85
+ - stores admin OAuth tokens used for RingCentral reporting
86
+ - fetches call aggregation and user activity metrics from RingCentral
87
+ - delegates server-side logging settings to connector-specific methods when available
88
+ - builds CRM user to RingCentral extension mappings through `getUserList()`
89
+
90
+ ## `user.js`
91
+
92
+ This module is mainly about merging account-level policy with per-user preferences.
93
+
94
+ Rules implemented here:
95
+
96
+ - if no admin settings exist, return user settings directly
97
+ - admin settings can override or hide user settings
98
+ - plugin settings merge at both the plugin level and nested config-field level
99
+ - connectors can intercept setting updates with `onUpdateUserSettings()`
100
+
101
+ ## Smaller Handler Modules
102
+
103
+ `disposition.js`:
104
+
105
+ - requires an existing local call-log mapping before writing disposition data
106
+
107
+ `calldown.js`:
108
+
109
+ - decodes the JWT directly
110
+ - keeps operations scoped to the authenticated user
111
+ - supports schedule, list, remove, mark-as-called, and partial update flows
112
+
113
+ `plugin.js`:
114
+
115
+ - returns cached async task status
116
+ - deletes terminal task cache records after the client reads them
117
+
118
+ `managedAuth.js`:
119
+
120
+ - reads API-key field definitions from either the developer portal manifest or the connector registry manifest
121
+ - isolates managed field definitions with `managed: true` and `managedScope` (`account` or `user`)
122
+ - encrypts managed auth values before writing to `AccountDataModel`
123
+ - provides admin views with stored values using `{ hasValue, value }` while keeping database values encrypted at rest
124
+ - resolves login fields by merging stored managed values and non-managed end-user inputs
125
+
package/docs/libraries.md CHANGED
@@ -1,101 +1,101 @@
1
- # Libraries
2
-
3
- The `lib/` directory contains cross-cutting helpers used by routes, handlers, and connectors.
4
-
5
- ## Infrastructure And Security
6
-
7
- | File | Responsibility |
8
- | --- | --- |
9
- | `lib/jwt.js` | Signs and verifies long-lived JWTs with `APP_SERVER_SECRET_KEY` |
10
- | `lib/oauth.js` | Builds OAuth clients and refreshes access tokens with lock protection |
11
- | `lib/authSession.js` | Stores and updates auth-session records used by auth flows |
12
- | `lib/encode.js` | Small encoding and decoding helpers for encrypted values |
13
- | `lib/errorHandler.js` | Normalizes API and database errors and exports Express error middleware |
14
- | `lib/logger.js` | Structured logger plus exported `Logger` class and log-level constants |
15
- | `lib/debugTracer.js` | Request-scoped trace collector used when debug mode is enabled |
16
- | `lib/s3ErrorLogReport.js` | S3 bucket setup and presigned upload URL generation for debug reports |
17
-
18
- ## RingCentral And Analytics Helpers
19
-
20
- | File | Responsibility |
21
- | --- | --- |
22
- | `lib/ringcentral.js` | RingCentral API wrapper plus token-validity helpers |
23
- | `lib/analytics.js` | Mixpanel initialization and event tracking |
24
- | `lib/generalErrorMessage.js` | Shared user-facing warning messages for auth and rate-limit cases |
25
-
26
- ## Formatting And Utility Helpers
27
-
28
- | File | Responsibility |
29
- | --- | --- |
30
- | `lib/callLogComposer.js` | Builds plain text, HTML, or Markdown call-log bodies |
31
- | `lib/sharedSMSComposer.js` | Builds shared-SMS conversation log content |
32
- | `lib/constants.js` | Defines `LOG_DETAILS_FORMAT_TYPE` values |
33
- | `lib/util.js` | Hashing, timezone lookup, media-reader links, plugin setting extraction, and date helpers |
34
-
35
- ## Notes By File
36
-
37
- ### `lib/analytics.js`
38
-
39
- - no-op unless `MIXPANEL_TOKEN` is present
40
- - attaches package version, app name, connector name, browser, OS, device, and caller metadata to events
41
- - requires `extensionId` to emit an event
42
-
43
- ### `lib/jwt.js`
44
-
45
- - `generateJwt()` signs with a very long expiration window
46
- - `decodeJwt()` logs and returns `null` on verification failure instead of throwing
47
-
48
- ### `lib/errorHandler.js`
49
-
50
- Exports:
51
-
52
- - `handleApiError()`
53
- - `handleDatabaseError()`
54
- - `asyncHandler()`
55
- - `errorMiddleware()`
56
- - `getOperationErrorMessage()`
57
-
58
- Notable behavior:
59
-
60
- - HTTP 429 becomes a rate-limit warning
61
- - HTTP 4xx up to 409 becomes an authorization-style warning
62
- - everything else becomes an operation-specific warning response
63
-
64
- ### `lib/callLogComposer.js`
65
-
66
- This module centralizes log-body generation for call logs.
67
-
68
- It supports:
69
-
70
- - plain text
71
- - HTML
72
- - Markdown
73
- - note insertion
74
- - session id, subject, duration, result, recording, and timestamp formatting
75
- - transcript and AI note insertion
76
- - leg journey formatting
77
- - ACE transcript, summary, score, bullet summary, and deep link sections
78
-
79
- ### `lib/sharedSMSComposer.js`
80
-
81
- This module formats shared SMS conversations for CRM logging.
82
-
83
- It handles:
84
-
85
- - message, note, and assignment entities
86
- - owner and assignee metadata
87
- - per-format output generation
88
- - summary counts and formatted timeline entries
89
-
90
- ### `lib/util.js`
91
-
92
- Exports:
93
-
94
- - `getTimeZone()`
95
- - `getHashValue()`
96
- - `secondsToHoursMinutesSeconds()`
97
- - `getMostRecentDate()`
98
- - `getMediaReaderLinkByPlatformMediaLink()`
99
- - `getPluginsFromUserSettings()`
100
-
101
- `getPluginsFromUserSettings()` is especially important because logging handlers use it to discover which plugins should run for call, SMS, or fax workflows.
1
+ # Libraries
2
+
3
+ The `lib/` directory contains cross-cutting helpers used by routes, handlers, and connectors.
4
+
5
+ ## Infrastructure And Security
6
+
7
+ | File | Responsibility |
8
+ | --- | --- |
9
+ | `lib/jwt.js` | Signs and verifies long-lived JWTs with `APP_SERVER_SECRET_KEY` |
10
+ | `lib/oauth.js` | Builds OAuth clients and refreshes access tokens with lock protection |
11
+ | `lib/authSession.js` | Stores and updates auth-session records used by auth flows |
12
+ | `lib/encode.js` | Small encoding and decoding helpers for encrypted values |
13
+ | `lib/errorHandler.js` | Normalizes API and database errors and exports Express error middleware |
14
+ | `lib/logger.js` | Structured logger plus exported `Logger` class and log-level constants |
15
+ | `lib/debugTracer.js` | Request-scoped trace collector used when debug mode is enabled |
16
+ | `lib/s3ErrorLogReport.js` | S3 bucket setup and presigned upload URL generation for debug reports |
17
+
18
+ ## RingCentral And Analytics Helpers
19
+
20
+ | File | Responsibility |
21
+ | --- | --- |
22
+ | `lib/ringcentral.js` | RingCentral API wrapper plus token-validity helpers |
23
+ | `lib/analytics.js` | Mixpanel initialization and event tracking |
24
+ | `lib/generalErrorMessage.js` | Shared user-facing warning messages for auth and rate-limit cases |
25
+
26
+ ## Formatting And Utility Helpers
27
+
28
+ | File | Responsibility |
29
+ | --- | --- |
30
+ | `lib/callLogComposer.js` | Builds plain text, HTML, or Markdown call-log bodies |
31
+ | `lib/sharedSMSComposer.js` | Builds shared-SMS conversation log content |
32
+ | `lib/constants.js` | Defines `LOG_DETAILS_FORMAT_TYPE` values |
33
+ | `lib/util.js` | Hashing, timezone lookup, media-reader links, plugin setting extraction, and date helpers |
34
+
35
+ ## Notes By File
36
+
37
+ ### `lib/analytics.js`
38
+
39
+ - no-op unless `MIXPANEL_TOKEN` is present
40
+ - attaches package version, app name, connector name, browser, OS, device, and caller metadata to events
41
+ - requires `extensionId` to emit an event
42
+
43
+ ### `lib/jwt.js`
44
+
45
+ - `generateJwt()` signs with a very long expiration window
46
+ - `decodeJwt()` logs and returns `null` on verification failure instead of throwing
47
+
48
+ ### `lib/errorHandler.js`
49
+
50
+ Exports:
51
+
52
+ - `handleApiError()`
53
+ - `handleDatabaseError()`
54
+ - `asyncHandler()`
55
+ - `errorMiddleware()`
56
+ - `getOperationErrorMessage()`
57
+
58
+ Notable behavior:
59
+
60
+ - HTTP 429 becomes a rate-limit warning
61
+ - HTTP 4xx up to 409 becomes an authorization-style warning
62
+ - everything else becomes an operation-specific warning response
63
+
64
+ ### `lib/callLogComposer.js`
65
+
66
+ This module centralizes log-body generation for call logs.
67
+
68
+ It supports:
69
+
70
+ - plain text
71
+ - HTML
72
+ - Markdown
73
+ - note insertion
74
+ - session id, subject, duration, result, recording, and timestamp formatting
75
+ - transcript and AI note insertion
76
+ - leg journey formatting
77
+ - ACE transcript, summary, score, bullet summary, and deep link sections
78
+
79
+ ### `lib/sharedSMSComposer.js`
80
+
81
+ This module formats shared SMS conversations for CRM logging.
82
+
83
+ It handles:
84
+
85
+ - message, note, and assignment entities
86
+ - owner and assignee metadata
87
+ - per-format output generation
88
+ - summary counts and formatted timeline entries
89
+
90
+ ### `lib/util.js`
91
+
92
+ Exports:
93
+
94
+ - `getTimeZone()`
95
+ - `getHashValue()`
96
+ - `secondsToHoursMinutesSeconds()`
97
+ - `getMostRecentDate()`
98
+ - `getMediaReaderLinkByPlatformMediaLink()`
99
+ - `getPluginsFromUserSettings()`
100
+
101
+ `getPluginsFromUserSettings()` is especially important because logging handlers use it to discover which plugins should run for call, SMS, or fax workflows.