Full-stack voice communication platform for HR/talent recruiting. AI-powered inbound handling, live monitoring, call recording, transcription & grading.
| Feature | Description | Status |
|---|---|---|
| Authentication & Roles | JWT-based register/login, admin & agent roles, session restore via /auth/me, protected routes |
Done |
| Outbound Calls | Browser-based dialing via Twilio Voice SDK. FloatingDialer keypad with country selector. OutboundCallModal with call states (connecting, ringing, in-call, ended). Auto call-log via /twilio/call-status |
Done |
| AI Inbound Handling | Inbound calls on +15046366772 answered by AI agent. OpenAI GPT-4o-mini generates responses. Multi-turn conversation via /twilio/ai-respond loop with speech recognition |
Done |
| Business Hours & Voicemail | Per-day schedule with timezone support. Emergency closed toggle. Calls outside hours redirect to voicemail recording. Voicemail saved as call_log with type "voicemail" | Done |
| Dual-Phase Recording | Separate recordings for AI phase and human phase. AI recording started async after TwiML response. Human recording starts when agent takes over. Both stored in MinIO/S3 | Done |
| Dual-Phase Transcription | Whisper STT + GPT-3.5 diarization for both phases. AI conversation also saved directly from chat history. Separate transcript and transcript_human columns |
Done |
| Live Call Monitoring | WebSocket real-time updates. Live transcript feed with auto-scroll. "Listen In" (muted conference) and "Take Over" (unmuted, stops AI recording, starts human recording) | Done |
| Call Logs & Filters | Full CRUD. 7 filters: All, Inbound, Outbound, Voicemail, Failed, Busy/No Answer, Resolved. Count badges. Type column with icons. Recording availability indicator | Done |
| Call Detail Page | Dual transcript viewer (AI + Human with speaker bubbles). Dual audio player. Phase indicator banner for transferred calls. Metadata display | Done |
| Call Grading | Thumbs up/down grading on call detail page. Toggleable (click again to ungrade). Updates grading_score and review_status |
Done |
| Training Feedback | Free-text correction notes per call. Saved to correction_notes column. Intended for AI persona improvement loop |
Done |
| Contact Management | CRUD contacts with name + phone. Alphabetical grouping. Search. Last call info display. Click-to-call outbound | Done |
| Dashboard Stats | Total calls, inbound count, missed count, voicemail count. Recent 5 calls list | Done |
| Settings Page | AI greeting & system prompt config. Business hours UI with timezone picker (grouped by region, shows UTC offset). Emergency closed toggle. Local time preview for cross-region users | Done |
| Auto Webhook Config | configureInboundNumber() at startup auto-sets Twilio voice URL and status callback for inbound number |
Done |
| Docker Full Stack | 4-service compose: MySQL, MinIO, Backend, Frontend (Nginx). Auto-init DB schema from init.sql. Build-time env injection for frontend |
Done |
| FloatingDialer — Recent Tab | Recent calls tab with layout, styling, and data display from call history | Done |
| FloatingDialer — Contacts Tab | Contacts tab with search and click-to-call integrated into FloatingDialer | Done |
| Feature | Description & Status | Status |
|---|---|---|
| Persona Feedback Loop | Training feedback (correction_notes) is stored per call. Next: aggregate grading + corrections into a persona summary. Auto-inject into AI system prompt for continuous improvement | Ongoing |
| Conference Controls | Hold, Transfer, and Keypad buttons exist in Live Calls UI but are currently disabled. Core listen & take-over work | Partial |
Every inbound call generates grading data (good / needs improvement) and optional correction notes from the reviewer.
This feedback is stored per-call in call_logs.grading_score and call_logs.correction_notes.
The system will aggregate this data into a living Persona Summary that feeds back into the AI agent's system prompt.
AI handles inbound call. Transcript & recording saved
Admin reviews call detail. Gives thumbs up/down + correction text
grading_score + correction_notes saved to DB per call
Periodic aggregation: collect all corrections → summarize patterns → update persona
Summary appended to agent_settings.system_prompt. AI behavior improves on next call
| Component | Status | Details |
|---|---|---|
| Call Grading UI | Done | Thumbs up/down on CallDetailPage, toggleable, saves to DB |
| Correction Notes UI | Done | Textarea on CallDetailPage, saves to correction_notes |
| Data Storage | Done | call_logs.grading_score and call_logs.correction_notes columns exist |
| Feedback Dashboard | Planned | Visual report: % good vs needs improvement, common correction themes, persona version history |
| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
| POST | /auth/register | Create user account | — |
| POST | /auth/login | Login → JWT | — |
| GET | /auth/me | Current user profile | ✓ |
| POST | /twilio/token | Generate Voice SDK access token | ✓ |
| POST | /twilio/voice | TwiML webhook (outbound + conference join) | — |
| POST | /twilio/call-status | Outbound call completion callback | — |
| POST | /twilio/inbound | AI answers inbound call (business hours check) | — |
| POST | /twilio/ai-respond | AI processes speech & responds (loop) | — |
| POST | /twilio/inbound-status | Inbound call ended → finalize call_log | — |
| POST | /twilio/voicemail | Voicemail TwiML prompt | — |
| POST | /twilio/voicemail-done | Voicemail recording complete | — |
| POST | /twilio/conference-status | Conference lifecycle events | — |
| POST | /twilio/recording-status | Recording ready → download, store, transcribe | — |
| POST | /twilio/transcription-status | Twilio transcription completion | — |
| GET | /twilio/recording/:sid | Serve recording audio (MinIO/Twilio proxy) | ✓ |
| POST | /twilio/transcribe/:id | Retroactive Whisper+GPT transcription | ✓ |
| GET | /active-calls | List live AI-handled calls | ✓ |
| POST | /active-calls/:callSid/monitor | Listen in or take over call | ✓ |
| POST | /active-calls/:callSid/agent-response | Agent accept/reject transfer | ✓ |
| GET | /active-users | Online user list | ✓ |
| GET | /call-logs | List all call logs | ✓ |
| GET | /call-logs/:id | Single call detail | ✓ |
| POST | /call-logs | Create call log | ✓ |
| PUT | /call-logs/:id | Update call log (grade, feedback) | ✓ |
| DELETE | /call-logs/:id | Delete call log | ✓ |
| GET | /agent-settings | Get AI agent config | ✓ |
| POST | /agent-settings | Create agent settings | ✓ |
| PUT | /agent-settings/:id | Update agent settings | ✓ |
| GET | /dashboard/stats | Call stats & recent activity | ✓ |
| GET | /contacts | List contacts with last call info | ✓ |
| POST | /contacts | Create contact | ✓ |
| DELETE | /contacts/:id | Delete contact | ✓ |
| GET | /health | Health check | — |
| WS | /ws | Real-time admin updates (call events, transcripts) | msg |
| Feature | Description | Priority |
|---|---|---|
| Conference Hold & Transfer | Implement Hold and Transfer buttons in Live Calls intervention panel | Medium |
| Variable | Purpose | Scope |
|---|---|---|
| VITE_API_URL | Backend URL baked into frontend JS at build time | Frontend (build) |
| CORS_ORIGIN | Allowed origin for CORS | Backend |
| JWT_SECRET | JWT signing key | Backend |
| TWILIO_ACCOUNT_SID | Twilio account identifier | Backend |
| TWILIO_API_KEY / SECRET | Twilio API credentials | Backend |
| TWILIO_TWIML_APP_SID | TwiML App for Voice URL routing | Backend |
| TWILIO_PHONE_NUMBER | Outbound caller ID (+12253503828) | Backend |
| TWILIO_INBOUND_PHONE_NUMBER | AI inbound number (+15046366772) | Backend |
| OPENAI_API_KEY | OpenAI for GPT responses + Whisper transcription | Backend |
| MINIO_* | Object storage credentials & bucket | Backend |
| DB_HOST / DB_USER / DB_PASSWORD | MySQL connection | Backend |
platform.openai.com/usage and top up before depletion to avoid transcription/AI interruption.
agent_settings defines how the AI agent communicatesgrading_score + correction_notes)agent_settings is the single source of truth for AI behavior. This keeps things simple, controllable, and sufficient for current call volume and complexity.