feat: CC agent features, live call assist, worklist redesign, brand tokens

CC Agent:
- Call transfer (CONFERENCE + KICK_CALL) with inline transfer dialog
- Recording pause/resume during active calls
- Missed calls API (Ozonetel abandonCalls)
- Call history API (Ozonetel fetchCDRDetails)

Live Call Assist:
- Deepgram Nova STT via raw WebSocket
- OpenAI suggestions every 10s with lead context
- LiveTranscript component in sidebar during calls
- Browser audio capture from remote WebRTC stream

Worklist:
- Redesigned table: clickable phones, context menu (Call/SMS/WhatsApp)
- Last interaction sub-line, source column, improved SLA
- Filtered out rows without phone numbers
- New missed call notifications

Brand:
- Logo on login page
- Blue scale rebuilt from logo blue rgb(32, 96, 160)
- FontAwesome duotone CSS variables set globally
- Profile menu icons switched to duotone

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 10:36:10 +05:30
parent 99bca1e008
commit 3064eeb444
21 changed files with 2583 additions and 85 deletions

View File

@@ -1,6 +1,43 @@
# Next Session — Outbound Call UI + Remaining Work
## Priority 0: Kookoo Dial to SIP Extension
## Priority 0: Outbound Call — CloudAgent WebSocket Integration
**CRITICAL FINDING:** The Ozonetel toolbar's outbound dial works via TWO connections:
1. CloudAgent WebSocket (mdlConnection.php) — sends `tbManualDial` with `browserSessionId` + `usId`
2. SIP WebSocket (blr-pub-rtc4.ozonetel.com:444) — receives the SIP INVITE and auto-answers
The `browserSessionId` and `usId` come from the CloudAgent WebSocket session handshake. Without them, CloudAgent doesn't know which browser to route the SIP INVITE to.
**The toolbar's tbManualDial payload:**
```json
{
"type": "tbManualDial",
"ns": "ozonetel.cloudagent",
"customer": "global_healthx",
"agentId": "global",
"agentUniqId": 374804,
"browserSessionId": "e15cd447-...", // FROM WEBSOCKET SESSION
"usId": "af7hkcT3BcwCG-g=", // FROM WEBSOCKET SESSION
"isSip": "true",
"mode": "manual",
"params": "312792,9949879837,523591,SIP:true", // campaignId,phone,sipExt,SIP:true
"utid": 57
}
```
**What we need to do:**
1. Connect to CloudAgent WebSocket from our browser (same mdlConnection.php endpoint)
2. Establish session → get `usId` and `browserSessionId`
3. Include these in `tbManualDial` requests
4. CloudAgent will then send SIP INVITE to our JsSIP
**The toolbar's SIP service code** is at: user pasted it in conversation. Key function: `handleSipAutoAnswer()` which auto-answers based on agent's `autoAnswer` setting (0=none, 1=all, 2=inbound, 3=outbound).
**SIP config from toolbar:** password = extension number (523590), registrar = `sip:blr-pub-rtc4.ozonetel.com`, session_timers = false. Same as what we have.
**Kookoo approach is abandoned**`<dial>` only works with PSTN numbers, not SIP extensions.
## Priority 0 (OLD): Kookoo Dial to SIP Extension
**Status:** Kookoo IVR endpoint works. When customer answers, Kookoo hits /kookoo/ivr, we respond with `<dial>523590</dial>`. But Kookoo tries to call 523590 as a PSTN number — status=not_answered.