@webex/contact-center 3.12.0-task-refactor.5 → 3.12.0-task-refactor.6

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 (30) hide show
  1. package/dist/services/task/TaskUtils.js +8 -6
  2. package/dist/services/task/TaskUtils.js.map +1 -1
  3. package/dist/services/task/state-machine/TaskStateMachine.js +71 -13
  4. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  5. package/dist/services/task/state-machine/actions.js +85 -13
  6. package/dist/services/task/state-machine/actions.js.map +1 -1
  7. package/dist/services/task/state-machine/guards.js +35 -0
  8. package/dist/services/task/state-machine/guards.js.map +1 -1
  9. package/dist/services/task/state-machine/uiControlsComputer.js +69 -7
  10. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  11. package/dist/services/task/voice/Voice.js +1 -1
  12. package/dist/services/task/voice/Voice.js.map +1 -1
  13. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +60 -8
  14. package/dist/types/services/task/state-machine/guards.d.ts +5 -0
  15. package/dist/webex.js +1 -1
  16. package/package.json +1 -1
  17. package/src/services/task/TaskUtils.ts +8 -6
  18. package/src/services/task/state-machine/TaskStateMachine.ts +94 -15
  19. package/src/services/task/state-machine/actions.ts +148 -24
  20. package/src/services/task/state-machine/guards.ts +46 -0
  21. package/src/services/task/state-machine/uiControlsComputer.ts +150 -9
  22. package/src/services/task/voice/Voice.ts +4 -1
  23. package/test/unit/spec/services/WebCallingService.ts +7 -1
  24. package/test/unit/spec/services/task/TaskUtils.ts +16 -0
  25. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +512 -0
  26. package/test/unit/spec/services/task/state-machine/guards.ts +88 -0
  27. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +929 -0
  28. package/test/unit/spec/services/task/voice/Voice.ts +20 -0
  29. package/umd/contact-center.min.js +2 -2
  30. package/umd/contact-center.min.js.map +1 -1
@@ -9,6 +9,7 @@ exports.updateUIControls = updateUIControls;
9
9
  var _xstate = require("xstate");
10
10
  var _constants = require("./constants");
11
11
  var _uiControlsComputer = require("./uiControlsComputer");
12
+ var _TaskUtils = require("../TaskUtils");
12
13
  var _guards = require("./guards");
