@app-connect/core 1.7.24 → 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.
Files changed (137) hide show
  1. package/.env.test +5 -5
  2. package/README.md +441 -441
  3. package/connector/developerPortal.js +31 -42
  4. package/connector/mock.js +84 -77
  5. package/connector/proxy/engine.js +164 -163
  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 -117
  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 +296 -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 +984 -973
  23. package/handlers/managedAuth.js +446 -446
  24. package/handlers/plugin.js +208 -208
  25. package/handlers/user.js +142 -142
  26. package/index.js +3140 -2652
  27. package/jest.config.js +56 -56
  28. package/lib/analytics.js +54 -54
  29. package/lib/authSession.js +109 -109
  30. package/lib/cacheCleanup.js +21 -0
  31. package/lib/callLogComposer.js +898 -898
  32. package/lib/callLogLookup.js +34 -0
  33. package/lib/constants.js +8 -8
  34. package/lib/debugTracer.js +177 -177
  35. package/lib/encode.js +30 -30
  36. package/lib/errorHandler.js +218 -206
  37. package/lib/generalErrorMessage.js +41 -41
  38. package/lib/jwt.js +18 -18
  39. package/lib/logger.js +190 -190
  40. package/lib/migrateCallLogsSchema.js +116 -0
  41. package/lib/ringcentral.js +266 -266
  42. package/lib/s3ErrorLogReport.js +65 -65
  43. package/lib/sharedSMSComposer.js +471 -471
  44. package/lib/util.js +67 -67
  45. package/mcp/README.md +412 -395
  46. package/mcp/lib/validator.js +91 -91
  47. package/mcp/mcpHandler.js +425 -425
  48. package/mcp/tools/cancelAppointment.js +101 -0
  49. package/mcp/tools/checkAuthStatus.js +105 -105
  50. package/mcp/tools/confirmAppointment.js +101 -0
  51. package/mcp/tools/createAppointment.js +157 -0
  52. package/mcp/tools/createCallLog.js +327 -316
  53. package/mcp/tools/createContact.js +117 -117
  54. package/mcp/tools/createMessageLog.js +287 -287
  55. package/mcp/tools/doAuth.js +60 -60
  56. package/mcp/tools/findContactByName.js +93 -93
  57. package/mcp/tools/findContactByPhone.js +101 -101
  58. package/mcp/tools/getCallLog.js +111 -102
  59. package/mcp/tools/getGoogleFilePicker.js +99 -99
  60. package/mcp/tools/getHelp.js +43 -43
  61. package/mcp/tools/getPublicConnectors.js +94 -94
  62. package/mcp/tools/getSessionInfo.js +90 -90
  63. package/mcp/tools/index.js +51 -41
  64. package/mcp/tools/listAppointments.js +163 -0
  65. package/mcp/tools/logout.js +96 -96
  66. package/mcp/tools/rcGetCallLogs.js +65 -65
  67. package/mcp/tools/updateAppointment.js +154 -0
  68. package/mcp/tools/updateCallLog.js +130 -126
  69. package/mcp/ui/App/App.tsx +358 -358
  70. package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
  71. package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
  72. package/mcp/ui/App/components/ConnectorList.tsx +82 -82
  73. package/mcp/ui/App/components/DebugPanel.tsx +43 -43
  74. package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
  75. package/mcp/ui/App/lib/callTool.ts +130 -130
  76. package/mcp/ui/App/lib/debugLog.ts +41 -41
  77. package/mcp/ui/App/lib/developerPortal.ts +111 -111
  78. package/mcp/ui/App/main.css +5 -5
  79. package/mcp/ui/App/root.tsx +13 -13
  80. package/mcp/ui/index.html +13 -13
  81. package/mcp/ui/package-lock.json +6356 -6356
  82. package/mcp/ui/package.json +25 -25
  83. package/mcp/ui/tsconfig.json +26 -26
  84. package/mcp/ui/vite.config.ts +16 -16
  85. package/models/accountDataModel.js +33 -33
  86. package/models/adminConfigModel.js +35 -35
  87. package/models/cacheModel.js +30 -26
  88. package/models/callDownListModel.js +34 -34
  89. package/models/callLogModel.js +33 -27
  90. package/models/dynamo/connectorSchema.js +146 -146
  91. package/models/dynamo/lockSchema.js +24 -24
  92. package/models/dynamo/noteCacheSchema.js +29 -29
  93. package/models/llmSessionModel.js +17 -17
  94. package/models/messageLogModel.js +25 -25
  95. package/models/sequelize.js +16 -16
  96. package/models/userModel.js +45 -45
  97. package/package.json +72 -72
  98. package/releaseNotes.json +1093 -1073
  99. package/test/connector/proxy/engine.test.js +126 -93
  100. package/test/connector/proxy/index.test.js +279 -279
  101. package/test/connector/proxy/sample.json +161 -161
  102. package/test/connector/registry.test.js +415 -415
  103. package/test/handlers/admin.test.js +616 -616
  104. package/test/handlers/auth.test.js +1018 -1015
  105. package/test/handlers/contact.test.js +1014 -1014
  106. package/test/handlers/log.test.js +1298 -1160
  107. package/test/handlers/managedAuth.test.js +458 -458
  108. package/test/handlers/plugin.test.js +380 -380
  109. package/test/index.test.js +105 -105
  110. package/test/lib/cacheCleanup.test.js +42 -0
  111. package/test/lib/callLogComposer.test.js +1231 -1231
  112. package/test/lib/debugTracer.test.js +328 -328
  113. package/test/lib/jwt.test.js +176 -176
  114. package/test/lib/logger.test.js +206 -206
  115. package/test/lib/oauth.test.js +359 -359
  116. package/test/lib/ringcentral.test.js +467 -467
  117. package/test/lib/sharedSMSComposer.test.js +1084 -1084
  118. package/test/lib/util.test.js +329 -329
  119. package/test/mcp/tools/checkAuthStatus.test.js +83 -82
  120. package/test/mcp/tools/createCallLog.test.js +436 -436
  121. package/test/mcp/tools/createContact.test.js +58 -58
  122. package/test/mcp/tools/createMessageLog.test.js +595 -595
  123. package/test/mcp/tools/doAuth.test.js +113 -113
  124. package/test/mcp/tools/findContactByName.test.js +275 -275
  125. package/test/mcp/tools/findContactByPhone.test.js +296 -296
  126. package/test/mcp/tools/getCallLog.test.js +298 -298
  127. package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
  128. package/test/mcp/tools/getPublicConnectors.test.js +107 -107
  129. package/test/mcp/tools/getSessionInfo.test.js +127 -127
  130. package/test/mcp/tools/logout.test.js +233 -233
  131. package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
  132. package/test/mcp/tools/updateCallLog.test.js +360 -360
  133. package/test/models/accountDataModel.test.js +98 -98
  134. package/test/models/dynamo/connectorSchema.test.js +189 -189
  135. package/test/models/models.test.js +568 -539
  136. package/test/routes/managedAuthRoutes.test.js +104 -129
  137. 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.