Skip to content

Conversation

akulakum
Copy link
Contributor

@akulakum akulakum commented Oct 7, 2025

COMPLETES #https://jira-eng-sjc12.cisco.com/jira/browse/CAI-7182

Vidcast Link for the MPC Feature: https://app.vidcast.io/share/c3d5e394-c931-45eb-8d76-10e1f1994b33
Transfer Conference Feature: https://app.vidcast.io/share/daf96a54-dbda-419c-9150-e9ba7aea4ca3

This pull request addresses

Implemented the Multi-Party Conference feature supporting more than three participants, along with the Conference Transfer functionality.

Conference Transfer Behavior:

An agent can initiate a transfer only during a consultation.

Scenario 1: If Agent A1 and Agent A2 are on a consultation while the customer is on hold, upon transfer, A1 leaves and A2 takes ownership of the call.

Scenario 2: If Agent A1 and Agent A3 are on a consultation while the customer and Agent A2 are already in the main conference, upon transfer, A1 leaves, A2 becomes the new owner, and A3 joins the main conference with A2 and the customer.

by making the following changes

< DESCRIBE YOUR CHANGES >

Change Type

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Tooling change
  • Internal code refactor

The following scenarios were tested

< ENUMERATE TESTS PERFORMED, WHETHER MANUAL OR AUTOMATED >

The GAI Coding Policy And Copyright Annotation Best Practices

  • GAI was not used (or, no additional notation is required)
  • Code was generated entirely by GAI
  • GAI was used to create a draft that was subsequently customized or modified
  • Coder created a draft manually that was non-substantively modified by GAI (e.g., refactoring was performed by GAI on manually written code)
  • Tool used for AI assistance (GitHub Copilot / Other - specify)
    • Github Copilot
    • Other - Please Specify
  • This PR is related to
    • Feature
    • Defect fix
    • Tech Debt
    • Automation

I certified that

  • I have read and followed contributing guidelines
  • I discussed changes with code owners prior to submitting this pull request
  • I have not skipped any automated checks
  • All existing and new tests passed
  • I have updated the documentation accordingly

Make sure to have followed the contributing guidelines before submitting.

@akulakum akulakum requested a review from a team as a code owner October 7, 2025 14:24
@akulakum akulakum added the validated If the pull request is validated for automation. label Oct 7, 2025
Copy link

This pull request is automatically being deployed by Amplify Hosting (learn more).

Access this pull request here: https://pr-4520.d3m3l2kee0btzx.amplifyapp.com

@rsarika rsarika force-pushed the MULTI_PARTY_CONFERENCE branch from ac80f34 to ce038aa Compare October 14, 2025 05:56
@bhabalan bhabalan changed the title fix(multy-party-conference): implement-multy-party-conference-feature fix(multi-party-conference): implement-multi-party-conference-feature Oct 14, 2025
@@ -1,5 +1,5 @@
// Globals
let webex;
let webex = undefined;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we have to do this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To fix the double initialization and browser call issue

Comment on lines +402 to +404
if (checkParticipantNotInInteraction(task, this.agentId)) {
if (
isParticipantInMainInteraction(task, this.agentId) ||
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't these functions negation of each other?

If checkParticipantNotInInteraction is true, isParticipantInMainInteraction should always be false

Is my understanding correct here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The first one is to check whether it is an interaction or not. The second one is whether it is in main interaction(mediaObj.mType === 'mainCall')

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exactly.

So, if the first one says that the participant is not in any interaction, they are definitely not in the main interaction. Right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a small difference of condition hasLeft in first method. This logic also we copied from Agent desktop.

@akulakum akulakum requested a review from mkesavan13 October 16, 2025 11:32
Copy link
Contributor

@mkesavan13 mkesavan13 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few more tiny comments and we are good to go

Comment on lines 45 to 48
const participantListElm = document.createElement('div');
participantListElm.id = 'participant-list';
participantListElm.style.cssText = 'margin-top:10px;padding:8px;border:1px solid #ccc;background:#f9f9f9;display:none;';
incomingDetailsElm.parentNode.appendChild(participantListElm);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems static again. There's no dynamic stuff here. Why not keep it in the HTML itself and just hide and show?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

Comment on lines +1030 to +1042
function isSecondaryAgent(task) {
const interaction = task.data.interaction;

return (
interaction.callProcessingDetails.relationshipType === 'consult' &&
interaction.callProcessingDetails.parentInteractionId &&
interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId
);
}

function isSecondaryEpDnAgent(task) {
return task.data.interaction.mediaType === 'telephony' && isSecondaryAgent(task);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the difference here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We copied the logic from Agent Desktop and there is an additional condition of telephony and it might be useful when we implement conference feature in digital channel.

return interaction?.state;
}

function getStatus(task, agentId) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we call it something more specific? getTaskStatus or perhaps getConferenceStatus?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

}),
consultInitiated: () => setControls({
'holdResumeElm': { hide: true, disable: false },
'muteElm': { hide: true || !isBrowser, disable: false },
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't this hide always be true?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adressed

Comment on lines +402 to +404
if (checkParticipantNotInInteraction(task, this.agentId)) {
if (
isParticipantInMainInteraction(task, this.agentId) ||
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exactly.

So, if the first one says that the participant is not in any interaction, they are definitely not in the main interaction. Right?

@akulakum akulakum requested a review from mkesavan13 October 17, 2025 10:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

validated If the pull request is validated for automation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants