@webex/contact-center 3.12.0-next.9 → 3.12.0-task-refactor.2

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 (200) 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 +65 -123
  24. package/dist/cc.js.map +1 -1
  25. package/dist/constants.js +13 -2
  26. package/dist/constants.js.map +1 -1
  27. package/dist/index.js +13 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/metrics/behavioral-events.js +26 -13
  30. package/dist/metrics/behavioral-events.js.map +1 -1
  31. package/dist/metrics/constants.js +7 -6
  32. package/dist/metrics/constants.js.map +1 -1
  33. package/dist/services/ApiAiAssistant.js +0 -3
  34. package/dist/services/ApiAiAssistant.js.map +1 -1
  35. package/dist/services/config/Util.js +2 -3
  36. package/dist/services/config/Util.js.map +1 -1
  37. package/dist/services/config/types.js +16 -14
  38. package/dist/services/config/types.js.map +1 -1
  39. package/dist/services/constants.js +0 -1
  40. package/dist/services/constants.js.map +1 -1
  41. package/dist/services/core/Err.js.map +1 -1
  42. package/dist/services/core/Utils.js +79 -55
  43. package/dist/services/core/Utils.js.map +1 -1
  44. package/dist/services/core/aqm-reqs.js +17 -92
  45. package/dist/services/core/aqm-reqs.js.map +1 -1
  46. package/dist/services/core/websocket/WebSocketManager.js +5 -25
  47. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  48. package/dist/services/core/websocket/types.js.map +1 -1
  49. package/dist/services/index.js +1 -2
  50. package/dist/services/index.js.map +1 -1
  51. package/dist/services/task/Task.js +644 -0
  52. package/dist/services/task/Task.js.map +1 -0
  53. package/dist/services/task/TaskFactory.js +45 -0
  54. package/dist/services/task/TaskFactory.js.map +1 -0
  55. package/dist/services/task/TaskManager.js +570 -535
  56. package/dist/services/task/TaskManager.js.map +1 -1
  57. package/dist/services/task/TaskUtils.js +132 -28
  58. package/dist/services/task/TaskUtils.js.map +1 -1
  59. package/dist/services/task/constants.js +7 -6
  60. package/dist/services/task/constants.js.map +1 -1
  61. package/dist/services/task/dialer.js +0 -51
  62. package/dist/services/task/dialer.js.map +1 -1
  63. package/dist/services/task/digital/Digital.js +77 -0
  64. package/dist/services/task/digital/Digital.js.map +1 -0
  65. package/dist/services/task/state-machine/TaskStateMachine.js +634 -0
  66. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  67. package/dist/services/task/state-machine/actions.js +372 -0
  68. package/dist/services/task/state-machine/actions.js.map +1 -0
  69. package/dist/services/task/state-machine/constants.js +139 -0
  70. package/dist/services/task/state-machine/constants.js.map +1 -0
  71. package/dist/services/task/state-machine/guards.js +263 -0
  72. package/dist/services/task/state-machine/guards.js.map +1 -0
  73. package/dist/services/task/state-machine/index.js +53 -0
  74. package/dist/services/task/state-machine/index.js.map +1 -0
  75. package/dist/services/task/state-machine/types.js +54 -0
  76. package/dist/services/task/state-machine/types.js.map +1 -0
  77. package/dist/services/task/state-machine/uiControlsComputer.js +377 -0
  78. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  79. package/dist/services/task/taskDataNormalizer.js +99 -0
  80. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  81. package/dist/services/task/types.js +157 -18
  82. package/dist/services/task/types.js.map +1 -1
  83. package/dist/services/task/voice/Voice.js +1031 -0
  84. package/dist/services/task/voice/Voice.js.map +1 -0
  85. package/dist/services/task/voice/WebRTC.js +149 -0
  86. package/dist/services/task/voice/WebRTC.js.map +1 -0
  87. package/dist/types/cc.d.ts +4 -33
  88. package/dist/types/constants.d.ts +13 -2
  89. package/dist/types/index.d.ts +11 -5
  90. package/dist/types/metrics/constants.d.ts +5 -3
  91. package/dist/types/services/ApiAiAssistant.d.ts +1 -1
  92. package/dist/types/services/config/types.d.ts +97 -25
  93. package/dist/types/services/core/Err.d.ts +0 -2
  94. package/dist/types/services/core/Utils.d.ts +25 -23
  95. package/dist/types/services/core/aqm-reqs.d.ts +0 -49
  96. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -1
  97. package/dist/types/services/core/websocket/connection-service.d.ts +0 -1
  98. package/dist/types/services/core/websocket/types.d.ts +1 -1
  99. package/dist/types/services/index.d.ts +1 -1
  100. package/dist/types/services/task/Task.d.ts +146 -0
  101. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  102. package/dist/types/services/task/TaskUtils.d.ts +39 -8
  103. package/dist/types/services/task/constants.d.ts +5 -4
  104. package/dist/types/services/task/dialer.d.ts +0 -15
  105. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  106. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +906 -0
  107. package/dist/types/services/task/state-machine/actions.d.ts +8 -0
  108. package/dist/types/services/task/state-machine/constants.d.ts +91 -0
  109. package/dist/types/services/task/state-machine/guards.d.ts +78 -0
  110. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  111. package/dist/types/services/task/state-machine/types.d.ts +256 -0
  112. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  113. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  114. package/dist/types/services/task/types.d.ts +539 -88
  115. package/dist/types/services/task/voice/Voice.d.ts +183 -0
  116. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  117. package/dist/types/types.d.ts +68 -0
  118. package/dist/types/webex.d.ts +1 -0
  119. package/dist/types.js +70 -0
  120. package/dist/types.js.map +1 -1
  121. package/dist/webex.js +14 -2
  122. package/dist/webex.js.map +1 -1
  123. package/package.json +14 -11
  124. package/src/cc.ts +91 -177
  125. package/src/constants.ts +13 -2
  126. package/src/index.ts +14 -5
  127. package/src/metrics/ai-docs/AGENTS.md +348 -0
  128. package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
  129. package/src/metrics/behavioral-events.ts +28 -14
  130. package/src/metrics/constants.ts +7 -8
  131. package/src/services/ApiAiAssistant.ts +2 -4
  132. package/src/services/agent/ai-docs/AGENTS.md +238 -0
  133. package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
  134. package/src/services/ai-docs/AGENTS.md +384 -0
  135. package/src/services/config/Util.ts +2 -3
  136. package/src/services/config/ai-docs/AGENTS.md +253 -0
  137. package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
  138. package/src/services/config/types.ts +108 -20
  139. package/src/services/constants.ts +0 -1
  140. package/src/services/core/Err.ts +0 -1
  141. package/src/services/core/Utils.ts +90 -67
  142. package/src/services/core/ai-docs/AGENTS.md +379 -0
  143. package/src/services/core/ai-docs/ARCHITECTURE.md +696 -0
  144. package/src/services/core/aqm-reqs.ts +22 -100
  145. package/src/services/core/websocket/WebSocketManager.ts +4 -23
  146. package/src/services/core/websocket/types.ts +1 -1
  147. package/src/services/index.ts +1 -2
  148. package/src/services/task/Task.ts +785 -0
  149. package/src/services/task/TaskFactory.ts +55 -0
  150. package/src/services/task/TaskManager.ts +579 -633
  151. package/src/services/task/TaskUtils.ts +175 -31
  152. package/src/services/task/ai-docs/AGENTS.md +448 -0
  153. package/src/services/task/ai-docs/ARCHITECTURE.md +573 -0
  154. package/src/services/task/constants.ts +5 -4
  155. package/src/services/task/dialer.ts +1 -56
  156. package/src/services/task/digital/Digital.ts +95 -0
  157. package/src/services/task/state-machine/TaskStateMachine.ts +793 -0
  158. package/src/services/task/state-machine/actions.ts +422 -0
  159. package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
  160. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
  161. package/src/services/task/state-machine/constants.ts +150 -0
  162. package/src/services/task/state-machine/guards.ts +303 -0
  163. package/src/services/task/state-machine/index.ts +28 -0
  164. package/src/services/task/state-machine/types.ts +228 -0
  165. package/src/services/task/state-machine/uiControlsComputer.ts +542 -0
  166. package/src/services/task/taskDataNormalizer.ts +137 -0
  167. package/src/services/task/types.ts +641 -95
  168. package/src/services/task/voice/Voice.ts +1255 -0
  169. package/src/services/task/voice/WebRTC.ts +187 -0
  170. package/src/types.ts +88 -5
  171. package/src/utils/AGENTS.md +276 -0
  172. package/src/webex.js +2 -0
  173. package/test/unit/spec/cc.ts +59 -142
  174. package/test/unit/spec/logger-proxy.ts +70 -0
  175. package/test/unit/spec/services/ApiAiAssistant.ts +17 -0
  176. package/test/unit/spec/services/config/index.ts +26 -55
  177. package/test/unit/spec/services/core/Utils.ts +103 -52
  178. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +48 -112
  179. package/test/unit/spec/services/core/websocket/connection-service.ts +5 -4
  180. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  181. package/test/unit/spec/services/task/Task.ts +416 -0
  182. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  183. package/test/unit/spec/services/task/TaskManager.ts +781 -1735
  184. package/test/unit/spec/services/task/TaskUtils.ts +125 -0
  185. package/test/unit/spec/services/task/dialer.ts +112 -198
  186. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  187. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +473 -0
  188. package/test/unit/spec/services/task/state-machine/guards.ts +288 -0
  189. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  190. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +147 -0
  191. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  192. package/test/unit/spec/services/task/voice/Voice.ts +587 -0
  193. package/test/unit/spec/services/task/voice/WebRTC.ts +242 -0
  194. package/umd/contact-center.min.js +2 -2
  195. package/umd/contact-center.min.js.map +1 -1
  196. package/dist/services/task/index.js +0 -1525
  197. package/dist/services/task/index.js.map +0 -1
  198. package/dist/types/services/task/index.d.ts +0 -650
  199. package/src/services/task/index.ts +0 -1801
  200. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_xstate","require","_constants","_actions","_guards","_TaskUtils","taskStateMachineSetup","setup","actors","types","context","events","getTaskStateMachineConfig","uiControlConfig","id","initial","TaskState","IDLE","createInitialContext","on","TaskEvent","RECORDING_STARTED","actions","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","HYDRATE","states","guard","guards","isInteractionTerminated","target","WRAPPING_UP","isInteractionConsulting","CONSULTING","isInteractionHeld","HELD","isInteractionConnected","CONNECTED","isConferencingByParticipants","CONFERENCING","TASK_INCOMING","OFFERED","CONSULTING_ACTIVE","TASK_OFFERED","ASSIGN","isConsultingAssignment","RONA","TERMINATED","TASK_WRAPUP","CONTACT_ENDED","ASSIGN_FAILED","INVITE_FAILED","OUTBOUND_FAILED","shouldWrapUp","OFFER_CONSULT","CONSULT_FAILED","CONSULT_END","HOLD_INITIATED","HOLD_INITIATING","HOLD_SUCCESS","CONSULT","CONSULT_INITIATING","TRANSFER_SUCCESS","shouldWrapUpOrIsInitiator","TRANSFER_FAILED","conferenceInProgressFromEvent","PAUSE_RECORDING","RESUME_RECORDING","HOLD_FAILED","UNHOLD_INITIATED","RESUME_INITIATING","UNHOLD_SUCCESS","UNHOLD_FAILED","CONSULT_SUCCESS","consultFromConference","isPrimaryMediaOnHold","CTQ_CANCEL","event","consultInitiator","consultCallHeld","SWITCH_TO_MAIN_CALL","SWITCH_TO_CONSULT","TRANSFER_CONFERENCE","TRANSFER_CONFERENCE_SUCCESS","transferConferenceRequested","TRANSFER_CONFERENCE_FAILED","MERGE_TO_CONFERENCE","CONF_INITIATING","CONFERENCE_START","CONFERENCE_FAILED","EXIT_CONFERENCE_SUCCESS","PARTICIPANT_LEAVE","params","didCurrentAgentLeaveConference","shouldDowngradeConferenceToConnected","CONFERENCE_END","exitingConference","taskData","interaction","mainCallId","mainInteractionId","interactionId","getIsCustomerInCall","entry","WRAPUP_COMPLETE","COMPLETED","type","createTaskStateMachine","options","createMachine","provide"],"sources":["TaskStateMachine.ts"],"sourcesContent":["/**\n * Task State Machine Configuration\n *\n * This file defines the XState state machine configuration for contact center tasks.\n * It orchestrates state transitions, guards, and actions for task lifecycle management.\n *\n * GUARD FUNCTIONS: All guard logic is centralized in guards.ts for reusability and testing.\n * This file imports and uses those guards via the `guards` object.\n */\n\nimport {setup} from 'xstate';\nimport {TaskContext, TaskEventPayload, UIControlConfig, TaskActionsMap} from './types';\nimport {TaskState, TaskEvent} from './constants';\nimport {actions, createInitialContext} from './actions';\nimport {guards} from './guards';\nimport {getIsCustomerInCall} from '../TaskUtils';\n\ntype TaskActionConfigMap = {[K in keyof typeof actions]: undefined};\n\nconst taskStateMachineSetup = setup<\n TaskContext,\n TaskEventPayload,\n Record<string, never>,\n Record<string, never>,\n TaskActionConfigMap\n>({\n actors: {},\n types: {\n context: {} as TaskContext,\n events: {} as TaskEventPayload,\n },\n});\n\n/**\n * Get task state machine configuration with UI control config\n * Defines all states, transitions, guards, and actions for task management\n *\n * @param uiControlConfig - UI control configuration\n * @returns State machine configuration object\n */\nexport function getTaskStateMachineConfig(uiControlConfig: UIControlConfig) {\n /**\n * Event mapping reference (CC WebSocket -> TaskEvent)\n *\n * AgentContactReserved -> TaskEvent.TASK_INCOMING\n * AgentOfferContact -> TaskEvent.TASK_OFFERED\n * AgentOfferConsult -> TaskEvent.OFFER_CONSULT\n * AgentConsulting -> TaskEvent.CONSULTING_ACTIVE\n * AgentConsultCreated -> TaskEvent.CONSULT_CREATED\n * AgentConsultTransferred -> TaskEvent.TRANSFER_SUCCESS\n * AgentContactAssigned -> TaskEvent.ASSIGN\n * AgentContactHeld -> TaskEvent.HOLD_SUCCESS\n * AgentContactUnheld -> TaskEvent.UNHOLD_SUCCESS\n * AgentConsultEnded -> TaskEvent.CONSULT_END\n * AgentContactEnded -> TaskEvent.CONTACT_ENDED\n * AgentWrapup -> TaskEvent.TASK_WRAPUP (wrapUpRequired)\n * AgentWrappedup -> TaskEvent.WRAPUP_COMPLETE\n *\n * (See TaskManager.mapEventToTaskStateMachineEvent for the full mapping table.)\n */\n return {\n id: 'taskStateMachine',\n initial: TaskState.IDLE,\n context: createInitialContext(uiControlConfig, TaskState.IDLE),\n on: {\n [TaskEvent.RECORDING_STARTED]: {\n actions: ['updateTaskData', 'emitTaskRecordingStarted'],\n },\n [TaskEvent.CONTACT_UPDATED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n [TaskEvent.CONTACT_OWNER_CHANGED]: {\n actions: ['updateTaskData', 'syncTaskDataFromEvent'],\n },\n // HYDRATE: Update task data from AgentContact event\n // Note: State restoration with transitions is handled in IDLE state.\n // This root-level handler is for when task is already in another state (just updates data).\n [TaskEvent.HYDRATE]: {\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n },\n states: {\n [TaskState.IDLE]: {\n on: {\n // HYDRATE: Restore state machine to correct state based on hydrated task data\n // This handles page refresh/reconnection scenarios where task needs to be restored\n // IMPORTANT: This MUST be in IDLE state (not root) because root-level events cannot\n // transition to child states in XState\n [TaskEvent.HYDRATE]: [\n {\n guard: guards.isInteractionTerminated,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConsulting,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionHeld,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isInteractionConnected,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n guard: guards.isConferencingByParticipants,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n {\n // Default: just update data, stay in IDLE\n actions: ['updateTaskData', 'emitTaskHydrate'],\n },\n ],\n // AgentContactReserved (applicable for direct incoming/consult/transfer/outdial)\n [TaskEvent.TASK_INCOMING]: {\n target: TaskState.OFFERED,\n actions: ['initializeTask', 'emitTaskIncoming'],\n },\n\n // EP-DN split-leg ordering can deliver AgentConsulting before HYDRATE/TASK_INCOMING.\n // Do not drop it in IDLE; bootstrap to CONSULTING using event taskData.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultFromConference',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n },\n },\n\n [TaskState.OFFERED]: {\n on: {\n // AgentContactOffer\n [TaskEvent.TASK_OFFERED]: {\n actions: ['updateTaskData', 'emitTaskOfferContact', 'requestAutoAnswer'],\n },\n // AgentContactAssigned\n [TaskEvent.ASSIGN]: [\n {\n guard: guards.isConsultingAssignment,\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'emitTaskConsultAccepted', 'emitTaskConsulting'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n ],\n // AgentOfferContactRONA\n [TaskEvent.RONA]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n // This needs to be handled for all assign failed scenarios (contact, buddy)\n // [AgentContactAssignFailed, AgentCtqFailed, AgentBlindTransferFailed,\n // AgentVTeamTransferFailed, AgentConsultTransferFailed]\n [TaskEvent.ASSIGN_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.INVITE_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskReject'],\n },\n [TaskEvent.OUTBOUND_FAILED]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskOutdialFailed', 'emitTaskReject'],\n },\n ],\n // AgentConsulting comes for received after the initial consult is accepted\n [TaskEvent.CONSULTING_ACTIVE]: [\n {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n ],\n // agentOfferConsult happens only on the receiver side of consult\n [TaskEvent.OFFER_CONSULT]: {\n actions: ['updateTaskData', 'emitTaskOfferConsult', 'requestAutoAnswer'],\n },\n // AgentConsultFailed - when consulted agent (Agent 2) doesn't answer (RONA or decline)\n // Clears the incoming consult notification by transitioning to TERMINATED\n [TaskEvent.CONSULT_FAILED]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n // AgentConsultEnded - when consult initiator (Agent 1) ends the consult before\n // the consulted agent (Agent 2) accepts. Clears the incoming notification.\n [TaskEvent.CONSULT_END]: {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskReject'],\n },\n },\n },\n\n [TaskState.CONNECTED]: {\n on: {\n // AgentConsulting may arrive while machine is CONNECTED (EP-DN/event ordering).\n // Derive consultInitiator from payload so controls are set correctly.\n [TaskEvent.CONSULTING_ACTIVE]: {\n target: TaskState.CONSULTING,\n actions: [\n 'updateTaskData',\n 'setConsultInitiator',\n 'setConsultDestination',\n 'setConsultAgentJoined',\n 'emitTaskConsultAccepted',\n 'emitTaskConsulting',\n ],\n },\n // AgentContactAssigned can be resent after consult transfers; keep context in sync\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // Click of hold button\n [TaskEvent.HOLD_INITIATED]: {\n target: TaskState.HOLD_INITIATING,\n },\n // Remote hold from another login session (multi-login)\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Receiver goes to connected as he receives transferSuccess event\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n // AgentContactEnded Event\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → CONFERENCING\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n // Agent should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n [TaskEvent.PAUSE_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingPaused'],\n },\n [TaskEvent.RESUME_RECORDING]: {\n actions: ['updateTaskData', 'setRecordingState', 'emitTaskRecordingResumed'],\n },\n },\n },\n\n [TaskState.HOLD_INITIATING]: {\n on: {\n // AgentContactHeld Event\n [TaskEvent.HOLD_SUCCESS]: {\n target: TaskState.HELD,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n // AgentContactHoldFailed Event\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.HELD]: {\n on: {\n // Click of the unhold button\n [TaskEvent.UNHOLD_INITIATED]: {\n target: TaskState.RESUME_INITIATING,\n },\n // Remote resume from another login session (multi-login)\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n // Click of the consult button\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination'],\n },\n // TODO: This may not be a valid transition, need to be removed\n // AgentConsultTransferred / AgentVTeamTransferred / AgentBlindTransferred\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.CONTACT_ENDED]: [\n {\n guard: guards.conferenceInProgressFromEvent,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'emitTaskConferenceStarted', 'requestCleanup'],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup', 'requestCleanup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'emitTaskEnd'],\n },\n ],\n // TODO: This may not be a valid transition, this needs to be checked as well\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'emitTaskWrapup'],\n },\n },\n },\n\n [TaskState.RESUME_INITIATING]: {\n on: {\n [TaskEvent.UNHOLD_SUCCESS]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n [TaskEvent.UNHOLD_FAILED]: {\n target: TaskState.HELD,\n },\n },\n },\n\n [TaskState.CONSULT_INITIATING]: {\n on: {\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.HOLD_FAILED]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n // AgentConsulting\n // NOTE: Don't set consultDestinationAgentJoined here - wait for CONSULTING_ACTIVE\n [TaskEvent.CONSULT_SUCCESS]: {\n target: TaskState.CONSULTING,\n actions: ['updateTaskData', 'setConsultInitiator'],\n },\n // AgentConsultFailed, API Failures, AgentCtqFailed\n [TaskEvent.CONSULT_FAILED]: [\n {\n // Consult from conference → back to CONFERENCING\n guard: ({context}) => context.consultFromConference === true,\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'handleConsultFailed'],\n },\n ],\n // AgentCtqCancelled Event\n [TaskEvent.CTQ_CANCEL]: [\n {\n guard: guards.isPrimaryMediaOnHold,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n },\n },\n\n [TaskState.CONSULTING]: {\n on: {\n // AgentConsulting updates consulted agent arrival\n [TaskEvent.CONSULTING_ACTIVE]: {\n actions: [\n 'updateTaskData',\n 'setConsultAgentJoined',\n 'setConsultDestination',\n 'emitTaskConsulting',\n ],\n },\n\n // AgentConsultEnded\n [TaskEvent.CONSULT_END]: [\n {\n // Initiator returning to conference (flag set OR backend still shows conference)\n guard: ({context, event}) =>\n context.consultInitiator === true &&\n (context.consultFromConference === true ||\n guards.conferenceInProgressFromEvent({context, event})),\n target: TaskState.CONFERENCING,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Initiator already switched back to the main/customer leg\n guard: ({context}) =>\n context.consultInitiator === true && context.consultCallHeld === true,\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Initiator (no conference) → HELD\n guard: ({context}) => context.consultInitiator === true,\n target: TaskState.HELD,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConsultEnd'],\n },\n {\n // Consulted agent → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData'],\n },\n ],\n\n // Switch between consult and main call (UI-driven toggle)\n [TaskEvent.SWITCH_TO_MAIN_CALL]: {\n actions: ['handleSwitchToMainCall', 'emitTaskSwitchCall'],\n },\n [TaskEvent.SWITCH_TO_CONSULT]: {\n actions: ['handleSwitchToConsult', 'emitTaskSwitchCall'],\n },\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n [TaskEvent.UNHOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n\n [TaskEvent.TRANSFER_SUCCESS]: [\n {\n guard: guards.shouldWrapUpOrIsInitiator,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState'],\n },\n ],\n [TaskEvent.TRANSFER_FAILED]: {\n actions: ['updateTaskData'],\n },\n [TaskEvent.TRANSFER_CONFERENCE]: {\n // Track that this agent initiated the conference transfer so we can\n // apply the correct lifecycle transition when success arrives.\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskWrapup',\n ],\n },\n {\n // Non-initiator (consulted agent) stays in CONFERENCING\n guard: ({context}) => !context.consultInitiator,\n target: TaskState.CONFERENCING,\n actions: [\n 'updateTaskData',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n {\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n 'emitTaskEnd',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // AgentContactAssigned - receiver side becomes connected to customer\n [TaskEvent.ASSIGN]: {\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'emitTaskAssigned'],\n },\n // AgentContactEnded\n [TaskEvent.CONTACT_ENDED]: {\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskWrapup',\n 'requestCleanup',\n ],\n },\n [TaskEvent.TASK_WRAPUP]: {\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n [TaskEvent.MERGE_TO_CONFERENCE]: {\n target: TaskState.CONF_INITIATING,\n },\n // AgentConsultConferenced, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: ['handleConferenceStarted', 'clearConsultState'],\n },\n },\n },\n\n [TaskState.CONF_INITIATING]: {\n on: {\n // AgentConsultConferenced, ParticipantJoinedConference\n [TaskEvent.CONFERENCE_START]: {\n target: TaskState.CONFERENCING,\n actions: ['handleConferenceStarted'],\n },\n // AgentConsultConferenceFailed\n [TaskEvent.CONFERENCE_FAILED]: {\n target: TaskState.CONSULTING,\n actions: ['handleConferenceFailed', 'emitTaskConferenceFailed'],\n },\n },\n },\n\n [TaskState.CONFERENCING]: {\n on: {\n [TaskEvent.CONFERENCE_START]: {\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConferenceStarted'],\n },\n [TaskEvent.EXIT_CONFERENCE_SUCCESS]: [\n {\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // Needed as all agents in conference get this event, hence we need to clear the consult state\n [TaskEvent.CONSULT_END]: {\n actions: ['updateTaskData', 'clearConsultState'],\n },\n\n [TaskEvent.HOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskHold'],\n },\n [TaskEvent.UNHOLD_SUCCESS]: {\n actions: ['updateTaskData', 'setHoldState', 'emitTaskResume'],\n },\n\n // Start a new consult from within an active conference\n [TaskEvent.CONSULT]: {\n target: TaskState.CONSULT_INITIATING,\n actions: ['setConsultInitiator', 'setConsultDestination', 'setConsultFromConference'],\n },\n\n // Participant leaves - handle conference downgrade scenarios\n [TaskEvent.PARTICIPANT_LEAVE]: [\n {\n // Only the leaving agent should wrap up → WRAPPING_UP\n guard: (params) =>\n guards.didCurrentAgentLeaveConference(params) && guards.shouldWrapUp(params),\n target: TaskState.WRAPPING_UP,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskWrapup',\n ],\n },\n {\n // Only the leaving agent (no wrapup) → TERMINATED\n guard: guards.didCurrentAgentLeaveConference,\n target: TaskState.TERMINATED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'markEnded',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskEnd',\n ],\n },\n {\n // Conference downgraded, customer present → CONNECTED\n guard: (params) =>\n !guards.didCurrentAgentLeaveConference(params) &&\n guards.shouldDowngradeConferenceToConnected(params),\n target: TaskState.CONNECTED,\n actions: [\n 'updateTaskData',\n 'handleParticipantLeft',\n 'clearConsultState',\n 'emitTaskParticipantLeft',\n 'emitTaskConferenceEnded',\n ],\n },\n {actions: ['updateTaskData', 'handleParticipantLeft', 'emitTaskParticipantLeft']},\n ],\n\n [TaskEvent.TRANSFER_CONFERENCE]: {\n actions: ['setTransferConferenceRequested', 'emitTaskTransferConference'],\n },\n [TaskEvent.TRANSFER_CONFERENCE_SUCCESS]: [\n {\n // Not initiated by this agent → just refresh backend state.\n guard: ({context}) => context.transferConferenceRequested !== true,\n actions: [\n 'updateTaskData',\n 'handleTransferConferenceSuccess',\n 'clearTransferConferenceRequested',\n ],\n },\n ],\n [TaskEvent.TRANSFER_CONFERENCE_FAILED]: {\n actions: ['clearTransferConferenceRequested', 'emitTaskTransferConferenceFailed'],\n },\n\n // Conference ends explicitly\n [TaskEvent.CONFERENCE_END]: [\n {\n // Agent who should wrap up → WRAPPING_UP\n guard: guards.shouldWrapUp,\n target: TaskState.WRAPPING_UP,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskWrapup'],\n },\n {\n // Customer still in call → CONNECTED\n guard: ({context, event}) => {\n if (context.exitingConference === true) return false;\n const taskData = (event as any)?.taskData ?? context.taskData;\n if (!taskData?.interaction) return false;\n const mainCallId = taskData.interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n return getIsCustomerInCall(taskData.interaction, mainCallId);\n },\n target: TaskState.CONNECTED,\n actions: ['updateTaskData', 'clearConsultState', 'emitTaskConferenceEnded'],\n },\n {\n // Otherwise → TERMINATED\n target: TaskState.TERMINATED,\n actions: ['updateTaskData', 'markEnded', 'clearConsultState', 'emitTaskEnd'],\n },\n ],\n\n // CONTACT_ENDED in conference\n [TaskEvent.CONTACT_ENDED]: [\n {\n // Conference still active → stay\n actions: ['updateTaskData', 'requestCleanup'],\n },\n ],\n },\n },\n\n [TaskState.WRAPPING_UP]: {\n // Only emit wrapup event on entry - task:end should only be emitted when COMPLETED\n entry: ['emitTaskWrapup'],\n on: {\n // AgentWrappedup Event\n [TaskEvent.WRAPUP_COMPLETE]: {\n target: TaskState.COMPLETED,\n actions: ['updateTaskData'],\n },\n },\n },\n\n [TaskState.COMPLETED]: {\n type: 'final' as const,\n entry: ['emitTaskWrappedup', 'cleanupResources'],\n },\n\n [TaskState.TERMINATED]: {\n type: 'final' as const,\n entry: ['cleanupResources'],\n },\n },\n };\n}\n\n/**\n * Create a task state machine instance using only the built-in actions.\n * The resulting machine is ready for most consumers that rely on the default\n * context mutators declared in actions.ts.\n *\n * @param uiControlConfig - UI control configuration\n * @returns StateMachine instance for task management\n */\nexport function createTaskStateMachine(\n uiControlConfig: UIControlConfig,\n options?: {actions?: Partial<TaskActionsMap>}\n) {\n return taskStateMachineSetup.createMachine(getTaskStateMachineConfig(uiControlConfig)).provide({\n actions: {\n ...actions,\n ...(options?.actions ?? {}),\n },\n });\n}\n\nexport type TaskStateMachine = ReturnType<typeof createTaskStateMachine>;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.actions = void 0;
7
+ exports.createInitialContext = createInitialContext;
8
+ exports.updateUIControls = updateUIControls;
9
+ var _xstate = require("xstate");
10
+ var _constants = require("./constants");
11
+ var _uiControlsComputer = require("./uiControlsComputer");
12
+ /**
13
+ * Task State Machine Actions - Action implementations executed during state transitions
14
+ */
15
+
16
+ const determineConsultInitiator = (taskData, selfAgentId) => {
17
+ if (!selfAgentId) return undefined;
18
+ if (taskData?.consultingAgentId) {
19
+ return taskData.consultingAgentId === selfAgentId;
20
+ }
21
+ if (taskData?.isConsulted === true) return false;
22
+ return undefined;
23
+ };
24
+ const deriveRecordingState = taskData => {
25
+ const callProcessingDetails = taskData?.interaction?.callProcessingDetails;
26
+ if (!callProcessingDetails) {
27
+ return {};
28
+ }
29
+ const update = {};
30
+ const {
31
+ recordingStarted,
32
+ recordInProgress,
33
+ isPaused
34
+ } = callProcessingDetails;
35
+ if (recordingStarted !== undefined) {
36
+ update.recordingControlsAvailable = recordingStarted;
37
+ if (!recordingStarted) {
38
+ update.recordingInProgress = false;
39
+ }
40
+ }
41
+ if (recordInProgress !== undefined) {
42
+ update.recordingControlsAvailable = recordInProgress || recordingStarted || false;
43
+ update.recordingInProgress = recordInProgress;
44
+ }
45
+ if (update.recordingControlsAvailable === undefined && update.recordingInProgress === undefined && recordingStarted) {
46
+ update.recordingControlsAvailable = true;
47
+ update.recordingInProgress = true;
48
+ }
49
+ if (isPaused !== undefined) {
50
+ update.recordingControlsAvailable = true;
51
+ update.recordingInProgress = !isPaused;
52
+ }
53
+ return update;
54
+ };
55
+ const deriveTaskDataUpdates = (context, taskData) => taskData ? (() => {
56
+ const updates = {
57
+ taskData,
58
+ ...deriveRecordingState(taskData)
59
+ };
60
+ if (taskData.destAgentId) {
61
+ updates.consultDestinationAgentId = taskData.destAgentId;
62
+ }
63
+ if (taskData.interaction?.state === 'consulting' && taskData.destinationType) {
64
+ updates.consultDestinationType = taskData.destinationType;
65
+ }
66
+ if (!context.consultInitiator) {
67
+ const selfAgentId = context.uiControlConfig.agentId ?? taskData?.agentId;
68
+ const consultInitiator = determineConsultInitiator(taskData, selfAgentId);
69
+ if (consultInitiator !== undefined) {
70
+ updates.consultInitiator = consultInitiator;
71
+ } else if (taskData.interaction?.state === 'consulting' && taskData.isConsulted === false) {
72
+ updates.consultInitiator = true;
73
+ }
74
+ }
75
+ if (taskData.interaction?.state === 'consulting') {
76
+ if (!context.consultDestinationAgentJoined) {
77
+ const hasJoinedConsultee = Boolean(taskData.interaction.participants && Object.values(taskData.interaction.participants).some(p => p?.isConsulted === true && !p?.hasLeft));
78
+ const cpd = taskData.interaction?.callProcessingDetails;
79
+ const backendSaysJoined = cpd?.consultDestinationAgentJoined === 'true';
80
+ if (hasJoinedConsultee || backendSaysJoined) updates.consultDestinationAgentJoined = true;
81
+ }
82
+ if (!context.consultDestinationType && !updates.consultDestinationType) {
83
+ const hasEpDnParticipant = Boolean(taskData.interaction.participants && Object.values(taskData.interaction.participants).some(p => p?.pType === 'EP-DN' && !p?.hasLeft));
84
+ if (hasEpDnParticipant) updates.consultDestinationType = 'entryPoint';
85
+ }
86
+ const effectiveConsultInitiator = updates.consultInitiator ?? context.consultInitiator;
87
+ if (effectiveConsultInitiator) {
88
+ const consultMediaId = taskData.consultMediaResourceId;
89
+ const consultMedia = consultMediaId ? taskData.interaction.media?.[consultMediaId] : Object.values(taskData.interaction.media ?? {}).find(m => m?.mType === 'consult');
90
+ if (consultMedia) {
91
+ updates.consultCallHeld = Boolean(consultMedia.isHold);
92
+ }
93
+ }
94
+ }
95
+ return updates;
96
+ })() : {};
97
+ const getTaskDataFromEvent = event => event && typeof event === 'object' ? event.taskData : undefined;
98
+ function createInitialContext(uiControlConfig, initialState = _constants.TaskState.IDLE) {
99
+ const baseContext = {
100
+ taskData: null,
101
+ consultInitiator: false,
102
+ exitingConference: false,
103
+ consultFromConference: false,
104
+ transferConferenceRequested: false,
105
+ consultDestinationType: null,
106
+ consultDestinationAgentId: null,
107
+ consultDestinationAgentJoined: false,
108
+ consultCallHeld: false,
109
+ recordingControlsAvailable: false,
110
+ recordingInProgress: false,
111
+ uiControlConfig,
112
+ uiControls: (0, _uiControlsComputer.getDefaultUIControls)()
113
+ };
114
+ baseContext.uiControls = (0, _uiControlsComputer.computeUIControls)(initialState, baseContext);
115
+ return baseContext;
116
+ }
117
+ function updateUIControls(currentState) {
118
+ return (0, _xstate.assign)(({
119
+ context
120
+ }) => ({
121
+ uiControls: (0, _uiControlsComputer.computeUIControls)(currentState, context)
122
+ }));
123
+ }
124
+ const actions = exports.actions = {
125
+ initializeTask: (0, _xstate.assign)(({
126
+ context,
127
+ event
128
+ }) => {
129
+ return {
130
+ consultInitiator: false,
131
+ exitingConference: false,
132
+ consultDestinationType: null,
133
+ consultDestinationAgentJoined: false,
134
+ ...deriveTaskDataUpdates(context, getTaskDataFromEvent(event))
135
+ };
136
+ }),
137
+ /**
138
+ * Update task data from ASSIGN event
139
+ */
140
+ updateTaskData: (0, _xstate.assign)(({
141
+ context,
142
+ event
143
+ }) => {
144
+ return deriveTaskDataUpdates(context, getTaskDataFromEvent(event));
145
+ }),
146
+ /**
147
+ * Set consult initiator flag
148
+ *
149
+ * IMPORTANT: This action is called for CONSULT (user action) and CONSULT_CREATED (backend event).
150
+ * For CONSULT (user action): The user explicitly clicked Consult, so they ARE the initiator.
151
+ * For CONSULT_CREATED (backend event): Check taskData.isConsulted to determine if this agent
152
+ * is the initiator. If isConsulted === true, this is Agent B (the consulted party), NOT the initiator.
153
+ *
154
+ * This prevents all agents in a conference from becoming consultInitiator when one agent
155
+ * starts a new consult.
156
+ */
157
+ setConsultInitiator: (0, _xstate.assign)(({
158
+ event
159
+ }) => {
160
+ const taskData = getTaskDataFromEvent(event);
161
+ if (event.type === _constants.TaskEvent.CONSULT) return {
162
+ consultInitiator: true
163
+ };
164
+ const selfAgentId = taskData?.agentId;
165
+ const consultInitiator = determineConsultInitiator(taskData, selfAgentId);
166
+ if (consultInitiator === true) return {
167
+ consultInitiator: true
168
+ };
169
+ if (consultInitiator === false) return {
170
+ consultInitiator: false
171
+ };
172
+ return {};
173
+ }),
174
+ handleConsultFailed: (0, _xstate.assign)({
175
+ consultDestinationAgentJoined: false,
176
+ consultInitiator: false
177
+ }),
178
+ handleConferenceStarted: (0, _xstate.assign)({
179
+ consultInitiator: false
180
+ }),
181
+ setConsultDestination: (0, _xstate.assign)(({
182
+ event
183
+ }) => {
184
+ if (!event || event.type !== _constants.TaskEvent.CONSULT) {
185
+ return {};
186
+ }
187
+ const taskData = getTaskDataFromEvent(event);
188
+ const consultDestinationType = 'destinationType' in event ? event.destinationType ?? null : null;
189
+ const consultDestinationAgentId = 'destAgentId' in event ? event.destAgentId ?? null : null;
190
+ return {
191
+ consultDestinationType,
192
+ consultDestinationAgentId,
193
+ consultDestinationAgentJoined: false,
194
+ consultFromConference: false,
195
+ taskData: {
196
+ ...taskData,
197
+ destAgentId: consultDestinationAgentId
198
+ }
199
+ };
200
+ }),
201
+ setConsultFromConference: (0, _xstate.assign)({
202
+ consultFromConference: true
203
+ }),
204
+ forceConsultInitiator: (0, _xstate.assign)({
205
+ consultInitiator: true
206
+ }),
207
+ setConsultAgentJoined: (0, _xstate.assign)(({
208
+ context,
209
+ event
210
+ }) => {
211
+ if (context.consultDestinationAgentJoined) {
212
+ return {};
213
+ }
214
+ if (!event || event.type !== _constants.TaskEvent.CONSULTING_ACTIVE || !('consultDestinationAgentJoined' in event)) {
215
+ return {};
216
+ }
217
+ const eventValue = event.consultDestinationAgentJoined;
218
+ return eventValue ? {
219
+ consultDestinationAgentJoined: true
220
+ } : {};
221
+ }),
222
+ setRecordingState: (0, _xstate.assign)(({
223
+ event
224
+ }) => {
225
+ if (!event || !('type' in event)) {
226
+ return {};
227
+ }
228
+ if (event.type === _constants.TaskEvent.PAUSE_RECORDING) {
229
+ return {
230
+ recordingControlsAvailable: true,
231
+ recordingInProgress: false
232
+ };
233
+ }
234
+ if (event.type === _constants.TaskEvent.RESUME_RECORDING) {
235
+ return {
236
+ recordingControlsAvailable: true,
237
+ recordingInProgress: true
238
+ };
239
+ }
240
+ return {};
241
+ }),
242
+ clearConsultState: (0, _xstate.assign)({
243
+ consultDestinationType: null,
244
+ consultDestinationAgentId: null,
245
+ consultDestinationAgentJoined: false,
246
+ consultInitiator: false,
247
+ exitingConference: false,
248
+ consultCallHeld: false,
249
+ consultFromConference: false,
250
+ transferConferenceRequested: false
251
+ }),
252
+ setTransferConferenceRequested: (0, _xstate.assign)({
253
+ transferConferenceRequested: true
254
+ }),
255
+ clearTransferConferenceRequested: (0, _xstate.assign)({
256
+ transferConferenceRequested: false
257
+ }),
258
+ setConsultCallHeld: (0, _xstate.assign)({
259
+ consultCallHeld: true
260
+ }),
261
+ clearConsultCallHeld: (0, _xstate.assign)({
262
+ consultCallHeld: false
263
+ }),
264
+ handleSwitchToMainCall: (0, _xstate.assign)({
265
+ consultCallHeld: true
266
+ }),
267
+ handleSwitchToConsult: (0, _xstate.assign)({
268
+ consultCallHeld: false
269
+ }),
270
+ handleConferenceFailed: (0, _xstate.assign)(({
271
+ event
272
+ }) => {
273
+ const taskData = getTaskDataFromEvent(event);
274
+ return taskData ? {
275
+ taskData
276
+ } : {};
277
+ }),
278
+ handleParticipantLeft: (0, _xstate.assign)(({
279
+ event
280
+ }) => {
281
+ const taskData = getTaskDataFromEvent(event);
282
+ return taskData ? {
283
+ taskData
284
+ } : {};
285
+ }),
286
+ setExitingConference: (0, _xstate.assign)({
287
+ exitingConference: true
288
+ }),
289
+ handleTransferConferenceSuccess: (0, _xstate.assign)(({
290
+ event
291
+ }) => {
292
+ const taskData = getTaskDataFromEvent(event);
293
+ return taskData ? {
294
+ taskData
295
+ } : {};
296
+ }),
297
+ setHoldState: (0, _xstate.assign)(({
298
+ context,
299
+ event
300
+ }) => {
301
+ if (!event || event.type !== _constants.TaskEvent.HOLD_SUCCESS && event.type !== _constants.TaskEvent.UNHOLD_SUCCESS) {
302
+ return {};
303
+ }
304
+ const mediaResourceId = 'mediaResourceId' in event ? event.mediaResourceId : undefined;
305
+ if (!mediaResourceId) {
306
+ return {};
307
+ }
308
+ const interaction = context.taskData?.interaction;
309
+ const mediaEntry = interaction?.media?.[mediaResourceId];
310
+ if (!interaction || !mediaEntry) {
311
+ return {};
312
+ }
313
+ const updatedMedia = {
314
+ ...interaction.media,
315
+ [mediaResourceId]: {
316
+ ...mediaEntry,
317
+ isHold: event.type === _constants.TaskEvent.HOLD_SUCCESS
318
+ }
319
+ };
320
+ const updates = {
321
+ taskData: {
322
+ ...context.taskData,
323
+ interaction: {
324
+ ...interaction,
325
+ media: updatedMedia
326
+ }
327
+ }
328
+ };
329
+ const consultMediaId = context.taskData?.consultMediaResourceId;
330
+ const isConsultMedia = consultMediaId ? mediaResourceId === consultMediaId : mediaEntry?.mType === 'consult';
331
+ if (isConsultMedia && context.consultInitiator) {
332
+ updates.consultCallHeld = event.type === _constants.TaskEvent.HOLD_SUCCESS;
333
+ }
334
+ return updates;
335
+ }),
336
+ markEnded: (0, _xstate.assign)(() => ({
337
+ recordingControlsAvailable: false,
338
+ recordingInProgress: false
339
+ })),
340
+ requestAutoAnswer: () => undefined,
341
+ requestCleanup: () => undefined,
342
+ cleanupResources: () => undefined,
343
+ // Event emitters - placeholders overridden by consumers
344
+ emitTaskIncoming: () => undefined,
345
+ emitTaskHydrate: () => undefined,
346
+ emitTaskOfferContact: () => undefined,
347
+ emitTaskAssigned: () => undefined,
348
+ emitTaskHold: () => undefined,
349
+ emitTaskResume: () => undefined,
350
+ emitTaskEnd: () => undefined,
351
+ emitTaskOfferConsult: () => undefined,
352
+ emitTaskConsultCreated: () => undefined,
353
+ emitTaskConsulting: () => undefined,
354
+ emitTaskConsultAccepted: () => undefined,
355
+ emitTaskConsultEnd: () => undefined,
356
+ emitTaskReject: () => undefined,
357
+ emitTaskWrapup: () => undefined,
358
+ emitTaskRecordingStarted: () => undefined,
359
+ emitTaskRecordingPaused: () => undefined,
360
+ emitTaskRecordingResumed: () => undefined,
361
+ emitTaskWrappedup: () => undefined,
362
+ emitTaskParticipantLeft: () => undefined,
363
+ emitTaskConferenceStarted: () => undefined,
364
+ emitTaskConferenceEnded: () => undefined,
365
+ emitTaskExitConference: () => undefined,
366
+ emitTaskTransferConference: () => undefined,
367
+ emitTaskSwitchCall: () => undefined,
368
+ emitTaskConferenceFailed: () => undefined,
369
+ emitTaskTransferConferenceFailed: () => undefined,
370
+ emitTaskOutdialFailed: () => undefined
371
+ };
372
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_xstate","require","_constants","_uiControlsComputer","determineConsultInitiator","taskData","selfAgentId","undefined","consultingAgentId","isConsulted","deriveRecordingState","callProcessingDetails","interaction","update","recordingStarted","recordInProgress","isPaused","recordingControlsAvailable","recordingInProgress","deriveTaskDataUpdates","context","updates","destAgentId","consultDestinationAgentId","state","destinationType","consultDestinationType","consultInitiator","uiControlConfig","agentId","consultDestinationAgentJoined","hasJoinedConsultee","Boolean","participants","Object","values","some","p","hasLeft","cpd","backendSaysJoined","hasEpDnParticipant","pType","effectiveConsultInitiator","consultMediaId","consultMediaResourceId","consultMedia","media","find","m","mType","consultCallHeld","isHold","getTaskDataFromEvent","event","createInitialContext","initialState","TaskState","IDLE","baseContext","exitingConference","consultFromConference","transferConferenceRequested","uiControls","getDefaultUIControls","computeUIControls","updateUIControls","currentState","assign","actions","exports","initializeTask","updateTaskData","setConsultInitiator","type","TaskEvent","CONSULT","handleConsultFailed","handleConferenceStarted","setConsultDestination","setConsultFromConference","forceConsultInitiator","setConsultAgentJoined","CONSULTING_ACTIVE","eventValue","setRecordingState","PAUSE_RECORDING","RESUME_RECORDING","clearConsultState","setTransferConferenceRequested","clearTransferConferenceRequested","setConsultCallHeld","clearConsultCallHeld","handleSwitchToMainCall","handleSwitchToConsult","handleConferenceFailed","handleParticipantLeft","setExitingConference","handleTransferConferenceSuccess","setHoldState","HOLD_SUCCESS","UNHOLD_SUCCESS","mediaResourceId","mediaEntry","updatedMedia","isConsultMedia","markEnded","requestAutoAnswer","requestCleanup","cleanupResources","emitTaskIncoming","emitTaskHydrate","emitTaskOfferContact","emitTaskAssigned","emitTaskHold","emitTaskResume","emitTaskEnd","emitTaskOfferConsult","emitTaskConsultCreated","emitTaskConsulting","emitTaskConsultAccepted","emitTaskConsultEnd","emitTaskReject","emitTaskWrapup","emitTaskRecordingStarted","emitTaskRecordingPaused","emitTaskRecordingResumed","emitTaskWrappedup","emitTaskParticipantLeft","emitTaskConferenceStarted","emitTaskConferenceEnded","emitTaskExitConference","emitTaskTransferConference","emitTaskSwitchCall","emitTaskConferenceFailed","emitTaskTransferConferenceFailed","emitTaskOutdialFailed"],"sources":["actions.ts"],"sourcesContent":["/**\n * Task State Machine Actions - Action implementations executed during state transitions\n */\n\nimport {assign} from 'xstate';\nimport {\n TaskContext,\n TaskEventPayload,\n UIControlConfig,\n TaskActionsMap,\n TaskActionArgs,\n RecordingStateUpdate,\n} from './types';\nimport {TaskEvent, TaskState} from './constants';\nimport {DestinationType, TaskData} from '../types';\nimport {computeUIControls, getDefaultUIControls} from './uiControlsComputer';\n\nconst determineConsultInitiator = (\n taskData: TaskData | undefined,\n selfAgentId: string | undefined\n): boolean | undefined => {\n if (!selfAgentId) return undefined;\n\n if (taskData?.consultingAgentId) {\n return taskData.consultingAgentId === selfAgentId;\n }\n\n if (taskData?.isConsulted === true) return false;\n\n return undefined;\n};\n\nconst deriveRecordingState = (taskData?: TaskData | null): RecordingStateUpdate => {\n const callProcessingDetails = taskData?.interaction?.callProcessingDetails;\n\n if (!callProcessingDetails) {\n return {};\n }\n\n const update: RecordingStateUpdate = {};\n const {recordingStarted, recordInProgress, isPaused} = callProcessingDetails as {\n recordingStarted?: boolean;\n recordInProgress?: boolean;\n isPaused?: boolean;\n };\n\n if (recordingStarted !== undefined) {\n update.recordingControlsAvailable = recordingStarted;\n if (!recordingStarted) {\n update.recordingInProgress = false;\n }\n }\n\n if (recordInProgress !== undefined) {\n update.recordingControlsAvailable = recordInProgress || recordingStarted || false;\n update.recordingInProgress = recordInProgress;\n }\n\n if (\n update.recordingControlsAvailable === undefined &&\n update.recordingInProgress === undefined &&\n recordingStarted\n ) {\n update.recordingControlsAvailable = true;\n update.recordingInProgress = true;\n }\n\n if (isPaused !== undefined) {\n update.recordingControlsAvailable = true;\n update.recordingInProgress = !isPaused;\n }\n\n return update;\n};\n\nconst deriveTaskDataUpdates = (context: TaskContext, taskData: TaskData | undefined) =>\n taskData\n ? (() => {\n const updates: Partial<TaskContext> = {\n taskData,\n ...deriveRecordingState(taskData),\n };\n\n if (taskData.destAgentId) {\n updates.consultDestinationAgentId = taskData.destAgentId;\n }\n if (taskData.interaction?.state === 'consulting' && taskData.destinationType) {\n updates.consultDestinationType = taskData.destinationType as DestinationType;\n }\n\n if (!context.consultInitiator) {\n const selfAgentId = context.uiControlConfig.agentId ?? taskData?.agentId;\n const consultInitiator = determineConsultInitiator(taskData, selfAgentId);\n if (consultInitiator !== undefined) {\n updates.consultInitiator = consultInitiator;\n } else if (\n taskData.interaction?.state === 'consulting' &&\n taskData.isConsulted === false\n ) {\n updates.consultInitiator = true;\n }\n }\n\n if (taskData.interaction?.state === 'consulting') {\n if (!context.consultDestinationAgentJoined) {\n const hasJoinedConsultee = Boolean(\n taskData.interaction.participants &&\n Object.values(taskData.interaction.participants).some(\n (p: any) => p?.isConsulted === true && !p?.hasLeft\n )\n );\n const cpd = taskData.interaction?.callProcessingDetails;\n const backendSaysJoined = cpd?.consultDestinationAgentJoined === 'true';\n if (hasJoinedConsultee || backendSaysJoined)\n updates.consultDestinationAgentJoined = true;\n }\n\n if (!context.consultDestinationType && !updates.consultDestinationType) {\n const hasEpDnParticipant = Boolean(\n taskData.interaction.participants &&\n Object.values(taskData.interaction.participants).some(\n (p: any) => p?.pType === 'EP-DN' && !p?.hasLeft\n )\n );\n if (hasEpDnParticipant) updates.consultDestinationType = 'entryPoint' as any;\n }\n\n const effectiveConsultInitiator = updates.consultInitiator ?? context.consultInitiator;\n if (effectiveConsultInitiator) {\n const consultMediaId = taskData.consultMediaResourceId;\n const consultMedia: any = consultMediaId\n ? taskData.interaction.media?.[consultMediaId]\n : Object.values(taskData.interaction.media ?? {}).find(\n (m: any) => m?.mType === 'consult'\n );\n if (consultMedia) {\n updates.consultCallHeld = Boolean(consultMedia.isHold);\n }\n }\n }\n\n return updates;\n })()\n : {};\n\nconst getTaskDataFromEvent = (event?: TaskEventPayload): TaskData | undefined =>\n event && typeof event === 'object' ? (event as any).taskData : undefined;\n\nexport function createInitialContext(\n uiControlConfig: UIControlConfig,\n initialState: TaskState = TaskState.IDLE\n): TaskContext {\n const baseContext: TaskContext = {\n taskData: null,\n consultInitiator: false,\n exitingConference: false,\n consultFromConference: false,\n transferConferenceRequested: false,\n consultDestinationType: null,\n consultDestinationAgentId: null,\n consultDestinationAgentJoined: false,\n consultCallHeld: false,\n recordingControlsAvailable: false,\n recordingInProgress: false,\n uiControlConfig,\n uiControls: getDefaultUIControls(),\n };\n\n baseContext.uiControls = computeUIControls(initialState, baseContext);\n\n return baseContext;\n}\n\nexport function updateUIControls(currentState: TaskState) {\n return assign(({context}: TaskActionArgs) => ({\n uiControls: computeUIControls(currentState, context),\n }));\n}\n\nexport const actions: TaskActionsMap = {\n initializeTask: assign(({context, event}: {context: TaskContext; event: TaskEventPayload}) => {\n return {\n consultInitiator: false,\n exitingConference: false,\n consultDestinationType: null,\n consultDestinationAgentJoined: false,\n ...deriveTaskDataUpdates(context, getTaskDataFromEvent(event)),\n };\n }),\n\n /**\n * Update task data from ASSIGN event\n */\n updateTaskData: assign(({context, event}: TaskActionArgs) => {\n return deriveTaskDataUpdates(context, getTaskDataFromEvent(event));\n }),\n\n /**\n * Set consult initiator flag\n *\n * IMPORTANT: This action is called for CONSULT (user action) and CONSULT_CREATED (backend event).\n * For CONSULT (user action): The user explicitly clicked Consult, so they ARE the initiator.\n * For CONSULT_CREATED (backend event): Check taskData.isConsulted to determine if this agent\n * is the initiator. If isConsulted === true, this is Agent B (the consulted party), NOT the initiator.\n *\n * This prevents all agents in a conference from becoming consultInitiator when one agent\n * starts a new consult.\n */\n setConsultInitiator: assign(({event}: TaskActionArgs) => {\n const taskData = getTaskDataFromEvent(event);\n\n if (event.type === TaskEvent.CONSULT) return {consultInitiator: true};\n\n const selfAgentId = taskData?.agentId;\n const consultInitiator = determineConsultInitiator(taskData, selfAgentId);\n if (consultInitiator === true) return {consultInitiator: true};\n if (consultInitiator === false) return {consultInitiator: false};\n\n return {};\n }),\n\n handleConsultFailed: assign({consultDestinationAgentJoined: false, consultInitiator: false}),\n handleConferenceStarted: assign({consultInitiator: false}),\n\n setConsultDestination: assign(({event}: TaskActionArgs) => {\n if (!event || event.type !== TaskEvent.CONSULT) {\n return {};\n }\n\n const taskData = getTaskDataFromEvent(event);\n const consultDestinationType =\n 'destinationType' in event ? event.destinationType ?? null : null;\n const consultDestinationAgentId = 'destAgentId' in event ? event.destAgentId ?? null : null;\n\n return {\n consultDestinationType,\n consultDestinationAgentId,\n consultDestinationAgentJoined: false,\n consultFromConference: false,\n taskData: {\n ...taskData,\n destAgentId: consultDestinationAgentId,\n },\n };\n }),\n\n setConsultFromConference: assign({consultFromConference: true}),\n\n forceConsultInitiator: assign({consultInitiator: true}),\n\n setConsultAgentJoined: assign(\n ({context, event}: {context: TaskContext; event: TaskEventPayload}) => {\n if (context.consultDestinationAgentJoined) {\n return {};\n }\n\n if (\n !event ||\n event.type !== TaskEvent.CONSULTING_ACTIVE ||\n !('consultDestinationAgentJoined' in event)\n ) {\n return {};\n }\n\n const eventValue = (event as {consultDestinationAgentJoined: boolean})\n .consultDestinationAgentJoined;\n\n return eventValue ? {consultDestinationAgentJoined: true} : {};\n }\n ),\n\n setRecordingState: assign(({event}: TaskActionArgs) => {\n if (!event || !('type' in event)) {\n return {};\n }\n\n if (event.type === TaskEvent.PAUSE_RECORDING) {\n return {\n recordingControlsAvailable: true,\n recordingInProgress: false,\n };\n }\n if (event.type === TaskEvent.RESUME_RECORDING) {\n return {\n recordingControlsAvailable: true,\n recordingInProgress: true,\n };\n }\n\n return {};\n }),\n\n clearConsultState: assign({\n consultDestinationType: null,\n consultDestinationAgentId: null,\n consultDestinationAgentJoined: false,\n consultInitiator: false,\n exitingConference: false,\n consultCallHeld: false,\n consultFromConference: false,\n transferConferenceRequested: false,\n }),\n\n setTransferConferenceRequested: assign({transferConferenceRequested: true}),\n clearTransferConferenceRequested: assign({transferConferenceRequested: false}),\n\n setConsultCallHeld: assign({consultCallHeld: true}),\n clearConsultCallHeld: assign({consultCallHeld: false}),\n handleSwitchToMainCall: assign({consultCallHeld: true}),\n handleSwitchToConsult: assign({consultCallHeld: false}),\n\n handleConferenceFailed: assign(({event}: TaskActionArgs) => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData ? {taskData} : {};\n }),\n handleParticipantLeft: assign(({event}: TaskActionArgs) => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData ? {taskData} : {};\n }),\n\n setExitingConference: assign({exitingConference: true}),\n\n handleTransferConferenceSuccess: assign(({event}: TaskActionArgs) => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData ? {taskData} : {};\n }),\n\n setHoldState: assign(({context, event}: TaskActionArgs) => {\n if (\n !event ||\n (event.type !== TaskEvent.HOLD_SUCCESS && event.type !== TaskEvent.UNHOLD_SUCCESS)\n ) {\n return {};\n }\n\n const mediaResourceId =\n 'mediaResourceId' in event\n ? (event as {mediaResourceId?: string}).mediaResourceId\n : undefined;\n\n if (!mediaResourceId) {\n return {};\n }\n\n const interaction = context.taskData?.interaction;\n const mediaEntry = interaction?.media?.[mediaResourceId];\n\n if (!interaction || !mediaEntry) {\n return {};\n }\n\n const updatedMedia = {\n ...interaction.media,\n [mediaResourceId]: {\n ...mediaEntry,\n isHold: event.type === TaskEvent.HOLD_SUCCESS,\n },\n };\n\n const updates: Partial<TaskContext> = {\n taskData: {\n ...(context.taskData as TaskData),\n interaction: {\n ...interaction,\n media: updatedMedia,\n },\n },\n };\n\n const consultMediaId = context.taskData?.consultMediaResourceId;\n const isConsultMedia = consultMediaId\n ? mediaResourceId === consultMediaId\n : mediaEntry?.mType === 'consult';\n\n if (isConsultMedia && context.consultInitiator) {\n updates.consultCallHeld = event.type === TaskEvent.HOLD_SUCCESS;\n }\n\n return updates;\n }),\n\n markEnded: assign(() => ({\n recordingControlsAvailable: false,\n recordingInProgress: false,\n })),\n\n requestAutoAnswer: () => undefined,\n requestCleanup: () => undefined,\n cleanupResources: () => undefined,\n\n // Event emitters - placeholders overridden by consumers\n emitTaskIncoming: () => undefined,\n emitTaskHydrate: () => undefined,\n emitTaskOfferContact: () => undefined,\n emitTaskAssigned: () => undefined,\n emitTaskHold: () => undefined,\n emitTaskResume: () => undefined,\n emitTaskEnd: () => undefined,\n emitTaskOfferConsult: () => undefined,\n emitTaskConsultCreated: () => undefined,\n emitTaskConsulting: () => undefined,\n emitTaskConsultAccepted: () => undefined,\n emitTaskConsultEnd: () => undefined,\n emitTaskReject: () => undefined,\n emitTaskWrapup: () => undefined,\n emitTaskRecordingStarted: () => undefined,\n emitTaskRecordingPaused: () => undefined,\n emitTaskRecordingResumed: () => undefined,\n emitTaskWrappedup: () => undefined,\n emitTaskParticipantLeft: () => undefined,\n emitTaskConferenceStarted: () => undefined,\n emitTaskConferenceEnded: () => undefined,\n emitTaskExitConference: () => undefined,\n emitTaskTransferConference: () => undefined,\n emitTaskSwitchCall: () => undefined,\n emitTaskConferenceFailed: () => undefined,\n emitTaskTransferConferenceFailed: () => undefined,\n emitTaskOutdialFailed: () => undefined,\n};\n"],"mappings":"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","ignoreList":[]}