@webex/contact-center 3.12.0-next.147 → 3.12.0-next.149

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 (82) hide show
  1. package/.sdd/manifest.json +4 -2
  2. package/ai-docs/CONTRACTS.md +2 -0
  3. package/dist/cc.js +3 -1
  4. package/dist/cc.js.map +1 -1
  5. package/dist/constants.js +10 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/index.js +9 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/metrics/constants.js +9 -0
  10. package/dist/metrics/constants.js.map +1 -1
  11. package/dist/services/ApiAiAssistant.js +87 -10
  12. package/dist/services/ApiAiAssistant.js.map +1 -1
  13. package/dist/services/config/types.js +10 -4
  14. package/dist/services/config/types.js.map +1 -1
  15. package/dist/services/core/types.js.map +1 -1
  16. package/dist/services/task/Task.js +202 -1
  17. package/dist/services/task/Task.js.map +1 -1
  18. package/dist/services/task/TaskFactory.js +4 -4
  19. package/dist/services/task/TaskFactory.js.map +1 -1
  20. package/dist/services/task/TaskManager.js +113 -26
  21. package/dist/services/task/TaskManager.js.map +1 -1
  22. package/dist/services/task/TaskUtils.js +11 -1
  23. package/dist/services/task/TaskUtils.js.map +1 -1
  24. package/dist/services/task/constants.js +11 -2
  25. package/dist/services/task/constants.js.map +1 -1
  26. package/dist/services/task/digital/Digital.js +2 -2
  27. package/dist/services/task/digital/Digital.js.map +1 -1
  28. package/dist/services/task/types.js +31 -0
  29. package/dist/services/task/types.js.map +1 -1
  30. package/dist/services/task/voice/Voice.js +2 -2
  31. package/dist/services/task/voice/Voice.js.map +1 -1
  32. package/dist/services/task/voice/WebRTC.js +2 -2
  33. package/dist/services/task/voice/WebRTC.js.map +1 -1
  34. package/dist/types/constants.d.ts +9 -0
  35. package/dist/types/index.d.ts +4 -5
  36. package/dist/types/metrics/constants.d.ts +8 -0
  37. package/dist/types/services/ApiAiAssistant.d.ts +4 -2
  38. package/dist/types/services/config/types.d.ts +17 -7
  39. package/dist/types/services/task/Task.d.ts +15 -4
  40. package/dist/types/services/task/TaskFactory.d.ts +3 -2
  41. package/dist/types/services/task/TaskUtils.d.ts +6 -0
  42. package/dist/types/services/task/constants.d.ts +9 -0
  43. package/dist/types/services/task/digital/Digital.d.ts +3 -2
  44. package/dist/types/services/task/types.d.ts +109 -1
  45. package/dist/types/services/task/voice/Voice.d.ts +3 -2
  46. package/dist/types/services/task/voice/WebRTC.d.ts +3 -2
  47. package/dist/types/types.d.ts +10 -4
  48. package/dist/types.js +8 -4
  49. package/dist/types.js.map +1 -1
  50. package/dist/webex.js +1 -1
  51. package/package.json +3 -3
  52. package/src/cc.ts +4 -0
  53. package/src/constants.ts +12 -0
  54. package/src/index.ts +10 -2
  55. package/src/metrics/ai-docs/metrics-spec.md +12 -4
  56. package/src/metrics/constants.ts +10 -0
  57. package/src/services/ApiAiAssistant.ts +120 -12
  58. package/src/services/config/types.ts +10 -4
  59. package/src/services/core/types.ts +31 -1
  60. package/src/services/task/Task.ts +308 -5
  61. package/src/services/task/TaskFactory.ts +26 -5
  62. package/src/services/task/TaskManager.ts +148 -29
  63. package/src/services/task/TaskUtils.ts +13 -0
  64. package/src/services/task/ai-docs/task-spec.md +30 -5
  65. package/src/services/task/constants.ts +10 -0
  66. package/src/services/task/digital/Digital.ts +8 -3
  67. package/src/services/task/types.ts +139 -0
  68. package/src/services/task/voice/Voice.ts +8 -3
  69. package/src/services/task/voice/WebRTC.ts +6 -3
  70. package/src/types.ts +10 -4
  71. package/test/unit/fixtures/aiSummaryTestUtils.ts +40 -0
  72. package/test/unit/spec/cc.ts +1314 -32
  73. package/test/unit/spec/index.ts +881 -0
  74. package/test/unit/spec/services/ApiAiAssistant.ts +122 -6
  75. package/test/unit/spec/services/core/WebexRequest.ts +5 -6
  76. package/test/unit/spec/services/task/Task.ts +1988 -10
  77. package/test/unit/spec/services/task/TaskFactory.ts +17 -0
  78. package/test/unit/spec/services/task/TaskManager.ts +2327 -180
  79. package/test/unit/spec/services/task/TaskUtils.ts +72 -0
  80. package/test/unit/spec/services/task/voice/Voice.ts +353 -18
  81. package/umd/contact-center.min.js +2 -2
  82. package/umd/contact-center.min.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_calling","require","_constants","_Utils","_types","_Voice","_interopRequireDefault","_MetricsManager","_constants2","_loggerProxy","e","__esModule","default","WebRTC","Voice","constructor","contact","webCallingService","data","callOptions","wrapupData","agentId","mergedCallOptions","voiceVariant","VOICE_VARIANT","WEBRTC","registerWebCallListeners","on","CALL_EVENT_KEYS","REMOTE_MEDIA","handleRemoteMedia","track","emit","TASK_EVENTS","TASK_MEDIA","unregisterWebCallListeners","off","accept","LoggerProxy","log","interactionId","module","method","metricsManager","timeEvent","METRIC_EVENT_NAMES","TASK_ACCEPT_SUCCESS","TASK_ACCEPT_FAILED","constraints","audio","localStream","navigator","mediaDevices","getUserMedia","audioTrack","getAudioTracks","localAudioStream","LocalMicrophoneStream","MediaStream","answerCall","trackEvent","taskId","MetricsManager","getCommonTrackingFieldForAQMResponse","Promise","resolve","error","toString","getCommonTrackingFieldForAQMResponseFailed","details","detailedError","getErrorDetails","CC_FILE","decline","TASK_DECLINE_SUCCESS","TASK_DECLINE_FAILED","declineCall","toggleMute","options","muteUnmuteCall","exports"],"sources":["WebRTC.ts"],"sourcesContent":["import {LocalMicrophoneStream, CALL_EVENT_KEYS} from '@webex/calling';\nimport {CC_FILE} from '../../../constants';\nimport {getErrorDetails} from '../../core/Utils';\nimport routingContact from '../contact';\nimport {\n TaskData,\n TaskResponse,\n TASK_EVENTS,\n IWebRTC,\n VoiceUIControlOptions,\n VOICE_VARIANT,\n TaskToggleMuteOptions,\n} from '../types';\nimport Voice from './Voice';\nimport WebCallingService from '../../WebCallingService';\nimport {WrapupData} from '../../config/types';\nimport MetricsManager from '../../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../../metrics/constants';\nimport LoggerProxy from '../../../logger-proxy';\n\nexport default class WebRTC extends Voice implements IWebRTC {\n private localAudioStream: LocalMicrophoneStream;\n private webCallingService: WebCallingService;\n\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n data: TaskData,\n callOptions?: VoiceUIControlOptions,\n wrapupData?: WrapupData,\n agentId?: string\n ) {\n const mergedCallOptions: VoiceUIControlOptions = {\n ...callOptions,\n voiceVariant: VOICE_VARIANT.WEBRTC,\n };\n\n super(contact, data, mergedCallOptions, wrapupData, agentId);\n this.webCallingService = webCallingService;\n this.registerWebCallListeners();\n }\n\n private registerWebCallListeners() {\n this.webCallingService.on(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleRemoteMedia);\n }\n\n private handleRemoteMedia = (track: MediaStreamTrack) => {\n this.emit(TASK_EVENTS.TASK_MEDIA, track);\n };\n\n /**\n * This method is used to unregister the web call listeners.\n * @returns void\n * @example\n * ```typescript\n * task.unregisterWebCallListeners();\n * ```\n */\n public unregisterWebCallListeners() {\n this.webCallingService.off(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleRemoteMedia);\n }\n\n /**\n * This is used for incoming task accept by agent.\n *\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.accept().then(()=>{}).catch(()=>{})\n * ```\n */\n public async accept(): Promise<TaskResponse> {\n LoggerProxy.log(`Accepting WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'accept',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS,\n METRIC_EVENT_NAMES.TASK_ACCEPT_FAILED,\n ]);\n\n const constraints = {audio: true};\n const localStream = await navigator.mediaDevices.getUserMedia(constraints);\n const audioTrack = localStream.getAudioTracks()[0];\n this.localAudioStream = new LocalMicrophoneStream(new MediaStream([audioTrack]));\n this.webCallingService.answerCall(this.localAudioStream, this.data.interactionId);\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS,\n {\n taskId: this.data.interactionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(this.data),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return Promise.resolve();\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_ACCEPT_FAILED,\n {\n taskId: this.data.interactionId,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n const {error: detailedError} = getErrorDetails(error, 'accept', CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * This is used for the incoming task decline by agent.\n *\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.decline().then(()=>{}).catch(()=>{})\n * ```\n */\n public async decline(): Promise<TaskResponse> {\n LoggerProxy.log(`Declining WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'decline',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.TASK_DECLINE_FAILED,\n ]);\n\n this.webCallingService.declineCall(this.data.interactionId);\n this.unregisterWebCallListeners();\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_DECLINE_SUCCESS,\n {taskId: this.data.interactionId},\n ['operational', 'behavioral']\n );\n\n return Promise.resolve();\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_DECLINE_FAILED,\n {\n taskId: this.data.interactionId,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral']\n );\n const {error: detailedError} = getErrorDetails(error, 'decline', CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * This is used for the placing the call in mute or unmute by the agent.\n *\n * @throws Error\n * @example\n * ```typescript\n * task.toggleMute().then(()=>{}).catch(()=>{})\n * ```\n */\n public async toggleMute(options?: TaskToggleMuteOptions) {\n if (options) {\n // parameter intentionally unused — WebRTC toggles from local stream state\n }\n LoggerProxy.log(`Toggling mute WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'toggleMute',\n });\n try {\n this.webCallingService.muteUnmuteCall(this.localAudioStream);\n\n return Promise.resolve();\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'mute', CC_FILE);\n throw detailedError;\n }\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEA,IAAAG,MAAA,GAAAH,OAAA;AASA,IAAAI,MAAA,GAAAC,sBAAA,CAAAL,OAAA;AAGA,IAAAM,eAAA,GAAAD,sBAAA,CAAAL,OAAA;AACA,IAAAO,WAAA,GAAAP,OAAA;AACA,IAAAQ,YAAA,GAAAH,sBAAA,CAAAL,OAAA;AAAgD,SAAAK,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjC,MAAMG,MAAM,SAASC,cAAK,CAAoB;EAI3DC,WAAWA,CACTC,OAA0C,EAC1CC,iBAAoC,EACpCC,IAAc,EACdC,WAAmC,EACnCC,UAAuB,EACvBC,OAAgB,EAChB;IACA,MAAMC,iBAAwC,GAAG;MAC/C,GAAGH,WAAW;MACdI,YAAY,EAAEC,oBAAa,CAACC;IAC9B,CAAC;IAED,KAAK,CAACT,OAAO,EAAEE,IAAI,EAAEI,iBAAiB,EAAEF,UAAU,EAAEC,OAAO,CAAC;IAC5D,IAAI,CAACJ,iBAAiB,GAAGA,iBAAiB;IAC1C,IAAI,CAACS,wBAAwB,CAAC,CAAC;EACjC;EAEQA,wBAAwBA,CAAA,EAAG;IACjC,IAAI,CAACT,iBAAiB,CAACU,EAAE,CAACC,wBAAe,CAACC,YAAY,EAAE,IAAI,CAACC,iBAAiB,CAAC;EACjF;EAEQA,iBAAiB,GAAIC,KAAuB,IAAK;IACvD,IAAI,CAACC,IAAI,CAACC,kBAAW,CAACC,UAAU,EAAEH,KAAK,CAAC;EAC1C,CAAC;;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACSI,0BAA0BA,CAAA,EAAG;IAClC,IAAI,CAAClB,iBAAiB,CAACmB,GAAG,CAACR,wBAAe,CAACC,YAAY,EAAE,IAAI,CAACC,iBAAiB,CAAC;EAClF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaO,MAAMA,CAAA,EAA0B;IAC3CC,oBAAW,CAACC,GAAG,CAAC,oCAAoC,IAAI,CAACrB,IAAI,CAACsB,aAAa,EAAE,EAAE;MAC7EC,MAAM,EAAE,QAAQ;MAChBC,MAAM,EAAE;IACV,CAAC,CAAC;IACF,IAAI;MACF,IAAI,CAACC,cAAc,CAACC,SAAS,CAAC,CAC5BC,8BAAkB,CAACC,mBAAmB,EACtCD,8BAAkB,CAACE,kBAAkB,CACtC,CAAC;MAEF,MAAMC,WAAW,GAAG;QAACC,KAAK,EAAE;MAAI,CAAC;MACjC,MAAMC,WAAW,GAAG,MAAMC,SAAS,CAACC,YAAY,CAACC,YAAY,CAACL,WAAW,CAAC;MAC1E,MAAMM,UAAU,GAAGJ,WAAW,CAACK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;MAClD,IAAI,CAACC,gBAAgB,GAAG,IAAIC,8BAAqB,CAAC,IAAIC,WAAW,CAAC,CAACJ,UAAU,CAAC,CAAC,CAAC;MAChF,IAAI,CAACrC,iBAAiB,CAAC0C,UAAU,CAAC,IAAI,CAACH,gBAAgB,EAAE,IAAI,CAACtC,IAAI,CAACsB,aAAa,CAAC;MAEjF,IAAI,CAACG,cAAc,CAACiB,UAAU,CAC5Bf,8BAAkB,CAACC,mBAAmB,EACtC;QACEe,MAAM,EAAE,IAAI,CAAC3C,IAAI,CAACsB,aAAa;QAC/B,GAAGsB,uBAAc,CAACC,oCAAoC,CAAC,IAAI,CAAC7C,IAAI;MAClE,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MAED,OAAO8C,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAI,CAACvB,cAAc,CAACiB,UAAU,CAC5Bf,8BAAkB,CAACE,kBAAkB,EACrC;QACEc,MAAM,EAAE,IAAI,CAAC3C,IAAI,CAACsB,aAAa;QAC/B0B,KAAK,EAAEA,KAAK,CAACC,QAAQ,CAAC,CAAC;QACvB,GAAGL,uBAAc,CAACM,0CAA0C,CACzDF,KAAK,CAASG,OAAO,IAAI,CAAC,CAC7B;MACF,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAC1C,CAAC;MACD,MAAM;QAACH,KAAK,EAAEI;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAACL,KAAK,EAAE,QAAQ,EAAEM,kBAAO,CAAC;MACxE,MAAMF,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaG,OAAOA,CAAA,EAA0B;IAC5CnC,oBAAW,CAACC,GAAG,CAAC,oCAAoC,IAAI,CAACrB,IAAI,CAACsB,aAAa,EAAE,EAAE;MAC7EC,MAAM,EAAE,QAAQ;MAChBC,MAAM,EAAE;IACV,CAAC,CAAC;IACF,IAAI;MACF,IAAI,CAACC,cAAc,CAACC,SAAS,CAAC,CAC5BC,8BAAkB,CAAC6B,oBAAoB,EACvC7B,8BAAkB,CAAC8B,mBAAmB,CACvC,CAAC;MAEF,IAAI,CAAC1D,iBAAiB,CAAC2D,WAAW,CAAC,IAAI,CAAC1D,IAAI,CAACsB,aAAa,CAAC;MAC3D,IAAI,CAACL,0BAA0B,CAAC,CAAC;MAEjC,IAAI,CAACQ,cAAc,CAACiB,UAAU,CAC5Bf,8BAAkB,CAAC6B,oBAAoB,EACvC;QAACb,MAAM,EAAE,IAAI,CAAC3C,IAAI,CAACsB;MAAa,CAAC,EACjC,CAAC,aAAa,EAAE,YAAY,CAC9B,CAAC;MAED,OAAOwB,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAI,CAACvB,cAAc,CAACiB,UAAU,CAC5Bf,8BAAkB,CAAC8B,mBAAmB,EACtC;QACEd,MAAM,EAAE,IAAI,CAAC3C,IAAI,CAACsB,aAAa;QAC/B0B,KAAK,EAAEA,KAAK,CAACC,QAAQ,CAAC,CAAC;QACvB,GAAGL,uBAAc,CAACM,0CAA0C,CACzDF,KAAK,CAASG,OAAO,IAAI,CAAC,CAC7B;MACF,CAAC,EACD,CAAC,aAAa,EAAE,YAAY,CAC9B,CAAC;MACD,MAAM;QAACH,KAAK,EAAEI;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAACL,KAAK,EAAE,SAAS,EAAEM,kBAAO,CAAC;MACzE,MAAMF,aAAa;IACrB;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaO,UAAUA,CAACC,OAA+B,EAAE;IACvD,IAAIA,OAAO,EAAE;MACX;IAAA;IAEFxC,oBAAW,CAACC,GAAG,CAAC,wCAAwC,IAAI,CAACrB,IAAI,CAACsB,aAAa,EAAE,EAAE;MACjFC,MAAM,EAAE,QAAQ;MAChBC,MAAM,EAAE;IACV,CAAC,CAAC;IACF,IAAI;MACF,IAAI,CAACzB,iBAAiB,CAAC8D,cAAc,CAAC,IAAI,CAACvB,gBAAgB,CAAC;MAE5D,OAAOQ,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAM;QAACA,KAAK,EAAEI;MAAa,CAAC,GAAG,IAAAC,sBAAe,EAACL,KAAK,EAAE,MAAM,EAAEM,kBAAO,CAAC;MACtE,MAAMF,aAAa;IACrB;EACF;AACF;AAACU,OAAA,CAAApE,OAAA,GAAAC,MAAA","ignoreList":[]}
1
+ {"version":3,"names":["_calling","require","_constants","_Utils","_types","_Voice","_interopRequireDefault","_MetricsManager","_constants2","_loggerProxy","e","__esModule","default","WebRTC","Voice","constructor","contact","webCallingService","data","callOptions","wrapupData","agentId","agentName","apiAIAssistant","mergedCallOptions","voiceVariant","VOICE_VARIANT","WEBRTC","registerWebCallListeners","on","CALL_EVENT_KEYS","REMOTE_MEDIA","handleRemoteMedia","track","emit","TASK_EVENTS","TASK_MEDIA","unregisterWebCallListeners","off","accept","LoggerProxy","log","interactionId","module","method","metricsManager","timeEvent","METRIC_EVENT_NAMES","TASK_ACCEPT_SUCCESS","TASK_ACCEPT_FAILED","constraints","audio","localStream","navigator","mediaDevices","getUserMedia","audioTrack","getAudioTracks","localAudioStream","LocalMicrophoneStream","MediaStream","answerCall","trackEvent","taskId","MetricsManager","getCommonTrackingFieldForAQMResponse","Promise","resolve","error","toString","getCommonTrackingFieldForAQMResponseFailed","details","detailedError","getErrorDetails","CC_FILE","decline","TASK_DECLINE_SUCCESS","TASK_DECLINE_FAILED","declineCall","toggleMute","options","muteUnmuteCall","exports"],"sources":["WebRTC.ts"],"sourcesContent":["import {LocalMicrophoneStream, CALL_EVENT_KEYS} from '@webex/calling';\nimport {CC_FILE} from '../../../constants';\nimport {getErrorDetails} from '../../core/Utils';\nimport routingContact from '../contact';\nimport {\n TaskData,\n TaskResponse,\n TASK_EVENTS,\n IWebRTC,\n VoiceUIControlOptions,\n VOICE_VARIANT,\n TaskToggleMuteOptions,\n} from '../types';\nimport Voice from './Voice';\nimport WebCallingService from '../../WebCallingService';\nimport type {WrapupData} from '../../config/types';\nimport type ApiAIAssistant from '../../ApiAiAssistant';\nimport MetricsManager from '../../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../../metrics/constants';\nimport LoggerProxy from '../../../logger-proxy';\n\nexport default class WebRTC extends Voice implements IWebRTC {\n private localAudioStream: LocalMicrophoneStream;\n private webCallingService: WebCallingService;\n\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n data: TaskData,\n callOptions?: VoiceUIControlOptions,\n wrapupData?: WrapupData,\n agentId?: string,\n agentName?: string,\n apiAIAssistant?: ApiAIAssistant\n ) {\n const mergedCallOptions: VoiceUIControlOptions = {\n ...callOptions,\n voiceVariant: VOICE_VARIANT.WEBRTC,\n };\n\n super(contact, data, mergedCallOptions, wrapupData, agentId, agentName, apiAIAssistant);\n this.webCallingService = webCallingService;\n this.registerWebCallListeners();\n }\n\n private registerWebCallListeners() {\n this.webCallingService.on(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleRemoteMedia);\n }\n\n private handleRemoteMedia = (track: MediaStreamTrack) => {\n this.emit(TASK_EVENTS.TASK_MEDIA, track);\n };\n\n /**\n * This method is used to unregister the web call listeners.\n * @returns void\n * @example\n * ```typescript\n * task.unregisterWebCallListeners();\n * ```\n */\n public unregisterWebCallListeners() {\n this.webCallingService.off(CALL_EVENT_KEYS.REMOTE_MEDIA, this.handleRemoteMedia);\n }\n\n /**\n * This is used for incoming task accept by agent.\n *\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.accept().then(()=>{}).catch(()=>{})\n * ```\n */\n public async accept(): Promise<TaskResponse> {\n LoggerProxy.log(`Accepting WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'accept',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS,\n METRIC_EVENT_NAMES.TASK_ACCEPT_FAILED,\n ]);\n\n const constraints = {audio: true};\n const localStream = await navigator.mediaDevices.getUserMedia(constraints);\n const audioTrack = localStream.getAudioTracks()[0];\n this.localAudioStream = new LocalMicrophoneStream(new MediaStream([audioTrack]));\n this.webCallingService.answerCall(this.localAudioStream, this.data.interactionId);\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_ACCEPT_SUCCESS,\n {\n taskId: this.data.interactionId,\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(this.data),\n },\n ['operational', 'behavioral', 'business']\n );\n\n return Promise.resolve();\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_ACCEPT_FAILED,\n {\n taskId: this.data.interactionId,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral', 'business']\n );\n const {error: detailedError} = getErrorDetails(error, 'accept', CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * This is used for the incoming task decline by agent.\n *\n * @returns Promise<TaskResponse>\n * @throws Error\n * @example\n * ```typescript\n * task.decline().then(()=>{}).catch(()=>{})\n * ```\n */\n public async decline(): Promise<TaskResponse> {\n LoggerProxy.log(`Declining WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'decline',\n });\n try {\n this.metricsManager.timeEvent([\n METRIC_EVENT_NAMES.TASK_DECLINE_SUCCESS,\n METRIC_EVENT_NAMES.TASK_DECLINE_FAILED,\n ]);\n\n this.webCallingService.declineCall(this.data.interactionId);\n this.unregisterWebCallListeners();\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_DECLINE_SUCCESS,\n {taskId: this.data.interactionId},\n ['operational', 'behavioral']\n );\n\n return Promise.resolve();\n } catch (error) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_DECLINE_FAILED,\n {\n taskId: this.data.interactionId,\n error: error.toString(),\n ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(\n (error as any).details || {}\n ),\n },\n ['operational', 'behavioral']\n );\n const {error: detailedError} = getErrorDetails(error, 'decline', CC_FILE);\n throw detailedError;\n }\n }\n\n /**\n * This is used for the placing the call in mute or unmute by the agent.\n *\n * @throws Error\n * @example\n * ```typescript\n * task.toggleMute().then(()=>{}).catch(()=>{})\n * ```\n */\n public async toggleMute(options?: TaskToggleMuteOptions) {\n if (options) {\n // parameter intentionally unused — WebRTC toggles from local stream state\n }\n LoggerProxy.log(`Toggling mute WebRTC task for taskId:${this.data.interactionId}`, {\n module: 'WebRTC',\n method: 'toggleMute',\n });\n try {\n this.webCallingService.muteUnmuteCall(this.localAudioStream);\n\n return Promise.resolve();\n } catch (error) {\n const {error: detailedError} = getErrorDetails(error, 'mute', CC_FILE);\n throw detailedError;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -76,3 +76,12 @@ export declare const METHODS: {
76
76
  GET_CALL_DETAILS_ON_WEBEX: string;
77
77
  ENSURE_WXAPP_MERCURY_CONNECTED: string;
78
78
  };
79
+ export declare const AI_SUMMARY_ERROR_CODES: {
80
+ readonly POST_CALL_SUMMARY_DISABLED: "POST_CALL_SUMMARY_DISABLED";
81
+ readonly MID_CALL_SUMMARY_DISABLED: "MID_CALL_SUMMARY_DISABLED";
82
+ readonly AI_ASSISTANT_BASE_URL_NOT_AVAILABLE: "AI_ASSISTANT_BASE_URL_NOT_AVAILABLE";
83
+ readonly POST_CALL_SUMMARY_TIMEOUT: "POST_CALL_SUMMARY_TIMEOUT";
84
+ readonly MID_CALL_SUMMARY_TIMEOUT: "MID_CALL_SUMMARY_TIMEOUT";
85
+ };
86
+ export declare const AI_SUMMARY_INVALID_RESPONSE_PAYLOAD = "AI_SUMMARY_INVALID_RESPONSE_PAYLOAD";
87
+ export declare const AI_ASSISTANT_CLIENT_TYPE: "WxCC";
@@ -1,9 +1,7 @@
1
1
  import ContactCenter from './cc';
2
2
  /**
3
3
  * @module ContactCenterModule
4
- * /
5
-
6
- // Core exports
4
+ */
7
5
  /**
8
6
  * ContactCenter is the main plugin class for Webex Contact Center integration
9
7
  * @category Core
@@ -21,6 +19,7 @@ export { default as routingAgent } from './services/agent';
21
19
  export { default as Task } from './services/task/Task';
22
20
  export { default as AddressBook } from './services/AddressBook';
23
21
  export { default as ApiAIAssistant } from './services/ApiAiAssistant';
22
+ export { AI_SUMMARY_ERROR_CODES } from './constants';
24
23
  export { default as UserPreference } from './services/UserPreference';
25
24
  /** Agent Wellness Break notification and action wire values. */
26
25
  export { WELLNESS_BREAK_NOTIFICATION_ACTIONS, WELLNESS_BREAK_USER_ACTIONS } from './types';
@@ -41,7 +40,7 @@ export type { TASK_EVENTS as TaskEvents } from './services/task/types';
41
40
  export { AGENT_EVENTS } from './services/agent/types';
42
41
  export type { AGENT_EVENTS as AgentEvents } from './services/agent/types';
43
42
  /**
44
- * Contact Center Task Events
43
+ * Contact Center task, realtime, and AI Assistant events
45
44
  * @enum {string}
46
45
  * @category Enums
47
46
  */
@@ -114,7 +113,7 @@ DropConferenceParticipantPayload, ConsultPayload, ConsultEndPayload, ConsultTran
114
113
  /** Dialer payload */
115
114
  DialerPayload, TransferPayLoad, ResumeRecordingPayload, WrapupPayLoad,
116
115
  /** UI control types for task buttons */
117
- InteractionUIControls, TaskUILeg, TaskUIControls, TaskUIControlState, } from './services/task/types';
116
+ InteractionUIControls, TaskUILeg, TaskUIControls, TaskUIControlState, AISummaryAction, AISummaryFeedback, AISummaryState, AISummarySections, AISummary, AISummaryFeatureEnablement, AISummaryResponse, } from './services/task/types';
118
117
  /** UI controls utilities */