13
14
  /**
14
15
  * Task State Machine Actions - Action implementations executed during state transitions
@@ -53,13 +54,80 @@ const deriveRecordingState = taskData => {
53
54
  }
54
55
  return update;
55
56
  };
57
+ const isActiveConsultState = (taskData, selfAgentId) => {
58
+ if (taskData?.interaction?.state === _constants.INTERACTION_STATE.CONSULTING) return true;
59
+ if (selfAgentId) {
60
+ const selfParticipant = taskData?.interaction?.participants?.[selfAgentId];
61
+ const hasConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(media => media?.mType === _constants.MEDIA_TYPE_CONSULT);
62
+ const isPendingOrActiveSelfConsult = selfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING || selfParticipant?.consultState === 'consultInitiated';
63
+ if (isPendingOrActiveSelfConsult && hasConsultMedia && taskData?.isConsulted === false) {
64
+ return true;
65
+ }
66
+ }
67
+ if (taskData?.interaction?.state === _constants.INTERACTION_STATE.POST_CALL && selfAgentId) {
68
+ const selfParticipant = taskData.interaction?.participants?.[selfAgentId];
69
+ const hasConsultMedia = Object.values(taskData.interaction?.media ?? {}).some(media => media?.mType === _constants.MEDIA_TYPE_CONSULT);
70
+ if (selfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING && hasConsultMedia) return true;
71
+ }
72
+ return false;
73
+ };
74
+ const isSelfConsultingOrPending = (taskData, selfAgentId) => {
75
+ if (!taskData || !selfAgentId) return false;
76
+ const selfParticipant = taskData?.interaction?.participants?.[selfAgentId];
77
+ return selfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING || selfParticipant?.consultState === 'consultInitiated';
78
+ };
79
+ const hasJoinedConsultDestination = taskData => {
80
+ if (!taskData?.interaction) return false;
81
+ const participants = taskData.interaction.participants;
82
+ const cpd = taskData.interaction.callProcessingDetails;
83
+ const backendSaysJoined = cpd?.consultDestinationAgentJoined === 'true';
84
+ if (backendSaysJoined) return true;
85
+ if (!participants) return false;
86
+ return Object.values(participants).some(p => {
87
+ if (!p || p.isConsulted !== true || p.hasLeft) return false;
88
+ return p.hasJoined === true || p.consultState === _constants.CONSULT_STATE.CONSULTING;
89
+ });
90
+ };
91
+ const deriveConsultCallHeldFromTaskData = taskData => {
92
+ if (!taskData?.interaction) return undefined;
93
+ const eventType = taskData.type;
94
+ if (eventType === 'AgentContactHeld') return true;
95
+ if (eventType === 'AgentContactUnheld') return false;
96
+ const consultMediaId = taskData.consultMediaResourceId;
97
+ const consultMedia = consultMediaId ? taskData.interaction.media?.[consultMediaId] : Object.values(taskData.interaction.media ?? {}).find(m => m?.mType === _constants.MEDIA_TYPE_CONSULT);
98
+ if (!consultMedia) return undefined;
99
+ return Boolean(consultMedia.isHold);
100
+ };
101
+ const getTaskStateForUiControls = (taskData, selfAgentId) => {
102
+ if (!taskData?.interaction) {
103
+ return _constants.TaskState.IDLE;
104
+ }
105
+ if (taskData.interaction.isTerminated === true) {
106
+ return _constants.TaskState.WRAPPING_UP;
107
+ }
108
+ if (isActiveConsultState(taskData, selfAgentId)) {
109
+ return _constants.TaskState.CONSULTING;
110
+ }
111
+ if (taskData.interaction.state === _constants.INTERACTION_STATE.CONFERENCE || (0, _TaskUtils.getIsConferenceInProgress)(taskData)) {
112
+ return _constants.TaskState.CONFERENCING;
113
+ }
114
+ const mainMediaId = taskData.interaction.mainInteractionId || taskData.interactionId;
115
+ const isMainHeld = Boolean(mainMediaId && taskData.interaction.media?.[mainMediaId]?.isHold === true);
116
+ if (taskData.interaction.state === 'hold' || isMainHeld) {
117
+ return _constants.TaskState.HELD;
118
+ }
119
+ return _constants.TaskState.CONNECTED;
120
+ };
56
121
  const deriveTaskDataUpdates = (context, taskData) => taskData ? (() => {
57
122
  const updates = {
58
123
  taskData,
59
124
  ...deriveRecordingState(taskData)
60
125
  };
61
126
  const selfAgentId = context.uiControlConfig.agentId ?? taskData?.agentId;
62
- const consultingActive = taskData?.interaction?.state === _constants.INTERACTION_STATE.CONSULTING || (0, _guards.hasActiveConsultInPostCall)(taskData, selfAgentId);
127
+ const consultingActive = isActiveConsultState(taskData, selfAgentId) || (0, _guards.hasActiveConsultInPostCall)(taskData, selfAgentId);
128
+ const conferenceFromPayload = taskData?.interaction?.state === _constants.INTERACTION_STATE.CONFERENCE || (0, _TaskUtils.getIsConferenceInProgress)(taskData);
129
+ const selfConsultingOrPending = isSelfConsultingOrPending(taskData, selfAgentId);
130
+ const inferredConsultingInitiator = selfConsultingOrPending && taskData?.isConsulted === false;
63
131
  if (taskData.destAgentId) {
64
132
  const isEpDnWithStoredId = context.consultDestinationType === 'entryPoint' && context.consultDestinationAgentId;
65
133
  if (!isEpDnWithStoredId) {
@@ -73,30 +141,34 @@ const deriveTaskDataUpdates = (context, taskData) => taskData ? (() => {
73
141
  const consultInitiator = determineConsultInitiator(taskData, selfAgentId);
74
142
  if (consultInitiator !== undefined) {
75
143
  updates.consultInitiator = consultInitiator;
76
- } else if (consultingActive && taskData.isConsulted === false) {
144
+ } else if (inferredConsultingInitiator || consultingActive && taskData.isConsulted === false) {
77
145
  updates.consultInitiator = true;
78
146
  }
79
147
  }
148
+ const effectiveConsultInitiator = updates.consultInitiator ?? context.consultInitiator;
149
+ if (effectiveConsultInitiator && conferenceFromPayload && (consultingActive || selfConsultingOrPending || Boolean(taskData?.consultMediaResourceId))) {
150
+ updates.consultFromConference = true;
151
+ }
80
152
  if (consultingActive && taskData.interaction) {
81
- if (!context.consultDestinationAgentJoined) {
82
- const hasJoinedConsultee = Boolean(taskData.interaction.participants && Object.values(taskData.interaction.participants).some(p => p?.isConsulted === true && !p?.hasLeft));
83
- const cpd = taskData.interaction?.callProcessingDetails;
84
- const backendSaysJoined = cpd?.consultDestinationAgentJoined === 'true';
85
- if (hasJoinedConsultee || backendSaysJoined) updates.consultDestinationAgentJoined = true;
86
- }
153
+ const joinedConsultee = hasJoinedConsultDestination(taskData);
154
+ if (joinedConsultee) updates.consultDestinationAgentJoined = true;
87
155
  if (!context.consultDestinationType && !updates.consultDestinationType) {
88
156
  const hasEpDnParticipant = Boolean(taskData.interaction.participants && Object.values(taskData.interaction.participants).some(p => p?.pType === 'EP-DN' && !p?.hasLeft));
89
157
  if (hasEpDnParticipant) updates.consultDestinationType = 'entryPoint';
90
158
  }
91
- const effectiveConsultInitiator = updates.consultInitiator ?? context.consultInitiator;
92
159
  if (effectiveConsultInitiator) {
93
- const consultMediaId = taskData.consultMediaResourceId;
94
- const consultMedia = consultMediaId ? taskData.interaction.media?.[consultMediaId] : Object.values(taskData.interaction.media ?? {}).find(m => m?.mType === 'consult');
95
- if (consultMedia) {
96
- updates.consultCallHeld = Boolean(consultMedia.isHold);
160
+ const consultCallHeld = deriveConsultCallHeldFromTaskData(taskData);
161
+ if (consultCallHeld !== undefined) {
162
+ updates.consultCallHeld = consultCallHeld;
97
163
  }
98
164
  }
99
165
  }
166
+ const nextContext = {
167
+ ...context,
168
+ ...updates
169
+ };
170
+ const inferredState = getTaskStateForUiControls(taskData, selfAgentId);
171
+ updates.uiControls = (0, _uiControlsComputer.computeUIControls)(inferredState, nextContext, taskData);
100
172
  return updates;
101
173
  })() : {};
102
174
  const getTaskDataFromEvent = event => event && typeof event === 'object' ? event.taskData : undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["_xstate","require","_constants","_uiControlsComputer","_guards","determineConsultInitiator","taskData","selfAgentId","undefined","consultingAgentId","isConsulted","deriveRecordingState","callProcessingDetails","interaction","update","recordingStarted","recordInProgress","isPaused","recordingControlsAvailable","recordingInProgress","deriveTaskDataUpdates","context","updates","uiControlConfig","agentId","consultingActive","state","INTERACTION_STATE","CONSULTING","hasActiveConsultInPostCall","destAgentId","isEpDnWithStoredId","consultDestinationType","consultDestinationAgentId","destinationType","consultInitiator","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","destination","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, INTERACTION_STATE} from './constants';\nimport {DestinationType, TaskData} from '../types';\nimport {computeUIControls, getDefaultUIControls} from './uiControlsComputer';\nimport {hasActiveConsultInPostCall} from './guards';\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 const selfAgentId = context.uiControlConfig.agentId ?? taskData?.agentId;\n const consultingActive =\n taskData?.interaction?.state === INTERACTION_STATE.CONSULTING ||\n hasActiveConsultInPostCall(taskData, selfAgentId);\n\n if (taskData.destAgentId) {\n const isEpDnWithStoredId =\n context.consultDestinationType === 'entryPoint' && context.consultDestinationAgentId;\n if (!isEpDnWithStoredId) {\n updates.consultDestinationAgentId = taskData.destAgentId;\n }\n }\n if (consultingActive && taskData.destinationType) {\n updates.consultDestinationType = taskData.destinationType as DestinationType;\n }\n\n if (!context.consultInitiator) {\n const consultInitiator = determineConsultInitiator(taskData, selfAgentId);\n if (consultInitiator !== undefined) {\n updates.consultInitiator = consultInitiator;\n } else if (consultingActive && taskData.isConsulted === false) {\n updates.consultInitiator = true;\n }\n }\n\n if (consultingActive && taskData.interaction) {\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 =\n ('destAgentId' in event ? event.destAgentId : null) ??\n ('destination' in event ? (event as any).destination : null) ??\n 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":[]}
1
+ {"version":3,"names":["_xstate","require","_constants","_uiControlsComputer","_TaskUtils","_guards","determineConsultInitiator","taskData","selfAgentId","undefined","consultingAgentId","isConsulted","deriveRecordingState","callProcessingDetails","interaction","update","recordingStarted","recordInProgress","isPaused","recordingControlsAvailable","recordingInProgress","isActiveConsultState","state","INTERACTION_STATE","CONSULTING","selfParticipant","participants","hasConsultMedia","Object","values","media","some","mType","MEDIA_TYPE_CONSULT","isPendingOrActiveSelfConsult","consultState","CONSULT_STATE","POST_CALL","isSelfConsultingOrPending","hasJoinedConsultDestination","cpd","backendSaysJoined","consultDestinationAgentJoined","p","hasLeft","hasJoined","deriveConsultCallHeldFromTaskData","eventType","type","consultMediaId","consultMediaResourceId","consultMedia","find","m","Boolean","isHold","getTaskStateForUiControls","TaskState","IDLE","isTerminated","WRAPPING_UP","CONFERENCE","getIsConferenceInProgress","CONFERENCING","mainMediaId","mainInteractionId","interactionId","isMainHeld","HELD","CONNECTED","deriveTaskDataUpdates","context","updates","uiControlConfig","agentId","consultingActive","hasActiveConsultInPostCall","conferenceFromPayload","selfConsultingOrPending","inferredConsultingInitiator","destAgentId","isEpDnWithStoredId","consultDestinationType","consultDestinationAgentId","destinationType","consultInitiator","effectiveConsultInitiator","consultFromConference","joinedConsultee","hasEpDnParticipant","pType","consultCallHeld","nextContext","inferredState","uiControls","computeUIControls","getTaskDataFromEvent","event","createInitialContext","initialState","baseContext","exitingConference","transferConferenceRequested","getDefaultUIControls","updateUIControls","currentState","assign","actions","exports","initializeTask","updateTaskData","setConsultInitiator","TaskEvent","CONSULT","handleConsultFailed","handleConferenceStarted","setConsultDestination","destination","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 {\n TaskEvent,\n TaskState,\n INTERACTION_STATE,\n CONSULT_STATE,\n MEDIA_TYPE_CONSULT,\n} from './constants';\nimport {DestinationType, TaskData} from '../types';\nimport {computeUIControls, getDefaultUIControls} from './uiControlsComputer';\nimport {getIsConferenceInProgress} from '../TaskUtils';\nimport {hasActiveConsultInPostCall} from './guards';\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 isActiveConsultState = (taskData: TaskData | undefined, selfAgentId?: string): boolean => {\n if (taskData?.interaction?.state === INTERACTION_STATE.CONSULTING) return true;\n if (selfAgentId) {\n const selfParticipant = taskData?.interaction?.participants?.[selfAgentId] as any;\n const hasConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(\n (media: any) => media?.mType === MEDIA_TYPE_CONSULT\n );\n const isPendingOrActiveSelfConsult =\n selfParticipant?.consultState === CONSULT_STATE.CONSULTING ||\n selfParticipant?.consultState === 'consultInitiated';\n if (isPendingOrActiveSelfConsult && hasConsultMedia && taskData?.isConsulted === false) {\n return true;\n }\n }\n if (taskData?.interaction?.state === INTERACTION_STATE.POST_CALL && selfAgentId) {\n const selfParticipant = taskData.interaction?.participants?.[selfAgentId] as any;\n const hasConsultMedia = Object.values(taskData.interaction?.media ?? {}).some(\n (media: any) => media?.mType === MEDIA_TYPE_CONSULT\n );\n if (selfParticipant?.consultState === CONSULT_STATE.CONSULTING && hasConsultMedia) return true;\n }\n\n return false;\n};\n\nconst isSelfConsultingOrPending = (\n taskData: TaskData | undefined,\n selfAgentId?: string\n): boolean => {\n if (!taskData || !selfAgentId) return false;\n const selfParticipant = taskData?.interaction?.participants?.[selfAgentId] as any;\n\n return (\n selfParticipant?.consultState === CONSULT_STATE.CONSULTING ||\n selfParticipant?.consultState === 'consultInitiated'\n );\n};\n\nconst hasJoinedConsultDestination = (taskData: TaskData | undefined): boolean => {\n if (!taskData?.interaction) return false;\n const participants = taskData.interaction.participants as any;\n const cpd = taskData.interaction.callProcessingDetails as any;\n const backendSaysJoined = cpd?.consultDestinationAgentJoined === 'true';\n if (backendSaysJoined) return true;\n if (!participants) return false;\n\n return Object.values(participants).some((p: any) => {\n if (!p || p.isConsulted !== true || p.hasLeft) return false;\n\n return p.hasJoined === true || p.consultState === CONSULT_STATE.CONSULTING;\n });\n};\n\nconst deriveConsultCallHeldFromTaskData = (taskData: TaskData | undefined): boolean | undefined => {\n if (!taskData?.interaction) return undefined;\n\n const eventType = taskData.type;\n if (eventType === 'AgentContactHeld') return true;\n if (eventType === 'AgentContactUnheld') return false;\n\n const consultMediaId = taskData.consultMediaResourceId;\n\n const consultMedia: any = consultMediaId\n ? taskData.interaction.media?.[consultMediaId]\n : Object.values(taskData.interaction.media ?? {}).find(\n (m: any) => m?.mType === MEDIA_TYPE_CONSULT\n );\n\n if (!consultMedia) return undefined;\n\n return Boolean(consultMedia.isHold);\n};\n\nconst getTaskStateForUiControls = (\n taskData: TaskData | undefined,\n selfAgentId: string | undefined\n): TaskState => {\n if (!taskData?.interaction) {\n return TaskState.IDLE;\n }\n\n if (taskData.interaction.isTerminated === true) {\n return TaskState.WRAPPING_UP;\n }\n\n if (isActiveConsultState(taskData, selfAgentId)) {\n return TaskState.CONSULTING;\n }\n\n if (\n taskData.interaction.state === INTERACTION_STATE.CONFERENCE ||\n getIsConferenceInProgress(taskData)\n ) {\n return TaskState.CONFERENCING;\n }\n\n const mainMediaId = taskData.interaction.mainInteractionId || taskData.interactionId;\n const isMainHeld = Boolean(\n mainMediaId && taskData.interaction.media?.[mainMediaId]?.isHold === true\n );\n if (taskData.interaction.state === 'hold' || isMainHeld) {\n return TaskState.HELD;\n }\n\n return TaskState.CONNECTED;\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 const selfAgentId = context.uiControlConfig.agentId ?? taskData?.agentId;\n const consultingActive =\n isActiveConsultState(taskData, selfAgentId) ||\n hasActiveConsultInPostCall(taskData, selfAgentId);\n const conferenceFromPayload =\n taskData?.interaction?.state === INTERACTION_STATE.CONFERENCE ||\n getIsConferenceInProgress(taskData);\n const selfConsultingOrPending = isSelfConsultingOrPending(taskData, selfAgentId);\n const inferredConsultingInitiator =\n selfConsultingOrPending && taskData?.isConsulted === false;\n\n if (taskData.destAgentId) {\n const isEpDnWithStoredId =\n context.consultDestinationType === 'entryPoint' && context.consultDestinationAgentId;\n if (!isEpDnWithStoredId) {\n updates.consultDestinationAgentId = taskData.destAgentId;\n }\n }\n if (consultingActive && taskData.destinationType) {\n updates.consultDestinationType = taskData.destinationType as DestinationType;\n }\n\n if (!context.consultInitiator) {\n const consultInitiator = determineConsultInitiator(taskData, selfAgentId);\n if (consultInitiator !== undefined) {\n updates.consultInitiator = consultInitiator;\n } else if (\n inferredConsultingInitiator ||\n (consultingActive && taskData.isConsulted === false)\n ) {\n updates.consultInitiator = true;\n }\n }\n\n const effectiveConsultInitiator = updates.consultInitiator ?? context.consultInitiator;\n if (\n effectiveConsultInitiator &&\n conferenceFromPayload &&\n (consultingActive || selfConsultingOrPending || Boolean(taskData?.consultMediaResourceId))\n ) {\n updates.consultFromConference = true;\n }\n\n if (consultingActive && taskData.interaction) {\n const joinedConsultee = hasJoinedConsultDestination(taskData);\n if (joinedConsultee) updates.consultDestinationAgentJoined = true;\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 if (effectiveConsultInitiator) {\n const consultCallHeld = deriveConsultCallHeldFromTaskData(taskData);\n if (consultCallHeld !== undefined) {\n updates.consultCallHeld = consultCallHeld;\n }\n }\n }\n\n const nextContext = {\n ...context,\n ...updates,\n } as TaskContext;\n const inferredState = getTaskStateForUiControls(taskData, selfAgentId);\n\n updates.uiControls = computeUIControls(inferredState, nextContext, taskData);\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 =\n ('destAgentId' in event ? event.destAgentId : null) ??\n ('destination' in event ? (event as any).destination : null) ??\n 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":[]}
@@ -98,6 +98,17 @@ const guards = exports.guards = {
98
98
  const taskData = getTaskDataFromEvent(event);
99
99
  if (taskData?.interaction?.state === _constants.INTERACTION_STATE.CONSULTING) return true;
100
100
 
101
+ // Hydrate can report interaction as conference/hold while this agent is actively consulting.
102
+ // Detect consult by participant consultState + consult media, independent of top-level state.
103
+ const selfAgentId = getSelfAgentId(context, taskData);
104
+ const selfParticipant = selfAgentId ? taskData?.interaction?.participants?.[selfAgentId] : null;
105
+ const hasConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(media => media?.mType === _constants.MEDIA_TYPE_CONSULT);
106
+ const selfActiveConsult = selfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING;
107
+ const selfPendingConsultInitiated = selfParticipant?.consultState === 'consultInitiated' && taskData?.isConsulted === false;
108
+ if ((selfActiveConsult || selfPendingConsultInitiated) && hasConsultMedia) {
109
+ return true;
110
+ }
111
+
101
112
  // EP_DN consulted agent: backend reports state as 'connected' but CPD indicates consult
102
113
  const cpd = taskData?.interaction?.callProcessingDetails;
103
114
  if (cpd?.relationshipType === 'consult' && taskData?.interaction?.state === _constants.INTERACTION_STATE.CONNECTED) {
@@ -109,6 +120,17 @@ const guards = exports.guards = {
109
120
  if (hasActiveConsultInPostCall(taskData, getSelfAgentId(context, taskData))) {
110
121
  return true;
111
122
  }
123
+
124
+ // Customer left during consult: interaction state is "post_call" but consult
125
+ // between agents is still active. Detect via agent's consultState + consult media.
126
+ if (taskData?.interaction?.state === _constants.INTERACTION_STATE.POST_CALL) {
127
+ const postCallSelfAgentId = getSelfAgentId(context, taskData);
128
+ const postCallSelfParticipant = postCallSelfAgentId ? taskData?.interaction?.participants?.[postCallSelfAgentId] : null;
129
+ const hasPostCallConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(media => media?.mType === _constants.MEDIA_TYPE_CONSULT);
130
+ if (postCallSelfParticipant?.consultState === _constants.CONSULT_STATE.CONSULTING && hasPostCallConsultMedia) {
131
+ return true;
132
+ }
133
+ }
112
134
  return false;
113
135
  },
114
136
  isInteractionHeld: ({
@@ -154,6 +176,19 @@ const guards = exports.guards = {
154
176
  if (!taskData?.interaction) return false;
155
177
  return (0, _TaskUtils.getIsConferenceInProgress)(taskData);
156
178
  },
179
+ /**
180
+ * Conference hold signal for conference-downgraded consult-end transitions.
181
+ * Backend can report this as boolean or string.
182
+ */
183
+ isConferenceHoldParticipantFromEvent: ({
184
+ context,
185
+ event
186
+ }) => {
187
+ const taskData = getTaskDataFromEvent(event) ?? context.taskData;
188
+ const callProcessingDetails = taskData?.interaction?.callProcessingDetails;
189
+ const conferenceHoldParticipant = callProcessingDetails?.conferenceHoldParticipant;
190
+ return conferenceHoldParticipant === true || conferenceHoldParticipant === 'true';
191
+ },
157
192
  /**
158
193
  * Conference downgrade check specifically for transitioning back to CONNECTED.
159
194
  *
@@ -1 +1 @@
1
- {"version":3,"names":["_TaskUtils","require","_constants","getTaskDataFromEvent","event","taskData","undefined","exports","getSelfAgentId","context","uiControlConfig","agentId","isSelfConsultingAgent","selfAgentId","consultingAgentId","hasActiveConsultInPostCall","interaction","state","INTERACTION_STATE","POST_CALL","selfParticipant","participants","hasConsultMedia","Object","values","media","some","mType","MEDIA_TYPE_CONSULT","consultState","CONSULT_STATE","CONSULTING","shouldWrapUpForThisAgent","pending","agentsPendingWrapUp","Array","isArray","length","includes","participantWrapUp","isWrapUp","wrapUpRequired","owner","isConsulted","guards","isInteractionTerminated","isTerminated","isInteractionConsulting","cpd","callProcessingDetails","relationshipType","CONNECTED","isInteractionHeld","mainMediaId","mainInteractionId","interactionId","isHold","isInteractionConnected","isConferencingByParticipants","mainCallId","agentCount","pId","p","pType","hasLeft","conferenceInProgressFromEvent","getIsConferenceInProgress","shouldDowngradeConferenceToConnected","eventTaskData","CONFERENCE","agentParticipantsCount","getConferenceParticipantsCount","customerInCall","getIsCustomerInCall","selfInMainCall","Boolean","didInitiateConsult","consultInitiator","isConsultingAssignment","shouldWrapUp","type","TaskEvent","CONFERENCE_END","shouldWrapUpOrIsInitiator","didCurrentAgentLeaveConference","participantIdFromEvent","participantId","isPrimaryMediaOnHold","mediaId","mediaResourceId"],"sources":["guards.ts"],"sourcesContent":["/**\n * Task State Machine Guards\n *\n * Guard functions that determine if a state transition is allowed.\n * These functions validate the current context before allowing transitions.\n *\n * All guards are consolidated here for:\n * - Single source of truth\n * - Easy testing\n * - Reusability across state machine transitions\n *\n * Guards are organized by category:\n * 1. Helper Functions - Extract data from events/context\n * 2. Hydrate Guards - For state restoration on page refresh\n * 3. Conference Guards - Conference state checks\n * 4. Customer Guards - Customer presence checks\n * 5. Consult Guards - Consult flow checks\n * 6. Wrapup Guards - End-of-call flow checks\n * 7. Server State Guards - Check backend-reported state\n * 8. Recording Guards - Recording state checks\n */\n\nimport {TaskContext, TaskEventPayload} from './types';\nimport {TaskData} from '../types';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n} from '../TaskUtils';\nimport {TaskEvent, INTERACTION_STATE, CONSULT_STATE, MEDIA_TYPE_CONSULT} from './constants';\n\nexport const getTaskDataFromEvent = (event?: TaskEventPayload): TaskData | undefined =>\n event && typeof event === 'object' && 'taskData' in event\n ? (event as {taskData?: TaskData}).taskData\n : undefined;\n\nexport const getSelfAgentId = (context: TaskContext, taskData?: TaskData): string | undefined =>\n context.uiControlConfig?.agentId ?? context.taskData?.agentId ?? taskData?.agentId;\n\nexport const isSelfConsultingAgent = (context: TaskContext, taskData?: TaskData): boolean => {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n return taskData?.consultingAgentId === selfAgentId;\n};\n\n/**\n * Detects an active consult during post_call state (customer left but agents still consulting).\n * Shared by hydration guard (isInteractionConsulting) and action (deriveTaskDataUpdates).\n */\nexport const hasActiveConsultInPostCall = (\n taskData: TaskData | undefined,\n selfAgentId?: string\n): boolean => {\n if (taskData?.interaction?.state !== INTERACTION_STATE.POST_CALL || !selfAgentId) return false;\n\n const selfParticipant = taskData.interaction?.participants?.[selfAgentId];\n const hasConsultMedia = Object.values(taskData.interaction?.media ?? {}).some(\n (media) => (media as {mType?: string})?.mType === MEDIA_TYPE_CONSULT\n );\n\n return selfParticipant?.consultState === CONSULT_STATE.CONSULTING && hasConsultMedia;\n};\n\n/**\n * Determines if this agent should enter WRAPPING_UP state.\n * Priority: agentsPendingWrapUp > wrapUpRequired / participant.isWrapUp > ownership > !isConsulted\n */\nexport const shouldWrapUpForThisAgent = (context: TaskContext, taskData: TaskData): boolean => {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const pending = taskData?.agentsPendingWrapUp;\n if (Array.isArray(pending) && pending.length > 0) {\n return pending.includes(selfAgentId);\n }\n\n const participantWrapUp = taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true;\n const wrapUpRequired = taskData?.wrapUpRequired === true;\n if (wrapUpRequired || participantWrapUp) {\n return true;\n }\n\n const owner = taskData?.interaction?.owner;\n if (owner && owner === selfAgentId) {\n return true;\n }\n\n if (taskData?.isConsulted === false) {\n return true;\n }\n\n return false;\n};\n\nexport interface GuardParams {\n context: TaskContext;\n event?: TaskEventPayload;\n}\n\nexport type GuardFunction = (params: GuardParams) => boolean;\n\nexport const guards = {\n // Hydrate Guards\n isInteractionTerminated: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.isTerminated === true) return true;\n\n const selfAgentId = getSelfAgentId(context, taskData);\n if (selfAgentId && taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true) {\n return true;\n }\n\n return false;\n },\n\n isInteractionConsulting: ({event, context}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.state === INTERACTION_STATE.CONSULTING) return true;\n\n // EP_DN consulted agent: backend reports state as 'connected' but CPD indicates consult\n const cpd = taskData?.interaction?.callProcessingDetails;\n if (\n cpd?.relationshipType === 'consult' &&\n taskData?.interaction?.state === INTERACTION_STATE.CONNECTED\n ) {\n return true;\n }\n\n // Customer left during consult: interaction state is \"post_call\" but consult\n // between agents is still active. Detect via agent's consultState + consult media.\n if (hasActiveConsultInPostCall(taskData, getSelfAgentId(context, taskData))) {\n return true;\n }\n\n return false;\n },\n\n isInteractionHeld: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.state === 'hold') return true;\n\n const mainMediaId = taskData?.interaction?.mainInteractionId || taskData?.interactionId;\n if (mainMediaId && taskData?.interaction?.media?.[mainMediaId]?.isHold === true) {\n return true;\n }\n\n return false;\n },\n\n isInteractionConnected: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData?.interaction?.state === INTERACTION_STATE.CONNECTED;\n },\n\n isConferencingByParticipants: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n const mainCallId = taskData.interaction?.mainInteractionId || taskData.interactionId;\n const media = taskData.interaction?.media?.[mainCallId];\n const participants = taskData.interaction?.participants;\n if (!media?.participants || !participants) return false;\n let agentCount = 0;\n for (const pId of media.participants) {\n const p = participants[pId];\n if (p && p.pType !== 'Customer' && p.pType !== 'Supervisor' && !p.hasLeft) {\n agentCount += 1;\n }\n }\n\n return agentCount >= 2;\n },\n\n // Conference Guards\n conferenceInProgressFromEvent: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData?.interaction) return false;\n\n return getIsConferenceInProgress(taskData);\n },\n\n /**\n * Conference downgrade check specifically for transitioning back to CONNECTED.\n *\n * Returns true only when:\n * - conference has downgraded (fewer than 2 active agent participants in main call)\n * - customer is still in the call\n * - current agent is still in the main call\n */\n shouldDowngradeConferenceToConnected: ({context, event}: GuardParams): boolean => {\n const eventTaskData = getTaskDataFromEvent(event);\n const taskData = eventTaskData ?? context.taskData;\n if (!taskData?.interaction) return false;\n\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const mainCallId = taskData.interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n // Don't downgrade while backend still reports conference.\n if (taskData.interaction.state === INTERACTION_STATE.CONFERENCE) return false;\n\n const agentParticipantsCount = getConferenceParticipantsCount(taskData.interaction, mainCallId);\n if (agentParticipantsCount >= 2) return false;\n\n const customerInCall = getIsCustomerInCall(taskData.interaction, mainCallId);\n if (!customerInCall) return false;\n\n const selfInMainCall = Boolean(\n taskData.interaction.media?.[mainCallId]?.participants?.includes(selfAgentId)\n );\n\n return selfInMainCall;\n },\n\n // Consult Guards\n /**\n * Check if this agent initiated the consult (using event data)\n * Handles both consultingAgentId and fallback to context flag\n */\n didInitiateConsult: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (taskData?.isConsulted === true) return false;\n\n return taskData?.consultingAgentId\n ? isSelfConsultingAgent(context, taskData)\n : context.consultInitiator === true;\n },\n\n /**\n * EP-DN / consulted consult legs can arrive as AGENT_CONTACT_ASSIGNED without a preceding\n * AgentConsulting event. When that happens, we should enter CONSULTING (not CONNECTED).\n */\n isConsultingAssignment: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n\n const relationshipType = taskData.interaction?.callProcessingDetails?.relationshipType;\n\n return (\n taskData.isConsulted === true ||\n relationshipType === 'consult' ||\n taskData.interaction?.state === INTERACTION_STATE.CONSULTING\n );\n },\n\n // Wrapup Guards\n shouldWrapUp: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n\n if (event?.type === TaskEvent.CONFERENCE_END) {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const pending = taskData?.agentsPendingWrapUp;\n if (Array.isArray(pending) && pending.length > 0) {\n return pending.includes(selfAgentId);\n }\n\n const participantWrapUp =\n taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true;\n const wrapUpRequired = taskData?.wrapUpRequired === true;\n\n return wrapUpRequired || participantWrapUp;\n }\n\n return shouldWrapUpForThisAgent(context, taskData);\n },\n\n /**\n * Check if wrapUpRequired in payload OR is consult initiator\n */\n shouldWrapUpOrIsInitiator: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n return Boolean(taskData?.wrapUpRequired || context.consultInitiator);\n },\n\n /**\n * True if PARTICIPANT_LEAVE indicates that *this* agent left the conference.\n *\n * Important: PARTICIPANT_LEAVE is broadcast to all agents in the conference.\n * Only the agent whose id matches the leaving participant should transition to\n * TERMINATED / WRAPPING_UP based on wrapup rules.\n */\n didCurrentAgentLeaveConference: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const participantIdFromEvent =\n event && typeof event === 'object' && 'participantId' in event\n ? (event as {participantId?: string}).participantId\n : undefined;\n const participantId = participantIdFromEvent ?? taskData?.participantId;\n\n if (Boolean(participantId) && participantId === selfAgentId) {\n return true;\n }\n\n // For EP-DN agents the backend removes the leaving participant entirely\n // from the participants map (rather than setting hasLeft). If this task\n // is in CONFERENCING (implied by the guard being evaluated here) but the\n // agent is absent from the updated participants, they have left.\n const participants = taskData?.interaction?.participants;\n if (participants && !(selfAgentId in participants)) {\n return true;\n }\n\n return false;\n },\n\n // Server State Guards\n isPrimaryMediaOnHold: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n const mediaId = taskData.mediaResourceId;\n if (!mediaId) return false;\n\n return taskData.interaction?.media?.[mediaId]?.isHold === true;\n },\n};\n\nexport type GuardName = keyof typeof guards;\n"],"mappings":";;;;;;AAwBA,IAAAA,UAAA,GAAAC,OAAA;AAKA,IAAAC,UAAA,GAAAD,OAAA;AA7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWO,MAAME,oBAAoB,GAAIC,KAAwB,IAC3DA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAIA,KAAK,GACpDA,KAAK,CAA2BC,QAAQ,GACzCC,SAAS;AAACC,OAAA,CAAAJ,oBAAA,GAAAA,oBAAA;AAET,MAAMK,cAAc,GAAGA,CAACC,OAAoB,EAAEJ,QAAmB,KACtEI,OAAO,CAACC,eAAe,EAAEC,OAAO,IAAIF,OAAO,CAACJ,QAAQ,EAAEM,OAAO,IAAIN,QAAQ,EAAEM,OAAO;AAACJ,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAE9E,MAAMI,qBAAqB,GAAGA,CAACH,OAAoB,EAAEJ,QAAmB,KAAc;EAC3F,MAAMQ,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;EACrD,IAAI,CAACQ,WAAW,EAAE,OAAO,KAAK;EAE9B,OAAOR,QAAQ,EAAES,iBAAiB,KAAKD,WAAW;AACpD,CAAC;;AAED;AACA;AACA;AACA;AAHAN,OAAA,CAAAK,qBAAA,GAAAA,qBAAA;AAIO,MAAMG,0BAA0B,GAAGA,CACxCV,QAA8B,EAC9BQ,WAAoB,KACR;EACZ,IAAIR,QAAQ,EAAEW,WAAW,EAAEC,KAAK,KAAKC,4BAAiB,CAACC,SAAS,IAAI,CAACN,WAAW,EAAE,OAAO,KAAK;EAE9F,MAAMO,eAAe,GAAGf,QAAQ,CAACW,WAAW,EAAEK,YAAY,GAAGR,WAAW,CAAC;EACzE,MAAMS,eAAe,GAAGC,MAAM,CAACC,MAAM,CAACnB,QAAQ,CAACW,WAAW,EAAES,KAAK,IAAI,CAAC,CAAC,CAAC,CAACC,IAAI,CAC1ED,KAAK,IAAMA,KAAK,EAAuBE,KAAK,KAAKC,6BACpD,CAAC;EAED,OAAOR,eAAe,EAAES,YAAY,KAAKC,wBAAa,CAACC,UAAU,IAAIT,eAAe;AACtF,CAAC;;AAED;AACA;AACA;AACA;AAHAf,OAAA,CAAAQ,0BAAA,GAAAA,0BAAA;AAIO,MAAMiB,wBAAwB,GAAGA,CAACvB,OAAoB,EAAEJ,QAAkB,KAAc;EAC7F,MAAMQ,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;EACrD,IAAI,CAACQ,WAAW,EAAE,OAAO,KAAK;EAE9B,MAAMoB,OAAO,GAAG5B,QAAQ,EAAE6B,mBAAmB;EAC7C,IAAIC,KAAK,CAACC,OAAO,CAACH,OAAO,CAAC,IAAIA,OAAO,CAACI,MAAM,GAAG,CAAC,EAAE;IAChD,OAAOJ,OAAO,CAACK,QAAQ,CAACzB,WAAW,CAAC;EACtC;EAEA,MAAM0B,iBAAiB,GAAGlC,QAAQ,EAAEW,WAAW,EAAEK,YAAY,GAAGR,WAAW,CAAC,EAAE2B,QAAQ,KAAK,IAAI;EAC/F,MAAMC,cAAc,GAAGpC,QAAQ,EAAEoC,cAAc,KAAK,IAAI;EACxD,IAAIA,cAAc,IAAIF,iBAAiB,EAAE;IACvC,OAAO,IAAI;EACb;EAEA,MAAMG,KAAK,GAAGrC,QAAQ,EAAEW,WAAW,EAAE0B,KAAK;EAC1C,IAAIA,KAAK,IAAIA,KAAK,KAAK7B,WAAW,EAAE;IAClC,OAAO,IAAI;EACb;EAEA,IAAIR,QAAQ,EAAEsC,WAAW,KAAK,KAAK,EAAE;IACnC,OAAO,IAAI;EACb;EAEA,OAAO,KAAK;AACd,CAAC;AAACpC,OAAA,CAAAyB,wBAAA,GAAAA,wBAAA;AASK,MAAMY,MAAM,GAAArC,OAAA,CAAAqC,MAAA,GAAG;EACpB;EACAC,uBAAuB,EAAEA,CAAC;IAACpC,OAAO;IAAEL;EAAkB,CAAC,KAAc;IACnE,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAE5C,IAAIC,QAAQ,EAAEW,WAAW,EAAE8B,YAAY,KAAK,IAAI,EAAE,OAAO,IAAI;IAE7D,MAAMjC,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;IACrD,IAAIQ,WAAW,IAAIR,QAAQ,EAAEW,WAAW,EAAEK,YAAY,GAAGR,WAAW,CAAC,EAAE2B,QAAQ,KAAK,IAAI,EAAE;MACxF,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd,CAAC;EAEDO,uBAAuB,EAAEA,CAAC;IAAC3C,KAAK;IAAEK;EAAoB,CAAC,KAAc;IACnE,MAAMJ,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAE5C,IAAIC,QAAQ,EAAEW,WAAW,EAAEC,KAAK,KAAKC,4BAAiB,CAACa,UAAU,EAAE,OAAO,IAAI;;IAE9E;IACA,MAAMiB,GAAG,GAAG3C,QAAQ,EAAEW,WAAW,EAAEiC,qBAAqB;IACxD,IACED,GAAG,EAAEE,gBAAgB,KAAK,SAAS,IACnC7C,QAAQ,EAAEW,WAAW,EAAEC,KAAK,KAAKC,4BAAiB,CAACiC,SAAS,EAC5D;MACA,OAAO,IAAI;IACb;;IAEA;IACA;IACA,IAAIpC,0BAA0B,CAACV,QAAQ,EAAEG,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC,CAAC,EAAE;MAC3E,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd,CAAC;EAED+C,iBAAiB,EAAEA,CAAC;IAAChD;EAAkB,CAAC,KAAc;IACpD,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAE5C,IAAIC,QAAQ,EAAEW,WAAW,EAAEC,KAAK,KAAK,MAAM,EAAE,OAAO,IAAI;IAExD,MAAMoC,WAAW,GAAGhD,QAAQ,EAAEW,WAAW,EAAEsC,iBAAiB,IAAIjD,QAAQ,EAAEkD,aAAa;IACvF,IAAIF,WAAW,IAAIhD,QAAQ,EAAEW,WAAW,EAAES,KAAK,GAAG4B,WAAW,CAAC,EAAEG,MAAM,KAAK,IAAI,EAAE;MAC/E,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd,CAAC;EAEDC,sBAAsB,EAAEA,CAAC;IAACrD;EAAkB,CAAC,KAAc;IACzD,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAE5C,OAAOC,QAAQ,EAAEW,WAAW,EAAEC,KAAK,KAAKC,4BAAiB,CAACiC,SAAS;EACrE,CAAC;EAEDO,4BAA4B,EAAEA,CAAC;IAACtD;EAAkB,CAAC,KAAc;IAC/D,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAI,CAACC,QAAQ,EAAE,OAAO,KAAK;IAC3B,MAAMsD,UAAU,GAAGtD,QAAQ,CAACW,WAAW,EAAEsC,iBAAiB,IAAIjD,QAAQ,CAACkD,aAAa;IACpF,MAAM9B,KAAK,GAAGpB,QAAQ,CAACW,WAAW,EAAES,KAAK,GAAGkC,UAAU,CAAC;IACvD,MAAMtC,YAAY,GAAGhB,QAAQ,CAACW,WAAW,EAAEK,YAAY;IACvD,IAAI,CAACI,KAAK,EAAEJ,YAAY,IAAI,CAACA,YAAY,EAAE,OAAO,KAAK;IACvD,IAAIuC,UAAU,GAAG,CAAC;IAClB,KAAK,MAAMC,GAAG,IAAIpC,KAAK,CAACJ,YAAY,EAAE;MACpC,MAAMyC,CAAC,GAAGzC,YAAY,CAACwC,GAAG,CAAC;MAC3B,IAAIC,CAAC,IAAIA,CAAC,CAACC,KAAK,KAAK,UAAU,IAAID,CAAC,CAACC,KAAK,KAAK,YAAY,IAAI,CAACD,CAAC,CAACE,OAAO,EAAE;QACzEJ,UAAU,IAAI,CAAC;MACjB;IACF;IAEA,OAAOA,UAAU,IAAI,CAAC;EACxB,CAAC;EAED;EACAK,6BAA6B,EAAEA,CAAC;IAAC7D;EAAkB,CAAC,KAAc;IAChE,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAI,CAACC,QAAQ,EAAEW,WAAW,EAAE,OAAO,KAAK;IAExC,OAAO,IAAAkD,oCAAyB,EAAC7D,QAAQ,CAAC;EAC5C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE8D,oCAAoC,EAAEA,CAAC;IAAC1D,OAAO;IAAEL;EAAkB,CAAC,KAAc;IAChF,MAAMgE,aAAa,GAAGjE,oBAAoB,CAACC,KAAK,CAAC;IACjD,MAAMC,QAAQ,GAAG+D,aAAa,IAAI3D,OAAO,CAACJ,QAAQ;IAClD,IAAI,CAACA,QAAQ,EAAEW,WAAW,EAAE,OAAO,KAAK;IAExC,MAAMH,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;IACrD,IAAI,CAACQ,WAAW,EAAE,OAAO,KAAK;IAE9B,MAAM8C,UAAU,GAAGtD,QAAQ,CAACW,WAAW,CAACsC,iBAAiB,IAAIjD,QAAQ,CAACkD,aAAa;IACnF,IAAI,CAACI,UAAU,EAAE,OAAO,KAAK;;IAE7B;IACA,IAAItD,QAAQ,CAACW,WAAW,CAACC,KAAK,KAAKC,4BAAiB,CAACmD,UAAU,EAAE,OAAO,KAAK;IAE7E,MAAMC,sBAAsB,GAAG,IAAAC,yCAA8B,EAAClE,QAAQ,CAACW,WAAW,EAAE2C,UAAU,CAAC;IAC/F,IAAIW,sBAAsB,IAAI,CAAC,EAAE,OAAO,KAAK;IAE7C,MAAME,cAAc,GAAG,IAAAC,8BAAmB,EAACpE,QAAQ,CAACW,WAAW,EAAE2C,UAAU,CAAC;IAC5E,IAAI,CAACa,cAAc,EAAE,OAAO,KAAK;IAEjC,MAAME,cAAc,GAAGC,OAAO,CAC5BtE,QAAQ,CAACW,WAAW,CAACS,KAAK,GAAGkC,UAAU,CAAC,EAAEtC,YAAY,EAAEiB,QAAQ,CAACzB,WAAW,CAC9E,CAAC;IAED,OAAO6D,cAAc;EACvB,CAAC;EAED;EACA;AACF;AACA;AACA;EACEE,kBAAkB,EAAEA,CAAC;IAACnE,OAAO;IAAEL;EAAkB,CAAC,KAAc;IAC9D,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAIC,QAAQ,EAAEsC,WAAW,KAAK,IAAI,EAAE,OAAO,KAAK;IAEhD,OAAOtC,QAAQ,EAAES,iBAAiB,GAC9BF,qBAAqB,CAACH,OAAO,EAAEJ,QAAQ,CAAC,GACxCI,OAAO,CAACoE,gBAAgB,KAAK,IAAI;EACvC,CAAC;EAED;AACF;AACA;AACA;EACEC,sBAAsB,EAAEA,CAAC;IAAC1E;EAAkB,CAAC,KAAc;IACzD,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAI,CAACC,QAAQ,EAAE,OAAO,KAAK;IAE3B,MAAM6C,gBAAgB,GAAG7C,QAAQ,CAACW,WAAW,EAAEiC,qBAAqB,EAAEC,gBAAgB;IAEtF,OACE7C,QAAQ,CAACsC,WAAW,KAAK,IAAI,IAC7BO,gBAAgB,KAAK,SAAS,IAC9B7C,QAAQ,CAACW,WAAW,EAAEC,KAAK,KAAKC,4BAAiB,CAACa,UAAU;EAEhE,CAAC;EAED;EACAgD,YAAY,EAAEA,CAAC;IAACtE,OAAO;IAAEL;EAAkB,CAAC,KAAc;IACxD,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAI,CAACC,QAAQ,EAAE,OAAO,KAAK;IAE3B,IAAID,KAAK,EAAE4E,IAAI,KAAKC,oBAAS,CAACC,cAAc,EAAE;MAC5C,MAAMrE,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;MACrD,IAAI,CAACQ,WAAW,EAAE,OAAO,KAAK;MAE9B,MAAMoB,OAAO,GAAG5B,QAAQ,EAAE6B,mBAAmB;MAC7C,IAAIC,KAAK,CAACC,OAAO,CAACH,OAAO,CAAC,IAAIA,OAAO,CAACI,MAAM,GAAG,CAAC,EAAE;QAChD,OAAOJ,OAAO,CAACK,QAAQ,CAACzB,WAAW,CAAC;MACtC;MAEA,MAAM0B,iBAAiB,GACrBlC,QAAQ,EAAEW,WAAW,EAAEK,YAAY,GAAGR,WAAW,CAAC,EAAE2B,QAAQ,KAAK,IAAI;MACvE,MAAMC,cAAc,GAAGpC,QAAQ,EAAEoC,cAAc,KAAK,IAAI;MAExD,OAAOA,cAAc,IAAIF,iBAAiB;IAC5C;IAEA,OAAOP,wBAAwB,CAACvB,OAAO,EAAEJ,QAAQ,CAAC;EACpD,CAAC;EAED;AACF;AACA;EACE8E,yBAAyB,EAAEA,CAAC;IAAC1E,OAAO;IAAEL;EAAkB,CAAC,KAAc;IACrE,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAE5C,OAAOuE,OAAO,CAACtE,QAAQ,EAAEoC,cAAc,IAAIhC,OAAO,CAACoE,gBAAgB,CAAC;EACtE,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEO,8BAA8B,EAAEA,CAAC;IAAC3E,OAAO;IAAEL;EAAkB,CAAC,KAAc;IAC1E,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,MAAMS,WAAW,GAAGL,cAAc,CAACC,OAAO,EAAEJ,QAAQ,CAAC;IACrD,IAAI,CAACQ,WAAW,EAAE,OAAO,KAAK;IAE9B,MAAMwE,sBAAsB,GAC1BjF,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,eAAe,IAAIA,KAAK,GACzDA,KAAK,CAA8BkF,aAAa,GACjDhF,SAAS;IACf,MAAMgF,aAAa,GAAGD,sBAAsB,IAAIhF,QAAQ,EAAEiF,aAAa;IAEvE,IAAIX,OAAO,CAACW,aAAa,CAAC,IAAIA,aAAa,KAAKzE,WAAW,EAAE;MAC3D,OAAO,IAAI;IACb;;IAEA;IACA;IACA;IACA;IACA,MAAMQ,YAAY,GAAGhB,QAAQ,EAAEW,WAAW,EAAEK,YAAY;IACxD,IAAIA,YAAY,IAAI,EAAER,WAAW,IAAIQ,YAAY,CAAC,EAAE;MAClD,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd,CAAC;EAED;EACAkE,oBAAoB,EAAEA,CAAC;IAACnF;EAAkB,CAAC,KAAc;IACvD,MAAMC,QAAQ,GAAGF,oBAAoB,CAACC,KAAK,CAAC;IAC5C,IAAI,CAACC,QAAQ,EAAE,OAAO,KAAK;IAC3B,MAAMmF,OAAO,GAAGnF,QAAQ,CAACoF,eAAe;IACxC,IAAI,CAACD,OAAO,EAAE,OAAO,KAAK;IAE1B,OAAOnF,QAAQ,CAACW,WAAW,EAAES,KAAK,GAAG+D,OAAO,CAAC,EAAEhC,MAAM,KAAK,IAAI;EAChE;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_TaskUtils","require","_constants","getTaskDataFromEvent","event","taskData","undefined","exports","getSelfAgentId","context","uiControlConfig","agentId","isSelfConsultingAgent","selfAgentId","consultingAgentId","hasActiveConsultInPostCall","interaction","state","INTERACTION_STATE","POST_CALL","selfParticipant","participants","hasConsultMedia","Object","values","media","some","mType","MEDIA_TYPE_CONSULT","consultState","CONSULT_STATE","CONSULTING","shouldWrapUpForThisAgent","pending","agentsPendingWrapUp","Array","isArray","length","includes","participantWrapUp","isWrapUp","wrapUpRequired","owner","isConsulted","guards","isInteractionTerminated","isTerminated","isInteractionConsulting","selfActiveConsult","selfPendingConsultInitiated","cpd","callProcessingDetails","relationshipType","CONNECTED","postCallSelfAgentId","postCallSelfParticipant","hasPostCallConsultMedia","isInteractionHeld","mainMediaId","mainInteractionId","interactionId","isHold","isInteractionConnected","isConferencingByParticipants","mainCallId","agentCount","pId","p","pType","hasLeft","conferenceInProgressFromEvent","getIsConferenceInProgress","isConferenceHoldParticipantFromEvent","conferenceHoldParticipant","shouldDowngradeConferenceToConnected","eventTaskData","CONFERENCE","agentParticipantsCount","getConferenceParticipantsCount","customerInCall","getIsCustomerInCall","selfInMainCall","Boolean","didInitiateConsult","consultInitiator","isConsultingAssignment","shouldWrapUp","type","TaskEvent","CONFERENCE_END","shouldWrapUpOrIsInitiator","didCurrentAgentLeaveConference","participantIdFromEvent","participantId","isPrimaryMediaOnHold","mediaId","mediaResourceId"],"sources":["guards.ts"],"sourcesContent":["/**\n * Task State Machine Guards\n *\n * Guard functions that determine if a state transition is allowed.\n * These functions validate the current context before allowing transitions.\n *\n * All guards are consolidated here for:\n * - Single source of truth\n * - Easy testing\n * - Reusability across state machine transitions\n *\n * Guards are organized by category:\n * 1. Helper Functions - Extract data from events/context\n * 2. Hydrate Guards - For state restoration on page refresh\n * 3. Conference Guards - Conference state checks\n * 4. Customer Guards - Customer presence checks\n * 5. Consult Guards - Consult flow checks\n * 6. Wrapup Guards - End-of-call flow checks\n * 7. Server State Guards - Check backend-reported state\n * 8. Recording Guards - Recording state checks\n */\n\nimport {TaskContext, TaskEventPayload} from './types';\nimport {TaskData} from '../types';\nimport {\n getIsCustomerInCall,\n getConferenceParticipantsCount,\n getIsConferenceInProgress,\n} from '../TaskUtils';\nimport {TaskEvent, INTERACTION_STATE, CONSULT_STATE, MEDIA_TYPE_CONSULT} from './constants';\n\nexport const getTaskDataFromEvent = (event?: TaskEventPayload): TaskData | undefined =>\n event && typeof event === 'object' && 'taskData' in event\n ? (event as {taskData?: TaskData}).taskData\n : undefined;\n\nexport const getSelfAgentId = (context: TaskContext, taskData?: TaskData): string | undefined =>\n context.uiControlConfig?.agentId ?? context.taskData?.agentId ?? taskData?.agentId;\n\nexport const isSelfConsultingAgent = (context: TaskContext, taskData?: TaskData): boolean => {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n return taskData?.consultingAgentId === selfAgentId;\n};\n\n/**\n * Detects an active consult during post_call state (customer left but agents still consulting).\n * Shared by hydration guard (isInteractionConsulting) and action (deriveTaskDataUpdates).\n */\nexport const hasActiveConsultInPostCall = (\n taskData: TaskData | undefined,\n selfAgentId?: string\n): boolean => {\n if (taskData?.interaction?.state !== INTERACTION_STATE.POST_CALL || !selfAgentId) return false;\n\n const selfParticipant = taskData.interaction?.participants?.[selfAgentId];\n const hasConsultMedia = Object.values(taskData.interaction?.media ?? {}).some(\n (media) => (media as {mType?: string})?.mType === MEDIA_TYPE_CONSULT\n );\n\n return selfParticipant?.consultState === CONSULT_STATE.CONSULTING && hasConsultMedia;\n};\n\n/**\n * Determines if this agent should enter WRAPPING_UP state.\n * Priority: agentsPendingWrapUp > wrapUpRequired / participant.isWrapUp > ownership > !isConsulted\n */\nexport const shouldWrapUpForThisAgent = (context: TaskContext, taskData: TaskData): boolean => {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const pending = taskData?.agentsPendingWrapUp;\n if (Array.isArray(pending) && pending.length > 0) {\n return pending.includes(selfAgentId);\n }\n\n const participantWrapUp = taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true;\n const wrapUpRequired = taskData?.wrapUpRequired === true;\n if (wrapUpRequired || participantWrapUp) {\n return true;\n }\n\n const owner = taskData?.interaction?.owner;\n if (owner && owner === selfAgentId) {\n return true;\n }\n\n if (taskData?.isConsulted === false) {\n return true;\n }\n\n return false;\n};\n\nexport interface GuardParams {\n context: TaskContext;\n event?: TaskEventPayload;\n}\n\nexport type GuardFunction = (params: GuardParams) => boolean;\n\nexport const guards = {\n // Hydrate Guards\n isInteractionTerminated: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.isTerminated === true) return true;\n\n const selfAgentId = getSelfAgentId(context, taskData);\n if (selfAgentId && taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true) {\n return true;\n }\n\n return false;\n },\n\n isInteractionConsulting: ({event, context}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.state === INTERACTION_STATE.CONSULTING) return true;\n\n // Hydrate can report interaction as conference/hold while this agent is actively consulting.\n // Detect consult by participant consultState + consult media, independent of top-level state.\n const selfAgentId = getSelfAgentId(context, taskData);\n const selfParticipant = selfAgentId ? taskData?.interaction?.participants?.[selfAgentId] : null;\n const hasConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(\n (media: any) => media?.mType === MEDIA_TYPE_CONSULT\n );\n const selfActiveConsult = selfParticipant?.consultState === CONSULT_STATE.CONSULTING;\n const selfPendingConsultInitiated =\n selfParticipant?.consultState === 'consultInitiated' && taskData?.isConsulted === false;\n if ((selfActiveConsult || selfPendingConsultInitiated) && hasConsultMedia) {\n return true;\n }\n\n // EP_DN consulted agent: backend reports state as 'connected' but CPD indicates consult\n const cpd = taskData?.interaction?.callProcessingDetails;\n if (\n cpd?.relationshipType === 'consult' &&\n taskData?.interaction?.state === INTERACTION_STATE.CONNECTED\n ) {\n return true;\n }\n\n // Customer left during consult: interaction state is \"post_call\" but consult\n // between agents is still active. Detect via agent's consultState + consult media.\n if (hasActiveConsultInPostCall(taskData, getSelfAgentId(context, taskData))) {\n return true;\n }\n\n // Customer left during consult: interaction state is \"post_call\" but consult\n // between agents is still active. Detect via agent's consultState + consult media.\n if (taskData?.interaction?.state === INTERACTION_STATE.POST_CALL) {\n const postCallSelfAgentId = getSelfAgentId(context, taskData);\n const postCallSelfParticipant = postCallSelfAgentId\n ? taskData?.interaction?.participants?.[postCallSelfAgentId]\n : null;\n const hasPostCallConsultMedia = Object.values(taskData?.interaction?.media ?? {}).some(\n (media: any) => media?.mType === MEDIA_TYPE_CONSULT\n );\n if (\n postCallSelfParticipant?.consultState === CONSULT_STATE.CONSULTING &&\n hasPostCallConsultMedia\n ) {\n return true;\n }\n }\n\n return false;\n },\n\n isInteractionHeld: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n if (taskData?.interaction?.state === 'hold') return true;\n\n const mainMediaId = taskData?.interaction?.mainInteractionId || taskData?.interactionId;\n if (mainMediaId && taskData?.interaction?.media?.[mainMediaId]?.isHold === true) {\n return true;\n }\n\n return false;\n },\n\n isInteractionConnected: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n return taskData?.interaction?.state === INTERACTION_STATE.CONNECTED;\n },\n\n isConferencingByParticipants: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n const mainCallId = taskData.interaction?.mainInteractionId || taskData.interactionId;\n const media = taskData.interaction?.media?.[mainCallId];\n const participants = taskData.interaction?.participants;\n if (!media?.participants || !participants) return false;\n let agentCount = 0;\n for (const pId of media.participants) {\n const p = participants[pId];\n if (p && p.pType !== 'Customer' && p.pType !== 'Supervisor' && !p.hasLeft) {\n agentCount += 1;\n }\n }\n\n return agentCount >= 2;\n },\n\n // Conference Guards\n conferenceInProgressFromEvent: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData?.interaction) return false;\n\n return getIsConferenceInProgress(taskData);\n },\n\n /**\n * Conference hold signal for conference-downgraded consult-end transitions.\n * Backend can report this as boolean or string.\n */\n isConferenceHoldParticipantFromEvent: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event) ?? context.taskData;\n const callProcessingDetails = taskData?.interaction?.callProcessingDetails as\n | {conferenceHoldParticipant?: boolean | string}\n | undefined;\n const conferenceHoldParticipant = callProcessingDetails?.conferenceHoldParticipant;\n\n return conferenceHoldParticipant === true || conferenceHoldParticipant === 'true';\n },\n\n /**\n * Conference downgrade check specifically for transitioning back to CONNECTED.\n *\n * Returns true only when:\n * - conference has downgraded (fewer than 2 active agent participants in main call)\n * - customer is still in the call\n * - current agent is still in the main call\n */\n shouldDowngradeConferenceToConnected: ({context, event}: GuardParams): boolean => {\n const eventTaskData = getTaskDataFromEvent(event);\n const taskData = eventTaskData ?? context.taskData;\n if (!taskData?.interaction) return false;\n\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const mainCallId = taskData.interaction.mainInteractionId || taskData.interactionId;\n if (!mainCallId) return false;\n\n // Don't downgrade while backend still reports conference.\n if (taskData.interaction.state === INTERACTION_STATE.CONFERENCE) return false;\n\n const agentParticipantsCount = getConferenceParticipantsCount(taskData.interaction, mainCallId);\n if (agentParticipantsCount >= 2) return false;\n\n const customerInCall = getIsCustomerInCall(taskData.interaction, mainCallId);\n if (!customerInCall) return false;\n\n const selfInMainCall = Boolean(\n taskData.interaction.media?.[mainCallId]?.participants?.includes(selfAgentId)\n );\n\n return selfInMainCall;\n },\n\n // Consult Guards\n /**\n * Check if this agent initiated the consult (using event data)\n * Handles both consultingAgentId and fallback to context flag\n */\n didInitiateConsult: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (taskData?.isConsulted === true) return false;\n\n return taskData?.consultingAgentId\n ? isSelfConsultingAgent(context, taskData)\n : context.consultInitiator === true;\n },\n\n /**\n * EP-DN / consulted consult legs can arrive as AGENT_CONTACT_ASSIGNED without a preceding\n * AgentConsulting event. When that happens, we should enter CONSULTING (not CONNECTED).\n */\n isConsultingAssignment: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n\n const relationshipType = taskData.interaction?.callProcessingDetails?.relationshipType;\n\n return (\n taskData.isConsulted === true ||\n relationshipType === 'consult' ||\n taskData.interaction?.state === INTERACTION_STATE.CONSULTING\n );\n },\n\n // Wrapup Guards\n shouldWrapUp: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n\n if (event?.type === TaskEvent.CONFERENCE_END) {\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const pending = taskData?.agentsPendingWrapUp;\n if (Array.isArray(pending) && pending.length > 0) {\n return pending.includes(selfAgentId);\n }\n\n const participantWrapUp =\n taskData?.interaction?.participants?.[selfAgentId]?.isWrapUp === true;\n const wrapUpRequired = taskData?.wrapUpRequired === true;\n\n return wrapUpRequired || participantWrapUp;\n }\n\n return shouldWrapUpForThisAgent(context, taskData);\n },\n\n /**\n * Check if wrapUpRequired in payload OR is consult initiator\n */\n shouldWrapUpOrIsInitiator: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n\n return Boolean(taskData?.wrapUpRequired || context.consultInitiator);\n },\n\n /**\n * True if PARTICIPANT_LEAVE indicates that *this* agent left the conference.\n *\n * Important: PARTICIPANT_LEAVE is broadcast to all agents in the conference.\n * Only the agent whose id matches the leaving participant should transition to\n * TERMINATED / WRAPPING_UP based on wrapup rules.\n */\n didCurrentAgentLeaveConference: ({context, event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n const selfAgentId = getSelfAgentId(context, taskData);\n if (!selfAgentId) return false;\n\n const participantIdFromEvent =\n event && typeof event === 'object' && 'participantId' in event\n ? (event as {participantId?: string}).participantId\n : undefined;\n const participantId = participantIdFromEvent ?? taskData?.participantId;\n\n if (Boolean(participantId) && participantId === selfAgentId) {\n return true;\n }\n\n // For EP-DN agents the backend removes the leaving participant entirely\n // from the participants map (rather than setting hasLeft). If this task\n // is in CONFERENCING (implied by the guard being evaluated here) but the\n // agent is absent from the updated participants, they have left.\n const participants = taskData?.interaction?.participants;\n if (participants && !(selfAgentId in participants)) {\n return true;\n }\n\n return false;\n },\n\n // Server State Guards\n isPrimaryMediaOnHold: ({event}: GuardParams): boolean => {\n const taskData = getTaskDataFromEvent(event);\n if (!taskData) return false;\n const mediaId = taskData.mediaResourceId;\n if (!mediaId) return false;\n\n return taskData.interaction?.media?.[mediaId]?.isHold === true;\n },\n};\n\nexport type GuardName = keyof typeof guards;\n"],"mappings":"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","ignoreList":[]}