@webex/contact-center 3.12.0-next.8 → 3.12.0-next.80

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 (205) hide show
  1. package/AGENTS.md +438 -0
  2. package/ai-docs/README.md +131 -0
  3. package/ai-docs/RULES.md +455 -0
  4. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  5. package/ai-docs/patterns/testing-patterns.md +480 -0
  6. package/ai-docs/patterns/typescript-patterns.md +365 -0
  7. package/ai-docs/templates/README.md +102 -0
  8. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  9. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  10. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  11. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  12. package/ai-docs/templates/new-method/00-master.md +80 -0
  13. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  14. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  15. package/ai-docs/templates/new-method/03-tests.md +201 -0
  16. package/ai-docs/templates/new-method/04-validation.md +141 -0
  17. package/ai-docs/templates/new-service/00-master.md +109 -0
  18. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  19. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  20. package/ai-docs/templates/new-service/03-integration.md +178 -0
  21. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  22. package/ai-docs/templates/new-service/05-validation.md +145 -0
  23. package/dist/cc.js +265 -29
  24. package/dist/cc.js.map +1 -1
  25. package/dist/config.js +6 -0
  26. package/dist/config.js.map +1 -1
  27. package/dist/constants.js +16 -1
  28. package/dist/constants.js.map +1 -1
  29. package/dist/index.js +20 -5
  30. package/dist/index.js.map +1 -1
  31. package/dist/metrics/behavioral-events.js +101 -0
  32. package/dist/metrics/behavioral-events.js.map +1 -1
  33. package/dist/metrics/constants.js +23 -4
  34. package/dist/metrics/constants.js.map +1 -1
  35. package/dist/services/ApiAiAssistant.js +74 -3
  36. package/dist/services/ApiAiAssistant.js.map +1 -1
  37. package/dist/services/UserPreference.js +427 -0
  38. package/dist/services/UserPreference.js.map +1 -0
  39. package/dist/services/config/Util.js +3 -3
  40. package/dist/services/config/Util.js.map +1 -1
  41. package/dist/services/config/constants.js +23 -2
  42. package/dist/services/config/constants.js.map +1 -1
  43. package/dist/services/config/types.js +49 -9
  44. package/dist/services/config/types.js.map +1 -1
  45. package/dist/services/core/Err.js.map +1 -1
  46. package/dist/services/core/Utils.js +107 -32
  47. package/dist/services/core/Utils.js.map +1 -1
  48. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  49. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  50. package/dist/services/core/websocket/types.js.map +1 -1
  51. package/dist/services/index.js +1 -1
  52. package/dist/services/index.js.map +1 -1
  53. package/dist/services/task/Task.js +688 -0
  54. package/dist/services/task/Task.js.map +1 -0
  55. package/dist/services/task/TaskFactory.js +45 -0
  56. package/dist/services/task/TaskFactory.js.map +1 -0
  57. package/dist/services/task/TaskManager.js +725 -526
  58. package/dist/services/task/TaskManager.js.map +1 -1
  59. package/dist/services/task/TaskUtils.js +162 -26
  60. package/dist/services/task/TaskUtils.js.map +1 -1
  61. package/dist/services/task/constants.js +9 -2
  62. package/dist/services/task/constants.js.map +1 -1
  63. package/dist/services/task/dialer.js +78 -0
  64. package/dist/services/task/dialer.js.map +1 -1
  65. package/dist/services/task/digital/Digital.js +77 -0
  66. package/dist/services/task/digital/Digital.js.map +1 -0
  67. package/dist/services/task/state-machine/TaskStateMachine.js +837 -0
  68. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  69. package/dist/services/task/state-machine/actions.js +543 -0
  70. package/dist/services/task/state-machine/actions.js.map +1 -0
  71. package/dist/services/task/state-machine/constants.js +161 -0
  72. package/dist/services/task/state-machine/constants.js.map +1 -0
  73. package/dist/services/task/state-machine/guards.js +340 -0
  74. package/dist/services/task/state-machine/guards.js.map +1 -0
  75. package/dist/services/task/state-machine/index.js +53 -0
  76. package/dist/services/task/state-machine/index.js.map +1 -0
  77. package/dist/services/task/state-machine/types.js +54 -0
  78. package/dist/services/task/state-machine/types.js.map +1 -0
  79. package/dist/services/task/state-machine/uiControlsComputer.js +553 -0
  80. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  81. package/dist/services/task/taskDataNormalizer.js +99 -0
  82. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  83. package/dist/services/task/types.js +212 -4
  84. package/dist/services/task/types.js.map +1 -1
  85. package/dist/services/task/voice/Voice.js +1042 -0
  86. package/dist/services/task/voice/Voice.js.map +1 -0
  87. package/dist/services/task/voice/WebRTC.js +149 -0
  88. package/dist/services/task/voice/WebRTC.js.map +1 -0
  89. package/dist/types/cc.d.ts +94 -1
  90. package/dist/types/config.d.ts +6 -0
  91. package/dist/types/constants.d.ts +16 -1
  92. package/dist/types/index.d.ts +21 -6
  93. package/dist/types/metrics/constants.d.ts +19 -1
  94. package/dist/types/services/ApiAiAssistant.d.ts +11 -3
  95. package/dist/types/services/UserPreference.d.ts +118 -0
  96. package/dist/types/services/config/constants.d.ts +21 -0
  97. package/dist/types/services/config/types.d.ts +171 -10
  98. package/dist/types/services/core/Err.d.ts +4 -0
  99. package/dist/types/services/core/Utils.d.ts +33 -13
  100. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  101. package/dist/types/services/core/websocket/types.d.ts +1 -1
  102. package/dist/types/services/index.d.ts +1 -1
  103. package/dist/types/services/task/Task.d.ts +157 -0
  104. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  105. package/dist/types/services/task/TaskUtils.d.ts +46 -2
  106. package/dist/types/services/task/constants.d.ts +7 -0
  107. package/dist/types/services/task/dialer.d.ts +30 -0
  108. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  109. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1144 -0
  110. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  111. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  112. package/dist/types/services/task/state-machine/guards.d.ts +90 -0
  113. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  114. package/dist/types/services/task/state-machine/types.d.ts +267 -0
  115. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  116. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  117. package/dist/types/services/task/types.d.ts +603 -66
  118. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  119. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  120. package/dist/types/types.d.ts +94 -0
  121. package/dist/types/webex.d.ts +1 -0
  122. package/dist/types.js +85 -0
  123. package/dist/types.js.map +1 -1
  124. package/dist/webex.js +14 -2
  125. package/dist/webex.js.map +1 -1
  126. package/package.json +15 -12
  127. package/src/cc.ts +329 -30
  128. package/src/config.ts +6 -0
  129. package/src/constants.ts +16 -1
  130. package/src/index.ts +23 -5
  131. package/src/metrics/ai-docs/AGENTS.md +348 -0
  132. package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
  133. package/src/metrics/behavioral-events.ts +106 -0
  134. package/src/metrics/constants.ts +23 -4
  135. package/src/services/ApiAiAssistant.ts +104 -3
  136. package/src/services/UserPreference.ts +509 -0
  137. package/src/services/agent/ai-docs/AGENTS.md +238 -0
  138. package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
  139. package/src/services/ai-docs/AGENTS.md +384 -0
  140. package/src/services/config/Util.ts +3 -3
  141. package/src/services/config/ai-docs/AGENTS.md +253 -0
  142. package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
  143. package/src/services/config/constants.ts +25 -1
  144. package/src/services/config/types.ts +174 -11
  145. package/src/services/core/Err.ts +2 -0
  146. package/src/services/core/Utils.ts +123 -37
  147. package/src/services/core/ai-docs/AGENTS.md +379 -0
  148. package/src/services/core/ai-docs/ARCHITECTURE.md +696 -0
  149. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  150. package/src/services/core/websocket/types.ts +1 -1
  151. package/src/services/index.ts +1 -1
  152. package/src/services/task/Task.ts +837 -0
  153. package/src/services/task/TaskFactory.ts +55 -0
  154. package/src/services/task/TaskManager.ts +738 -613
  155. package/src/services/task/TaskUtils.ts +205 -25
  156. package/src/services/task/ai-docs/AGENTS.md +455 -0
  157. package/src/services/task/ai-docs/ARCHITECTURE.md +585 -0
  158. package/src/services/task/constants.ts +7 -0
  159. package/src/services/task/dialer.ts +80 -0
  160. package/src/services/task/digital/Digital.ts +95 -0
  161. package/src/services/task/state-machine/TaskStateMachine.ts +1077 -0
  162. package/src/services/task/state-machine/actions.ts +685 -0
  163. package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
  164. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
  165. package/src/services/task/state-machine/constants.ts +172 -0
  166. package/src/services/task/state-machine/guards.ts +406 -0
  167. package/src/services/task/state-machine/index.ts +28 -0
  168. package/src/services/task/state-machine/types.ts +241 -0
  169. package/src/services/task/state-machine/uiControlsComputer.ts +867 -0
  170. package/src/services/task/taskDataNormalizer.ts +137 -0
  171. package/src/services/task/types.ts +710 -71
  172. package/src/services/task/voice/Voice.ts +1267 -0
  173. package/src/services/task/voice/WebRTC.ts +187 -0
  174. package/src/types.ts +122 -2
  175. package/src/utils/AGENTS.md +276 -0
  176. package/src/webex.js +2 -0
  177. package/test/unit/spec/cc.ts +343 -23
  178. package/test/unit/spec/logger-proxy.ts +70 -0
  179. package/test/unit/spec/services/ApiAiAssistant.ts +122 -17
  180. package/test/unit/spec/services/UserPreference.ts +401 -0
  181. package/test/unit/spec/services/WebCallingService.ts +7 -1
  182. package/test/unit/spec/services/config/index.ts +30 -30
  183. package/test/unit/spec/services/core/Utils.ts +425 -8
  184. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  185. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  186. package/test/unit/spec/services/task/Task.ts +477 -0
  187. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  188. package/test/unit/spec/services/task/TaskManager.ts +832 -1702
  189. package/test/unit/spec/services/task/TaskUtils.ts +206 -0
  190. package/test/unit/spec/services/task/dialer.ts +190 -0
  191. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  192. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1825 -0
  193. package/test/unit/spec/services/task/state-machine/guards.ts +479 -0
  194. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  195. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2020 -0
  196. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  197. package/test/unit/spec/services/task/voice/Voice.ts +631 -0
  198. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  199. package/umd/contact-center.min.js +2 -2
  200. package/umd/contact-center.min.js.map +1 -1
  201. package/dist/services/task/index.js +0 -1525
  202. package/dist/services/task/index.js.map +0 -1
  203. package/dist/types/services/task/index.d.ts +0 -650
  204. package/src/services/task/index.ts +0 -1801
  205. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,379 @@