119
118
  export { getDefaultUIControls } from './services/task/state-machine/uiControlsComputer';
120
119
  /** Agent related types */
@@ -180,6 +180,14 @@ export declare const METRIC_EVENT_NAMES: {
180
180
  readonly AI_ASSISTANT_WELLNESS_EVENT_INVALID: "AI Assistant Wellness Event Invalid";
181
181
  readonly WELLBEING_BREAK_IDLE_CODE_FETCH_SUCCESS: "Wellbeing Break Idle Code Fetch Success";
182
182
  readonly WELLBEING_BREAK_IDLE_CODE_FETCH_FAILED: "Wellbeing Break Idle Code Fetch Failed";
183
+ readonly AI_SUMMARY_GET_POST_CALL_SUCCESS: "Post Call Summary Get Success";
184
+ readonly AI_SUMMARY_GET_POST_CALL_FAILED: "Post Call Summary Get Failed";
185
+ readonly AI_SUMMARY_GET_MID_CALL_SUCCESS: "Mid Call Summary Get Success";
186
+ readonly AI_SUMMARY_GET_MID_CALL_FAILED: "Mid Call Summary Get Failed";
187
+ readonly AI_SUMMARY_POST_CALL_RESPONSE_SUCCESS: "Post Call Summary Response Success";
188
+ readonly AI_SUMMARY_POST_CALL_RESPONSE_FAILED: "Post Call Summary Response Failed";
189
+ readonly AI_SUMMARY_MID_CALL_RESPONSE_SUCCESS: "Mid Call Summary Response Success";
190
+ readonly AI_SUMMARY_MID_CALL_RESPONSE_FAILED: "Mid Call Summary Response Failed";
183
191
  readonly USER_PREFERENCE_GET_SUCCESS: "User Preference Get Success";
184
192
  readonly USER_PREFERENCE_GET_FAILED: "User Preference Get Failed";
185
193
  readonly USER_PREFERENCE_CREATE_SUCCESS: "User Preference Create Success";
@@ -12,7 +12,7 @@ type WellnessBreakContextProvider = () => {
12
12
  export declare class ApiAIAssistant {
13
13
  private webex;
14
14
  private metricsManager;
15
- private aiFeature;
15
+ private pendingRtdRequests;
16
16
  private readonly wellnessContextProvider?;
17
17
  private createWellnessError;
18
18
  constructor(webex: WebexSDK, wellnessContextProvider?: WellnessBreakContextProvider);
@@ -44,6 +44,8 @@ export declare class ApiAIAssistant {
44
44
  */
45
45
  respondToWellnessBreak(params: RespondToWellnessBreakParams): Promise<void>;
46
46
  private getBaseUrl;
47
+ private static getRtdRequestKey;
48
+ private removeRtdRequest;
47
49
  /**
48
50
  * Sends an event to the AI Assistant service.
49
51
  * @param agentId - agent identifier
@@ -54,7 +56,7 @@ export declare class ApiAIAssistant {
54
56
  * @param languageCode - language code within eventDetails.data
55
57
  * @param trackingId - tracking identifier within eventDetails.data
56
58
  */
57
- sendEvent(agentId: string, interactionId: string, eventType: AIAssistantEventType, eventName: AIAssistantEventName, eventMetaData?: Record<string, unknown>, languageCode?: string, trackingId?: string): Promise<Record<string, unknown>>;
59
+ sendEvent(agentId: string, interactionId: string, eventType: AIAssistantEventType, eventName: AIAssistantEventName, eventMetaData?: Record<string, unknown>, languageCode?: string, trackingId?: string, publishTimestamp?: number, timeout?: number): Promise<Record<string, unknown>>;
58
60
  /**
59
61
  * Requests real-time assistance for an interaction.
60
62
  *
@@ -3,7 +3,9 @@ import { COLLABORATION_ACCESS } from './constants';
3
3
  /** Desktop Profile access level for a collaboration destination category. */
4
4
  export type CollaborationAccess = Enum<typeof COLLABORATION_ACCESS>;
5
5
  /**
6
- * Events emitted on task objects
6
+ * Contact Center backend and realtime event types.
7
+ *
8
+ * Includes task lifecycle, transcript, suggested-response, and AI summary events.
7
9
  * @enum {string}
8
10
  * @private
9
11
  * @ignore
@@ -133,10 +135,14 @@ export declare const CC_TASK_EVENTS: {
133
135
  readonly SUGGESTED_RESPONSE: "SUGGESTED_RESPONSE";
134
136
  /** Event emitted when backend acknowledges it is listening for more context */
135
137
  readonly SUGGESTED_RESPONSE_ACKNOWLEDGE: "SUGGESTED_RESPONSE_ACKNOWLEDGE";
136
- /** Event emitted when a mid-call summary is available */
137
- readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
138
- /** Event emitted when a post-call summary is available */
138
+ /** Event received when a post-call summary is available through realtime delivery */
139
139
  readonly POST_CALL_SUMMARY: "POST_CALL_SUMMARY";
140
+ /** Event received when a mid-call summary is available through realtime delivery */
141
+ readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
142
+ /** Event received when AI-summary feature enablement is available through realtime delivery */
143
+ readonly FEATURE_ENABLEMENT: "FEATURE_ENABLEMENT";
144
+ /** Event received when a subsequent agent receives a mid-call summary */
145
+ readonly MID_CALL_SUMMARY_RESPONSE_SUBSEQUENT_AGENT: "MID_CALL_SUMMARY_RESPONSE_SUBSEQUENT_AGENT";
140
146
  };
141
147
  /**
142
148
  * Events emitted on Contact Center agent operations
@@ -313,10 +319,14 @@ export declare const CC_EVENTS: {
313
319
  readonly SUGGESTED_RESPONSE: "SUGGESTED_RESPONSE";
314
320
  /** Event emitted when backend acknowledges it is listening for more context */
315
321
  readonly SUGGESTED_RESPONSE_ACKNOWLEDGE: "SUGGESTED_RESPONSE_ACKNOWLEDGE";
316
- /** Event emitted when a mid-call summary is available */
317
- readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
318
- /** Event emitted when a post-call summary is available */
322
+ /** Event received when a post-call summary is available through realtime delivery */
319
323
  readonly POST_CALL_SUMMARY: "POST_CALL_SUMMARY";
324
+ /** Event received when a mid-call summary is available through realtime delivery */
325
+ readonly MID_CALL_SUMMARY: "MID_CALL_SUMMARY";
326
+ /** Event received when AI-summary feature enablement is available through realtime delivery */
327
+ readonly FEATURE_ENABLEMENT: "FEATURE_ENABLEMENT";
328
+ /** Event received when a subsequent agent receives a mid-call summary */
329
+ readonly MID_CALL_SUMMARY_RESPONSE_SUBSEQUENT_AGENT: "MID_CALL_SUMMARY_RESPONSE_SUBSEQUENT_AGENT";
320
330
  /** Welcome event when agent connects to websocket/backend */
321
331
  readonly WELCOME: "Welcome";
322
332
  /** Event emitted when agent re-login is successful */
@@ -1,13 +1,14 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from 'events';
3
3
  import type { ActorRefFrom, SnapshotFrom } from 'xstate';
4
- import { ITask, TaskData, TaskResponse, WrapupPayLoad, TaskId, TransferPayLoad, TASK_EVENTS, TaskUIControls, DropConferenceParticipantPayload, ConsultEndPayload, ConsultPayload, ConsultTransferPayLoad, ResumeRecordingPayload, CallId, TaskToggleMuteOptions, TaskTransmitDtmfOptions } from './types';
4
+ import { ITask, TaskData, TaskResponse, WrapupPayLoad, TaskId, TransferPayLoad, TASK_EVENTS, TaskUIControls, DropConferenceParticipantPayload, ConsultEndPayload, ConsultPayload, ConsultTransferPayLoad, ResumeRecordingPayload, CallId, AISummaryAction, AISummary, AISummaryResponse, AISummaryFeatureEnablement, AISummaryCapabilities, TaskToggleMuteOptions, TaskTransmitDtmfOptions } from './types';
5
5
  import routingContact from './contact';
6
6
  import MetricsManager from '../../metrics/MetricsManager';
7
7
  import { TaskState } from './state-machine';
8
8
  import type { TaskEventPayload, TaskStateMachine, UIControlConfig, TaskActionsMap, TaskActionArgs } from './state-machine';
9
9
  import AutoWrapup from './AutoWrapup';
10
- import { WrapupData } from '../config/types';
10
+ import type { WrapupData } from '../config/types';
11
+ import type ApiAIAssistant from '../ApiAiAssistant';
11
12
  type UIControlConfigInput = Omit<UIControlConfig, 'channelType'> & {
12
13
  channelType?: UIControlConfig['channelType'];
13
14
  };
@@ -24,7 +25,10 @@ export default abstract class Task extends EventEmitter implements ITask {
24
25
  protected wrapupData?: WrapupData;
25
26
  autoWrapup?: AutoWrapup;
26
27
  protected agentId?: string;
27
- constructor(contact: ReturnType<typeof routingContact>, data: TaskData, uiControlConfig: UIControlConfigInput, wrapupData?: WrapupData, agentId?: string);
28
+ protected agentName?: string;
29
+ private apiAIAssistant?;
30
+ aiSummaryCapabilities: Readonly<AISummaryCapabilities>;
31
+ constructor(contact: ReturnType<typeof routingContact>, data: TaskData, uiControlConfig: UIControlConfigInput, wrapupData?: WrapupData, agentId?: string, agentName?: string, apiAIAssistant?: ApiAIAssistant);
28
32
  private static resolveChannelType;
29
33
  abstract accept(): Promise<TaskResponse>;
30
34
  decline(): Promise<TaskResponse>;
@@ -49,6 +53,13 @@ export default abstract class Task extends EventEmitter implements ITask {
49
53
  hold(): Promise<TaskResponse>;
50
54
  resume(): Promise<TaskResponse>;
51
55
  holdResume(): Promise<TaskResponse>;
56
+ setFeatureEnablement(enablement: AISummaryFeatureEnablement): void;
57
+ clearFeatureEnablement(): void;
58
+ requestPostCallSummary(): Promise<AISummary>;
59
+ sendPostCallSummaryResponse(response: AISummaryResponse): Promise<void>;
60
+ requestMidCallSummary(action: AISummaryAction): Promise<AISummary>;
61
+ sendMidCallSummaryResponse(response: AISummaryResponse, action: AISummaryAction): Promise<void>;
62
+ private static getAISummaryFailureCode;
52
63
  /**
53
64
  * Latest UI controls derived from state machine state and context.
54
65
  */
@@ -114,7 +125,7 @@ export default abstract class Task extends EventEmitter implements ITask {
114
125
  * @param methodName - The name of the method that is unsupported
115
126
  * @throws Error
116
127
  */
117
- protected unsupportedMethodError(methodName: string): void;
128
+ protected unsupportedMethodError(methodName: string): never;
118
129
  /**
119
130
  * This method is used to update the task data.
120
131
  * @param updatedData - TaskData
@@ -4,10 +4,11 @@ import AnswerCallOnWebexService from '../AnswerCallOnWebexService';
4
4
  import Task from './Task';
5
5
  import { TaskData } from './types';
6
6
  import { ConfigFlags } from '../../types';
7
- import { WrapupData } from '../config/types';
7
+ import type { WrapupData } from '../config/types';
8
+ import type ApiAIAssistant from '../ApiAiAssistant';
8
9
  export default class TaskFactory {
9
10
  /**
10
11
  * Creates the correct Task subclass based on mediaType & loginOption
11
12
  */
12
- static createTask(contact: ReturnType<typeof routingContact>, webCallingService: WebCallingService, data: TaskData, configFlags: ConfigFlags, wrapupData?: WrapupData, agentId?: string, answerCallOnWebexService?: AnswerCallOnWebexService): Task;
13
+ static createTask(contact: ReturnType<typeof routingContact>, webCallingService: WebCallingService, data: TaskData, configFlags: ConfigFlags, wrapupData?: WrapupData, agentId?: string, agentName?: string, answerCallOnWebexService?: AnswerCallOnWebexService, apiAIAssistant?: ApiAIAssistant): Task;
13
14
  }
@@ -1,5 +1,10 @@
1
1
  import { Interaction, ITask, TaskData } from './types';
2
2
  import { TaskContext } from './state-machine/types';
3
+ type AISummaryError = Error & {
4
+ data?: Record<string, unknown>;
5
+ };
6
+ export declare const isNonEmptyString: (value: unknown) => value is string;
7
+ export declare const createSummaryError: (errorCode: string) => AISummaryError;
3
8
  /**
4
9
  * Checks if the customer is still in the call (not left)
5
10
  *
@@ -136,3 +141,4 @@ export declare const getConsultMediaResourceId: (interaction: Interaction | unde
136
141
  * @returns true if the task is a pending campaign preview reservation, false otherwise
137
142
  */
138
143
  export declare const isCampaignPreviewReservation: (task: ITask) => boolean;
144
+ export {};
@@ -27,6 +27,9 @@ export declare const CAMPAIGN_PREVIEW_SKIP = "/skip";
27
27
  export declare const CAMPAIGN_PREVIEW_REMOVE = "/remove";
28
28
  /** 80-second timeout for accepting preview contact (outbound call setup takes longer than default 20s) */
29
29
  export declare const TIMEOUT_PREVIEW_ACCEPT = 80000;
30
+ /** RTD result deadline; the initiating HTTP acknowledgement uses the 20-second service timeout. */
31
+ export declare const AI_SUMMARY_DURATION_MS = 15000;
32
+ export declare const AI_SUMMARY_REQUEST_CANCELLED: "AI_SUMMARY_REQUEST_CANCELLED";
30
33
  export declare const TASK_MANAGER_FILE = "taskManager";
31
34
  export declare const TASK_FILE = "task";
32
35
  /**
@@ -83,6 +86,12 @@ export declare const METHODS: {
83
86
  SETUP_AUTO_WRAPUP_TIMER: string;
84
87
  CANCEL_AUTO_WRAPUP_TIMER: string;
85
88
  REQUEST_REAL_TIME_TRANSCRIPTS: string;
89
+ REQUEST_POST_CALL_SUMMARY: string;
90
+ SEND_POST_CALL_SUMMARY_RESPONSE: string;
91
+ REQUEST_MID_CALL_SUMMARY: string;
92
+ SEND_MID_CALL_SUMMARY_RESPONSE: string;
93
+ HANDLE_AI_SUMMARY_EVENT: string;
94
+ CLEAR_AI_SUMMARY_STATE: string;
86
95
  };
87
96
  export declare const TRANSCRIPT_EVENT_MAP: {
88
97
  AgentContactAssigned: string;
@@ -1,9 +1,10 @@
1
1
  import { ConsultTransferDestinationConfig, IDigital, TaskResponse, TaskData } from '../types';
2
- import { WrapupData } from '../../config/types';
2
+ import type { WrapupData } from '../../config/types';
3
+ import type ApiAIAssistant from '../../ApiAiAssistant';
3
4
  import Task from '../Task';
4
5
  import routingContact from '../contact';
5
6
  export default class Digital extends Task implements IDigital {
6
- constructor(contact: ReturnType<typeof routingContact>, data: TaskData, wrapupData?: WrapupData, agentId?: string, consultTransferConfig?: ConsultTransferDestinationConfig);
7
+ constructor(contact: ReturnType<typeof routingContact>, data: TaskData, wrapupData?: WrapupData, agentId?: string, consultTransferConfig?: ConsultTransferDestinationConfig, agentName?: string, apiAIAssistant?: ApiAIAssistant);
7
8
  /**
8
9
  * Refresh the digital task with the latest backend payload and recompute UI controls.
9
10
  */
@@ -627,7 +627,26 @@ export declare enum TASK_EVENTS {
627
627
  * });
628
628
  * ```
629
629
  */
630
- TASK_CAMPAIGN_CONTACT_UPDATED = "task:campaignContactUpdated"
630
+ TASK_CAMPAIGN_CONTACT_UPDATED = "task:campaignContactUpdated",
631
+ /**
632
+ * Triggered when a mid-call summary is received for the task.
633
+ */
634
+ TASK_MID_CALL_SUMMARY_RECEIVED = "task:midCallSummaryReceived",
635
+ /**
636
+ * Triggered on the task object when AI feature enablement flags arrive for that task's interaction.
637
+ * Fires immediately if the frame arrived after the task was registered, or at registration time
638
+ * if the frame arrived before the task (orphan retention). Consumers should use this event
639
+ * instead of the cc-level `FEATURE_ENABLEMENT` event so they do not need to maintain an
640
+ * interactionId → flags map manually.
641
+ * @example
642
+ * ```typescript
643
+ * task.on(TASK_EVENTS.TASK_FEATURE_ENABLEMENT, (enablement: AISummaryFeatureEnablement) => {
644
+ * const { midCallEnabled, postCallEnabled } = enablement;
645
+ * // gate summary UI on these flags
646
+ * });
647
+ * ```
648
+ */
649
+ TASK_FEATURE_ENABLEMENT = "task:featureEnablement"
631
650
  }
632
651
  /**
633
652
  * Represents a customer interaction within the contact center system
@@ -1516,6 +1535,66 @@ export type ParticipantBooleanKey = 'autoAnswerEnabled' | 'hasJoined' | 'hasLeft
1516
1535
  * @public
1517
1536
  */
1518
1537
  export type TaskResponse = AgentContact | Error | void;
1538
+ /** AI-assisted mid-call summary action. @public */
1539
+ export type AISummaryAction = 'CONSULT' | 'TRANSFER';
1540
+ /** Feedback value sent with an AI summary response. @public */
1541
+ export type AISummaryFeedback = 'none' | 'thumbs_up' | 'thumbs_down';
1542
+ /** AI summary response state for post-call and mid-call flows. @public */
1543
+ export type AISummaryState = 'DEFAULT' | 'EXCLUDED' | 'IGNORED' | 'MID_CALL_CANCELLED' | 'NOT_RECEIVED';
1544
+ /** Structured fields shared by post-call and mid-call summaries. @public */
1545
+ export type AISummarySections = {
1546
+ initialContactReason?: string;
1547
+ additionalContactReasons?: string;
1548
+ additionalContext?: string;
1549
+ keyActionsTaken?: string;
1550
+ nextSteps?: string;
1551
+ reasonForTransferOrConsult?: string;
1552
+ };
1553
+ /** RTD payload returned or delivered for an AI summary. @public */
1554
+ export type AISummary = {
1555
+ conversationId: string;
1556
+ adaptiveCard?: Record<string, unknown>;
1557
+ adaptiveCardId?: string;
1558
+ editAdaptiveCard?: Record<string, unknown>;
1559
+ editAdaptiveCardId?: string;
1560
+ areTranscriptsAvailable?: boolean;
1561
+ languageCode?: string;
1562
+ resolution?: string;
1563
+ sections?: AISummarySections;
1564
+ suggestedWrapUpCodes?: Array<{
1565
+ name: string;
1566
+ [key: string]: unknown;
1567
+ }>;
1568
+ suggestedWrapUpCodesMessage?: string;
1569
+ summaryText?: string;
1570
+ timestamp?: number;
1571
+ [key: string]: unknown;
1572
+ };
1573
+ /** RTD payload describing AI-summary feature enablement for an interaction. @public */
1574
+ export type AISummaryFeatureEnablement = {
1575
+ interactionId: string;
1576
+ midCallEnabled?: boolean;
1577
+ postCallEnabled?: boolean;
1578
+ actionTimestamp?: number;
1579
+ [key: string]: unknown;
1580
+ };
1581
+ /** Current AI-summary capabilities for a task. @public */
1582
+ export type AISummaryCapabilities = Required<Pick<AISummaryFeatureEnablement, 'midCallEnabled' | 'postCallEnabled'>>;
1583
+ /**
1584
+ * Payload sent when reporting a post-call or mid-call summary result.
1585
+ * Transport timestamps are generated by the SDK when the response is sent.
1586
+ * @public
1587
+ */
1588
+ export type AISummaryResponse = {
1589
+ summary: AISummarySections | string;
1590
+ feedback: AISummaryFeedback;
1591
+ state: AISummaryState;
1592
+ numberOfTimesViewed: number;
1593
+ numberOfTimesEdited: number;
1594
+ numberOfTimesCopied: number;
1595
+ summaryReceived?: boolean;
1596
+ wrapUpCode?: string;
1597
+ };
1519
1598
  /**
1520
1599
  * Request payload for removing a supported participant from an active conference.
1521
1600
  * @public
@@ -1556,6 +1635,11 @@ export interface ITask extends IEventEmitter {
1556
1635
  * and participant data as defined in {@link TaskData}
1557
1636
  */
1558
1637
  data: TaskData;
1638
+ /**
1639
+ * Current AI-summary capabilities for this task. Both flags are false until
1640
+ * the matching feature-enablement event is received.
1641
+ */
1642
+ readonly aiSummaryCapabilities: Readonly<AISummaryCapabilities>;
1559
1643
  /**
1560
1644
  * Map associating tasks with their corresponding call identifiers.
1561
1645
  */
@@ -1588,6 +1672,30 @@ export interface ITask extends IEventEmitter {
1588
1672
  * @returns void
1589
1673
  */
1590
1674
  cancelAutoWrapupTimer(): void;
1675
+ /**
1676
+ * Requests an AI-generated post-call summary for this task.
1677
+ * @returns Promise resolving with the matching post-call summary payload.
1678
+ */
1679
+ requestPostCallSummary(): Promise<AISummary>;
1680
+ /**
1681
+ * Sends the consumer's post-call summary response.
1682
+ * @param response - Validated post-call response observations and summary state.
1683
+ * @returns Promise resolving when AI Assistant acknowledges the response.
1684
+ */
1685
+ sendPostCallSummaryResponse(response: AISummaryResponse): Promise<void>;
1686
+ /**
1687
+ * Requests an AI-generated mid-call summary for a consult or transfer flow.
1688
+ * @param action - The consult or transfer flow requesting the summary.
1689
+ * @returns Promise resolving with the matching mid-call summary payload.
1690
+ */
1691
+ requestMidCallSummary(action: AISummaryAction): Promise<AISummary>;
1692
+ /**
1693
+ * Sends the consumer's mid-call summary response for a consult or transfer flow.
1694
+ * @param response - Validated mid-call response observations and summary state.
1695
+ * @param action - The consult or transfer flow responding to the summary.
1696
+ * @returns Promise resolving when AI Assistant acknowledges the response.
1697
+ */
1698
+ sendMidCallSummaryResponse(response: AISummaryResponse, action: AISummaryAction): Promise<void>;
1591
1699
  /**
1592
1700
  * Deregisters all web call event listeners.
1593
1701
  * Used when cleaning up task resources.
@@ -2,7 +2,8 @@ import routingContact from '../contact';
2
2
  import { ConsultPayload, ConsultEndPayload, ResumeRecordingPayload, TaskData, TaskResponse, DropConferenceParticipantPayload, IVoice, VoiceUIControlOptions, TaskToggleMuteOptions, TaskTransmitDtmfOptions, TransferPayLoad } from '../types';
3
3
  import Task from '../Task';
4
4
  import { TaskActionArgs } from '../state-machine';
5
- import { WrapupData } from '../../config/types';
5
+ import type { WrapupData } from '../../config/types';
6
+ import type ApiAIAssistant from '../../ApiAiAssistant';
6
7
  export default class Voice extends Task implements IVoice {
7
8
  private static readonly WXAPP_MUTE_SYNC_RETRY_DELAY_MS;
8
9
  private static readonly WXAPP_MUTE_SYNC_MAX_RETRIES;
@@ -17,7 +18,7 @@ export default class Voice extends Task implements IVoice {
17
18
  /** Lazy — `super()` may call `updateUiControls` before field initializers run. */
18
19
  private wxAppOfferObservability;
19
20
  private getUsersubPublished?;
20
- constructor(contact: ReturnType<typeof routingContact>, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string);
21
+ constructor(contact: ReturnType<typeof routingContact>, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string, agentName?: string, apiAIAssistant?: ApiAIAssistant);
21
22
  private getWxAppVoiceDependencies;
22
23
  /** @deprecated Use {@link Voice.getWxAppVoiceDependencies} */
23
24
  private getWxAppVoiceDeps;
@@ -2,11 +2,12 @@ import routingContact from '../contact';
2
2
  import { TaskData, TaskResponse, IWebRTC, VoiceUIControlOptions, TaskToggleMuteOptions } from '../types';
3
3
  import Voice from './Voice';
4
4
  import WebCallingService from '../../WebCallingService';
5
- import { WrapupData } from '../../config/types';
5
+ import type { WrapupData } from '../../config/types';
6
+ import type ApiAIAssistant from '../../ApiAiAssistant';
6
7
  export default class WebRTC extends Voice implements IWebRTC {
7
8
  private localAudioStream;
8
9
  private webCallingService;
9
- constructor(contact: ReturnType<typeof routingContact>, webCallingService: WebCallingService, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string);
10
+ constructor(contact: ReturnType<typeof routingContact>, webCallingService: WebCallingService, data: TaskData, callOptions?: VoiceUIControlOptions, wrapupData?: WrapupData, agentId?: string, agentName?: string, apiAIAssistant?: ApiAIAssistant);
10
11
  private registerWebCallListeners;
11
12
  private handleRemoteMedia;
12
13
  /**
@@ -52,6 +52,8 @@ export type WebexRequestPayload = {
52
52
  uri?: string;
53
53
  /** Whether to add authorization header */
54
54
  addAuthHeader?: boolean;
55
+ /** Request timeout in milliseconds */
56
+ timeout?: number;
55
57
  /** Custom headers to include in request */
56
58
  headers?: {
57
59
  [key: string]: string | null;
@@ -776,14 +778,18 @@ export declare const AIAssistantEventName: {
776
778
  readonly GET_SUGGESTIONS: "GET_SUGGESTIONS";
777
779
  /** Add extra context to refine a suggested response */
778
780
  readonly ADD_SUGGESTIONS_EXTRA_CONTEXT: "ADD_SUGGESTIONS_EXTRA_CONTEXT";
779
- /** Request mid-call summary generation */
780
- readonly GET_MID_CALL_SUMMARY: "GET_MID_CALL_SUMMARY";
781
781
  /** Request post-call summary generation */
782
782
  readonly GET_POST_CALL_SUMMARY: "GET_POST_CALL_SUMMARY";
783
- /** Mid-call summary response event */
784
- readonly MID_CALL_SUMMARY_RESPONSE: "MID_CALL_SUMMARY_RESPONSE";
783
+ /** Request consult mid-call summary generation */
784
+ readonly GET_MID_CALL_CONSULT_SUMMARY: "GET_MID_CALL_CONSULT_SUMMARY";
785
+ /** Request transfer mid-call summary generation */
786
+ readonly GET_MID_CALL_TRANSFER_SUMMARY: "GET_MID_CALL_TRANSFER_SUMMARY";
785
787
  /** Post-call summary response event */
786
788
  readonly POST_CALL_SUMMARY_RESPONSE: "POST_CALL_SUMMARY_RESPONSE";
789
+ /** Consult mid-call summary response event */
790
+ readonly MID_CALL_CONSULT_SUMMARY_RESPONSE: "MID_CALL_CONSULT_SUMMARY_RESPONSE";
791
+ /** Transfer mid-call summary response event */
792
+ readonly MID_CALL_TRANSFER_SUMMARY_RESPONSE: "MID_CALL_TRANSFER_SUMMARY_RESPONSE";
787
793
  /** Suggested digital response event */
788
794
  readonly SUGGESTED_RESPONSES_DIGITAL: "SUGGESTED_RESPONSES_DIGITAL";
789
795
  /** User action on a suggested response adaptive card */
package/dist/types.js CHANGED
@@ -443,14 +443,18 @@ const AIAssistantEventName = exports.AIAssistantEventName = {
443
443
  GET_SUGGESTIONS: 'GET_SUGGESTIONS',
444
444
  /** Add extra context to refine a suggested response */
445
445
  ADD_SUGGESTIONS_EXTRA_CONTEXT: 'ADD_SUGGESTIONS_EXTRA_CONTEXT',
446
- /** Request mid-call summary generation */
447
- GET_MID_CALL_SUMMARY: 'GET_MID_CALL_SUMMARY',
448
446
  /** Request post-call summary generation */
449
447
  GET_POST_CALL_SUMMARY: 'GET_POST_CALL_SUMMARY',
450
- /** Mid-call summary response event */
451
- MID_CALL_SUMMARY_RESPONSE: 'MID_CALL_SUMMARY_RESPONSE',
448
+ /** Request consult mid-call summary generation */
449
+ GET_MID_CALL_CONSULT_SUMMARY: 'GET_MID_CALL_CONSULT_SUMMARY',
450
+ /** Request transfer mid-call summary generation */
451
+ GET_MID_CALL_TRANSFER_SUMMARY: 'GET_MID_CALL_TRANSFER_SUMMARY',
452
452
  /** Post-call summary response event */
453
453
  POST_CALL_SUMMARY_RESPONSE: 'POST_CALL_SUMMARY_RESPONSE',
454
+ /** Consult mid-call summary response event */
455
+ MID_CALL_CONSULT_SUMMARY_RESPONSE: 'MID_CALL_CONSULT_SUMMARY_RESPONSE',
456
+ /** Transfer mid-call summary response event */
457
+ MID_CALL_TRANSFER_SUMMARY_RESPONSE: 'MID_CALL_TRANSFER_SUMMARY_RESPONSE',
454
458
  /** Suggested digital response event */
455
459
  SUGGESTED_RESPONSES_DIGITAL: 'SUGGESTED_RESPONSES_DIGITAL',
456
460
  /** User action on a suggested response adaptive card */