1
+ # Core Service - AI Agent Guide
2
+
3
+ > **This is the authoritative documentation for the Core service scope.** Core infrastructure components including WebSocket management, HTTP requests, error handling, and utilities. For task routing, critical rules, and cross-service patterns, see the [root orchestrator AGENTS.md](../../../AGENTS.md).
4
+
5
+ ---
6
+
7
+ ## Key Capabilities
8
+
9
+ The Core service provides the foundational infrastructure layer that all other services depend on:
10
+
11
+ - **WebSocket Communication**: Real-time bidirectional messaging with the contact center backend, including automatic reconnection and keepalive management
12
+ - **HTTP Request Handling**: Authenticated REST API calls to WCC API Gateway with built-in error handling and log upload support
13
+ - **AQM Request/Response Pattern**: A structured pattern used by the routing and contact layers to send HTTP requests to the contact center backend and correlate responses/failures via WebSocket notifications
14
+ - **Error Handling & Logging**: Standardized error extraction, logging via `LoggerProxy`, and log upload utilities that all services use for consistent error reporting
15
+
16
+ | Component | File | Description |
17
+ |-----------|------|-------------|
18
+ | `WebSocketManager` | [`WebSocketManager.ts`](../websocket/WebSocketManager.ts) | Manages the WebSocket connection lifecycle including initialization, message dispatch, and graceful shutdown. Emits `message` events for incoming data and `socketClose` when the connection drops while reconnect is allowed. |
19
+ | `ConnectionService` | [`connection-service.ts`](../websocket/connection-service.ts) | Orchestrates reconnection logic and keepalive heartbeats on top of `WebSocketManager`. Detects connection loss and triggers `silentRelogin()` to restore agent state transparently. |
20
+ | `WebexRequest` | [`WebexRequest.ts`](../WebexRequest.ts) | Singleton HTTP client that wraps authenticated requests to the WCC API Gateway. Handles service routing, response parsing, and provides a `uploadLogs` method for diagnostics. |
21
+ | `AqmReqs` | [`aqm-reqs.ts`](../aqm-reqs.ts) | Factory for creating request methods that send HTTP requests and wait for correlated WebSocket notifications (success or failure). Used by routing and task services to implement their API methods. |
22
+ | `Utils` | [`Utils.ts`](../Utils.ts) | Shared utility functions including `getErrorDetails()` for standardized error handling, `generateTaskErrorObject()` for task-specific errors, and `createErrDetailsObject()` for constructing error detail objects. |
23
+ | `Err` | [`Err.ts`](../Err.ts) | Error class definitions. `Err.Details` carries structured error metadata (status, type, trackingId) for consistent error propagation. |
24
+ | `constants` | [`constants.ts`](../constants.ts) | Timeout values, interval durations, participant types, interaction states, and method name constants used throughout the core layer. Any new constants for core should be defined here. |
25
+
26
+ ---
27
+
28
+ ## File Structure
29
+
30
+ ```
31
+ services/core/
32
+ ├── aqm-reqs.ts # AQM request handler
33
+ ├── constants.ts # Core constants
34
+ ├── Err.ts # Error classes
35
+ ├── GlobalTypes.ts # Failure, Msg<T>, etc.
36
+ ├── types.ts # Request/response types
37
+ ├── Utils.ts # Utility functions
38
+ ├── WebexRequest.ts # HTTP client
39
+ └── websocket/
40
+ ├── WebSocketManager.ts # Main WS handler
41
+ ├── connection-service.ts # Connection lifecycle
42
+ ├── keepalive.worker.js # Keepalive worker
43
+ └── types.ts # WS types
44
+ ```
45
+
46
+ ---
47
+
48
+
49
+ ## WebSocketManager
50
+
51
+ `WebSocketManager` handles the raw WebSocket connection to the contact center backend. It is instantiated by the `Services` layer and used internally — other services interact with it through `ConnectionService`.
52
+
53
+ ### Reference Usage
54
+
55
+ ```typescript
56
+ // Initialize in Services
57
+ this.webSocketManager = new WebSocketManager({webex});
58
+
59
+ // Connect
60
+ const welcomeEvent = await webSocketManager.initWebSocket({
61
+ body: connectionConfig,
62
+ });
63
+
64
+ // Listen for messages
65
+ webSocketManager.on('message', (event) => {
66
+ const data = JSON.parse(event);
67
+ // Handle event
68
+ });
69
+
70
+ // Close
71
+ webSocketManager.close(false, 'Reason');
72
+ ```
73
+
74
+ ### Events
75
+
76
+ | Event | Data | Description |
77
+ |-------|------|-------------|
78
+ | `message` | string (JSON) | WebSocket message received |
79
+ | `socketClose` | - | Socket closed while reconnect is allowed |
80
+
81
+ ### Connection Lifecycle
82
+
83
+ `WebSocketManager` and `ConnectionService` work together to manage the full connection lifecycle. `WebSocketManager` owns the raw socket while `ConnectionService` adds reconnection intelligence and keepalive on top.
84
+
85
+ **Connection Flow:**
86
+
87
+ ```
88
+ 1. initWebSocket() called
89
+ 2. ConnectionService listeners attached (`message`, `socketClose`) during construction
90
+ 3. WebSocket connects to backend
91
+ 4. Keepalive worker started on `onopen`
92
+ 5. Welcome event received
93
+ 6. Runtime messages/keepalive processed via existing listeners
94
+ ```
95
+
96
+ **Reconnection Flow:**
97
+
98
+ ```
99
+ 1. Connection lost detected
100
+ 2. ConnectionService emits 'connectionLost'
101
+ 3. cc.handleConnectionLost() called
102
+ 4. silentRelogin() attempted
103
+ 5. On success: state restored
104
+ 6. On AGENT_NOT_FOUND: handle silently
105
+ ```
106
+
107
+ ### Keepalive
108
+
109
+ A Web Worker ([`keepalive.worker.js`](../websocket/keepalive.worker.js)) runs alongside the WebSocket to detect connection loss and keep the socket alive. It starts on `onopen` and sends `{keepalive: 'true'}` to the backend every **4 seconds** (`KEEPALIVE_WORKER_INTERVAL`). The worker also monitors `navigator.onLine` — if the network goes offline and the socket doesn't close within **16 seconds** (`CLOSE_SOCKET_TIMEOUT`), it force-closes the socket.
110
+
111
+ On the receiving side, `ConnectionService.onPing()` listens for all WebSocket messages and resets two timers on each message:
112
+ - **`reconnectingTimer`** (8s / `WS_DISCONNECT_ALLOWED`) — if no message arrives within 8s, marks connection as lost
113
+ - **`restoreTimer`** (`lostConnectionRecoveryTimeout` from agent config) — if connection isn't restored within this window, marks restore as failed
114
+
115
+ When a keepalive response arrives after a lost-connection state, `ConnectionService` resets its flags and dispatches a recovery event. If the socket fully closes, `ConnectionService` retries `initWebSocket()` every **5 seconds** (`CONNECTIVITY_CHECK_INTERVAL`).
116
+
117
+ ---
118
+
119
+ ## WebexRequest
120
+
121
+ `WebexRequest` is a singleton HTTP client that all services use to make authenticated REST API calls to the contact center backend. It handles service URL resolution, request formatting, and response parsing.
122
+
123
+ ### The `service` Property
124
+
125
+ The `service` field in request options is a **service identifier string** that the Webex SDK's internal service catalog (`this.webex.request()`) resolves to a base URL at runtime. All contact center API calls use:
126
+
127
+ ```typescript
128
+ import {WCC_API_GATEWAY} from '../constants';
129
+ // WCC_API_GATEWAY = 'wcc-api-gateway'
130
+ ```
131
+
132
+ This constant is defined in [`services/constants.ts`](../../constants.ts). The Webex SDK maps `'wcc-api-gateway'` to the appropriate contact center API gateway URL based on the environment. The `resource` is then appended as the path.
133
+
134
+ ### Reference Usage
135
+
136
+ ```typescript
137
+ // Get singleton
138
+ const webexReq = WebexRequest.getInstance({webex});
139
+
140
+ // Make request
141
+ const response = await webexReq.request({
142
+ service: WCC_API_GATEWAY, // resolved to base URL by Webex SDK
143
+ resource: '/v1/endpoint', // appended as path
144
+ method: HTTP_METHODS.POST,
145
+ body: { key: 'value' }, // optional request payload
146
+ });
147
+
148
+ // Upload logs
149
+ await webexReq.uploadLogs({
150
+ correlationId: trackingId,
151
+ });
152
+ ```
153
+
154
+ ### Response Structure
155
+
156
+ ```typescript
157
+ {
158
+ statusCode: 200,
159
+ body: { /* response data */ },
160
+ headers: {
161
+ trackingid: 'uuid',
162
+ },
163
+ }
164
+ ```
165
+
166
+ ---
167
+
168
+ ## AqmReqs
169
+
170
+ The AQM (Agent Queue Manager) layer provides a request/response pattern over HTTP + WebSocket. Services like **routing** and **contact** use `AqmReqs` to define API methods that:
171
+
172
+ 1. Send an HTTP request to the contact center backend via `WebexRequest`
173
+ 2. Wait for a correlated WebSocket notification indicating success or failure
174
+ 3. Return the typed result or throw a structured error
175
+
176
+ This decouples the request initiation (HTTP) from the asynchronous result delivery (WebSocket), which matches the contact center backend's event-driven architecture.
177
+
178
+ ### Reference Usage
179
+
180
+ ```typescript
181
+ // Define request configuration
182
+ const serviceMethod = routing.req((p: {data: ParamType}) => ({
183
+ url: '/v1/endpoint',
184
+ host: WCC_API_GATEWAY,
185
+ data: p.data,
186
+ method: HTTP_METHODS.POST,
187
+ err: errorHandler,
188
+ notifSuccess: {
189
+ bind: {type: CC_EVENTS.SUCCESS, data: {type: CC_EVENTS.SUCCESS}},
190
+ msg: {} as SuccessType,
191
+ },
192
+ notifFail: {
193
+ bind: {type: CC_EVENTS.FAIL, data: {type: CC_EVENTS.FAIL}},
194
+ errId: 'Service.aqm.operation',
195
+ },
196
+ }));
197
+
198
+ // Call method
199
+ const result = await serviceMethod({data: params});
200
+ ```
201
+
202
+ ---
203
+
204
+ ## Error Handling Utilities
205
+
206
+ ### `getErrorDetails()`
207
+
208
+ Standard error handler for SDK operations:
209
+
210
+ ```typescript
211
+ import {getErrorDetails} from './services/core/Utils';
212
+
213
+ try {
214
+ await operation();
215
+ } catch (error) {
216
+ const {error: detailedError, reason} = getErrorDetails(
217
+ error,
218
+ 'methodName', // Method name for logging
219
+ 'ModuleName' // Module name for logging
220
+ );
221
+
222
+ // getErrorDetails automatically:
223
+ // 1. Logs the error
224
+ // 2. Uploads logs (unless AGENT_NOT_FOUND in silentRelogin)
225
+ // 3. Extracts reason from error.details
226
+ // 4. Creates Error with reason as message
227
+
228
+ throw detailedError;
229
+ }
230
+ ```
231
+
232
+ ### `generateTaskErrorObject()`
233
+
234
+ Error handler for task operations:
235
+
236
+ ```typescript
237
+ import {generateTaskErrorObject} from './services/core/Utils';
238
+
239
+ try {
240
+ await taskOperation();
241
+ } catch (error) {
242
+ const taskError = generateTaskErrorObject(
243
+ error,
244
+ 'transfer',
245
+ 'TaskModule'
246
+ );
247
+ throw taskError;
248
+ }
249
+ ```
250
+
251
+ ---
252
+
253
+ ## Type Definitions
254
+
255
+ ### Msg\<T\>
256
+
257
+ Generic message wrapper used throughout the SDK. All WebSocket messages and AQM responses conform to this shape:
258
+
259
+ ```typescript
260
+ export type Msg<T = any> = {
261
+ type: string; // Message/Event type identifier
262
+ orgId: string; // Organization identifier
263
+ trackingId: string; // Unique tracking identifier
264
+ data: T; // Message/Event payload data
265
+ };
266
+
267
+ // Usage — the payload type goes into `data`
268
+ export type LoginSuccess = Msg<{
269
+ agentId: string;
270
+ status: string;
271
+ // ...
272
+ }>;
273
+ // Resulting shape: { type, orgId, trackingId, data: { agentId, status, ... } }
274
+ ```
275
+
276
+ ### Failure
277
+
278
+ A specific `Msg<T>` for failure responses. Access error details via `failure.data`:
279
+
280
+ ```typescript
281
+ export type Failure = Msg<{
282
+ agentId: string;
283
+ trackingId: string;
284
+ reasonCode: number;
285
+ orgId: string;
286
+ reason: string;
287
+ }>;
288
+
289
+ // Usage in catch
290
+ const failure = error.details as Failure;
291
+ LoggerProxy.error(`Operation failed: ${failure.data?.reason}`, {
292
+ module: 'MyService',
293
+ method: 'myMethod',
294
+ trackingId: failure?.trackingId,
295
+ });
296
+ ```
297
+
298
+ ### AugmentedError
299
+
300
+ Error interface with a flexible data field for additional context:
301
+
302
+ ```typescript
303
+ export interface AugmentedError extends Error {
304
+ data?: Record<string, any>;
305
+ }
306
+ ```
307
+
308
+ ---
309
+
310
+ ## Error Classes
311
+
312
+ ### Err.Details
313
+
314
+ ```typescript
315
+ import * as Err from './Err';
316
+
317
+ const error = new Err.Details('Service.aqm.agent.login', {
318
+ status: 401,
319
+ type: 'UNAUTHORIZED',
320
+ trackingId: 'uuid',
321
+ });
322
+ ```
323
+
324
+ ### createErrDetailsObject
325
+
326
+ ```typescript
327
+ import {createErrDetailsObject} from './Utils';
328
+
329
+ const errDetails = createErrDetailsObject(webexRequestPayload);
330
+ // Returns Err.Details with trackingId and body
331
+ ```
332
+
333
+ ---
334
+
335
+ ## Constants
336
+
337
+ All core-level constants (timeouts, intervals, participant types, method names) are defined in [`constants.ts`](../constants.ts). Any new constants for the core layer should be added there.
338
+
339
+ ---
340
+
341
+ ## Best Practices
342
+
343
+ ### Always Use Error Utilities
344
+
345
+ ```typescript
346
+ // Correct
347
+ const {error: detailedError} = getErrorDetails(error, method, module);
348
+ throw detailedError;
349
+
350
+ // Wrong - loses context
351
+ throw error;
352
+ ```
353
+
354
+ ### Check Response Status
355
+
356
+ ```typescript
357
+ const response = await webexReq.request({...});
358
+
359
+ if (response.statusCode !== 200) {
360
+ throw new Error(`API call failed with ${response.statusCode}`);
361
+ }
362
+ ```
363
+
364
+ ### Extract TrackingId
365
+
366
+ ```typescript
367
+ const trackingId = response.headers?.trackingid ||
368
+ response.headers?.TrackingID;
369
+ ```
370
+
371
+ ---
372
+
373
+ ## Related
374
+
375
+ - [Root Orchestrator AGENTS.md](../../../AGENTS.md) - Task routing, critical rules, cross-service patterns
376
+ - [WebSocketManager.ts](../websocket/WebSocketManager.ts)
377
+ - [WebexRequest.ts](../WebexRequest.ts)
378
+ - [Utils.ts](../Utils.ts)
379
+ - [GlobalTypes.ts](../GlobalTypes.ts)