Recording Playback Fixes:
- Added proxy_recording_audio endpoint to handle authenticated playback
- Recordings now play through WordPress proxy like voicemails
- Updated Play/Download buttons to use proxy URLs instead of direct Twilio URLs
- No more Twilio login prompts when playing recordings
Phone Number Display Fixes:
- Fixed outbound call recording display to show customer numbers properly
- For browser phone outbound calls, customer number now shows in "From" field
- Added logic to detect client: calls and swap number display appropriately
- Enhanced logging for debugging outbound call number handling
The recording system now works consistently with the voicemail system,
providing seamless authenticated playback without exposing Twilio credentials.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Increased from_number and to_number fields from varchar(20) to varchar(50)
- Added automatic migration to update existing table schemas
- Addresses issue with outbound calls having long phone number formats
- Added force_table_updates() method for manual schema updates
- Enhanced ensure_tables_exist() to always run column migrations
- Fixes recording database insertion failures for international numbers
The original varchar(20) was too small for modern phone number formats,
especially for outbound calls which may include client: prefixes and
international numbers with country codes.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Simplified resume logic to use empty TwiML to stop hold music
- Enhanced call relationship detection for proper call leg identification
- Added comprehensive logging for debugging resume operations
- Removed complex reconnection attempts in favor of simple approach
- Empty TwiML allows existing call connections to resume naturally
- Fixed issue where agents couldn't resume calls they put on hold
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Enhanced call leg detection logic for browser phone calls
- Added comprehensive logging for debugging hold/resume operations
- Fixed hold to properly identify customer vs agent call legs
- Added fallback mechanisms when call relationships are unclear
- Improved resume logic to match hold behavior
- Prevents customer disconnections when agent puts call on hold
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Database Issues Fixed
- Ensure database table exists before recording operations
- Better error handling when database insert fails
- Added fallback to stop recording in Twilio even if not found in database
- Enhanced error logging for database operations
## Improved Recording Error Handling
- Stop recording attempts Twilio API even if database record missing
- Better error messages distinguish between database vs Twilio issues
- Recording start validates database insert success before proceeding
- Enhanced debugging to identify where recordings are failing
## JavaScript Debugging Enhanced
- Added console logging for all recording operations
- Log recording SID and call SID on start/stop
- Better error messages in browser console
- Detailed AJAX failure logging
## Technical Improvements
- Call TWP_Activator::ensure_tables_exist() before recording operations
- Return call_sid in recording start response for debugging
- Graceful handling of recordings that exist in Twilio but not database
- Better validation of recording SID before stop operations
This should resolve the "recording not found in database" error by:
1. Ensuring the database table exists
2. Providing better error feedback when database operations fail
3. Allowing recordings to be stopped even if database tracking failed
4. Enhanced logging to identify root cause of storage issues
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Hold Logic Fix
- Now correctly identifies which call leg to put on hold
- For browser phone calls (client: prefix), looks for parent call to hold customer
- For regular calls, puts the call recipient on hold
- Agent remains connected and can hear when customer speaks
## Smart Call Leg Detection
- Detects browser phone calls by 'client:' prefix in 'To' field
- Uses parentCallSid to find the customer's call leg
- Falls back gracefully if parent call structure isn't available
- Added detailed error logging to help debug call structures
## Improved User Experience
- Customer hears "Please hold while we assist you" before hold music
- Agent stays connected and can monitor the call
- Resume includes "Thank you for holding" message
- Better messaging tailored to who is actually being put on hold
## Technical Details
- Added call structure analysis and logging
- Proper handling of Twilio's call hierarchy
- Different TwiML logic for browser vs regular phone calls
- Maintains backwards compatibility with existing call flows
This resolves the issue where agents were being put on hold instead of customers when using the browser phone interface.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Default Music Improvement
- Changed from Twilio's annoying cowbell.mp3 to gentle bell-ringing-05.wav
- Much more pleasant and professional sounding default
- Updated both settings default and code fallback
## Better Music Suggestions
- Added comprehensive list of recommended music sources in admin interface
- Suggested alternatives: WordPress Media Library, Freesound.org, Archive.org, Incompetech.com, Zapsplat.com
- Provided guidance for different business types and use cases
## User Experience
- No more jarring cowbell sounds for new installations
- Clear instructions on how to customize with better alternatives
- Emphasis on using WordPress Media Library for reliability
The new default provides a much more professional audio experience while still maintaining functionality for users who haven't customized their hold music yet.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## New Settings
- Added "Default Queue Music URL" setting in admin settings
- This setting provides fallback music for both queue waits and call hold
- Hold Music URL field can now be left empty to use default queue music
- Better organization of music settings with clear descriptions
## Hold Music Improvements
- Hold music now falls back to default queue music if no specific hold music is set
- Maintains backwards compatibility with existing hold music URLs
- Provides consistent music experience across hold and queue functions
## Queue Music Enhancements
- Queue wait music now uses default queue music as fallback
- No more silent pauses when no queue-specific music is configured
- Improved user experience with continuous music during waits
## Settings Organization
- Default Queue Music is shown first as the primary setting
- Hold Music field has placeholder text indicating it's optional
- Clear descriptions explain the fallback behavior
- Both settings properly registered in WordPress settings API
This creates a more cohesive audio experience where:
1. Admin sets default queue music for system-wide use
2. Individual queues can override with their own music
3. Hold music can be customized or fall back to default
4. No more silent pauses during queue waits
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Recording Issues Fixed
- Enhanced Call SID detection for browser phone calls
- Try multiple methods to get Call SID: parameters.CallSid, customParameters.CallSid, outgoingConnectionId, sid
- Added comprehensive console logging for debugging recording issues
- Better error handling and user feedback
## Backend Improvements
- Verify call exists and is in-progress before attempting recording
- Enhanced error logging with call status and details
- Improved AJAX error responses with specific error messages
- Database insert error checking and logging
## Frontend Improvements
- Multiple Call SID detection methods for browser phone compatibility
- Console logging of call object and Call SID for debugging
- Enhanced error handling with xhr response details
- Validation of active call before recording attempt
## Debugging Features
- Detailed error logs in PHP error log
- Console logging in browser for JavaScript debugging
- Specific error messages for different failure scenarios
- Call status validation to ensure recording is possible
These changes should resolve the "recording not working" issue by properly detecting the Call SID for browser phone calls and providing detailed debugging information.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Hold/Resume Fixes
- Fixed call disconnection issue when resuming from hold
- Changed resume logic from webhook redirect to empty TwiML continuation
- This allows browser phone calls to continue normally after hold
## Recording Stop Improvements
- Enhanced error handling for recording stop functionality
- Check recording status in database before attempting Twilio API call
- Handle cases where recording is already stopped or completed
- Graceful fallback if Twilio API call fails
- Better logging for debugging recording issues
## Configurable Hold Music
- Added "Hold Music URL" setting in admin Settings page
- Allows admins to specify custom hold music instead of default cowbell
- Supports MP3 and WAV files from any publicly accessible URL
- Default remains Twilio's cowbell.mp3 for backwards compatibility
- Setting automatically saved/loaded through WordPress settings API
## Technical Details
- Hold music URL retrieved via get_option() with fallback
- Recording stop checks database state before API calls
- Improved error messages and logging throughout
- All changes maintain backwards compatibility
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Frontend Issues Fixed
- Call control panel visibility during connected calls
- Button event handlers properly bound
- JavaScript localization includes user_id for personal queues
## Backend Browser Phone Enhanced
- Added complete call control panel with Hold, Transfer, Requeue, Record buttons
- Integrated admin-specific JavaScript functions for all call controls
- Added agent selection dialogs with status indicators
- Call control panel shows/hides based on call state
- Button state management (hold/unhold, record/stop recording)
- WordPress admin styling with dashicons
## Technical Improvements
- Separate admin button IDs to avoid conflicts with frontend
- Enhanced call state management in setupCallHandlers()
- Admin notification system for user feedback
- Proper cleanup when calls end
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## New Call Control Features
- Call hold/unhold with music playback
- Call transfer with agent selection dialog
- Call requeue to different queues
- Call recording with start/stop controls
- Real-time recording status tracking
## Enhanced Transfer System
- Transfer to agents with cell phones (direct)
- Transfer to web phone agents via personal queues
- Automatic queue creation for each user
- Real-time agent availability status
- Visual agent selection with status indicators (📱 phone, 💻 web)
## Call Recordings Management
- New database table for call recordings
- Recordings tab in voicemail interface
- Play/download recordings functionality
- Admin-only delete capability
- Integration with Twilio recording webhooks
## Agent Queue System
- Personal queues (agent_[user_id]) for web phone transfers
- Automatic polling for incoming transfers
- Transfer notifications with browser alerts
- Agent status tracking (available/busy/offline)
## Technical Enhancements
- 8 new AJAX endpoints for call controls
- Recording status webhooks
- Enhanced transfer dialogs with agent selection
- Improved error handling and user feedback
- Mobile-responsive call control interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix 403 Forbidden error in voicemail AJAX by correcting nonce validation
- Create accordion-style collapsible voicemail section with persistent state
- Restructure queue controls to show alert toggle button consistently
- Add global queue actions always visible when user has assigned queues
- Implement smooth slide animations and localStorage state management
- Update dark mode support for new UI elements and improved accessibility
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add AJAX endpoint for fetching user voicemails with stats and recent list
- Create voicemail display section with counts, transcriptions, and playback
- Implement click-to-play functionality for voicemail audio
- Add refresh and view-all buttons with admin page integration
- Style voicemail section with consistent design and dark mode support
- Include visual indicators for recordings and formatted durations
- Add mobile responsive design and hover effects
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement proactive token refresh 5 minutes before expiry (1-hour tokens)
- Add call-safe refresh logic that postpones refresh during active calls
- Replace fixed-interval refresh with smart scheduling based on token expiry
- Add proper cleanup on page unload to prevent memory leaks
- Enhance error handling with retry mechanisms for network failures
- Apply to both admin browser phone page and frontend shortcode
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add format_timestamp_with_timezone() helper to convert UTC to WP timezone
- Update all timestamp displays to use WordPress timezone setting
- Fix dashboard showing call SID instead of phone numbers in From field
- Fix dashboard showing "System" instead of actual phone numbers in To field
- Query actual from_number and to_number fields for dashboard display
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change ajax_get_waiting_calls response format to return array directly
- Fixes JavaScript error "waitingCalls.filter is not a function"
- Ensures compatibility with frontend filter operations
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Features Added:
- Queue display showing all assigned queues for the current user
- Real-time queue statistics (waiting calls, capacity)
- Visual indicators for queues with waiting calls (green border, pulse animation)
- Queue selection with click interaction
- Accept next call from selected queue functionality
- Auto-refresh of queue data every 30 seconds
- Mobile-responsive queue interface
Backend Changes:
- New ajax_get_agent_queues() handler to fetch user's assigned queues
- Enhanced ajax_get_waiting_calls() to return structured data
- Proper permission checking for twp_access_agent_queue capability
Frontend Enhancements:
- Interactive queue list with selection states
- Queue controls panel showing selected queue info
- Refresh button for manual queue updates
- Visual feedback for queues with active calls
- Mobile-optimized layout for smaller screens
UI/UX Improvements:
- Queues with waiting calls highlighted with green accent
- Pulsing indicator for active queues
- Auto-selection of first queue with calls
- Responsive design for mobile devices
- Dark mode support for queue elements
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added verify_ajax_nonce() helper method to check both admin and frontend nonces
- Updated ajax_generate_capability_token() to accept frontend nonce
- Updated ajax_get_phone_numbers() to accept frontend nonce
- Updated ajax_get_waiting_calls() to accept frontend nonce
- Updated ajax_accept_next_queue_call() to accept frontend nonce
- Resolves 403 AJAX errors when using shortcode on frontend
The shortcode creates 'twp_frontend_nonce' while admin uses 'twp_ajax_nonce'
Now both are accepted by the AJAX handlers for proper frontend functionality
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Settings & Configuration:
- Added Discord webhook URL, Slack webhook URL settings in admin
- Added notification type toggles (incoming calls, queue timeouts, missed calls)
- Added queue timeout threshold setting (30-1800 seconds)
- Registered all new settings with WordPress options system
Notification System:
- Created TWP_Notifications class for Discord/Slack webhook handling
- Rich message formatting with embeds/attachments for both platforms
- Color-coded notifications (blue=incoming, yellow=timeout, red=missed)
- Comprehensive error handling and logging
Integration Points:
- Incoming calls: Notifications sent when calls enter queues
- Queue timeouts: Automated monitoring via cron job (every minute)
- Missed calls: Notifications for browser phone and general missed calls
- Added notified_timeout column to prevent duplicate timeout notifications
Features:
- Professional Discord embeds with fields and timestamps
- Slack attachments with proper formatting and colors
- Automatic cron job setup for queue timeout monitoring
- Fallback to SMS notifications while Discord/Slack also work
- Configurable notification types and timeout thresholds
This provides real-time call notifications to Discord channels and Slack channels,
helping teams stay informed about incoming calls and queue issues even when
SMS notifications aren't working due to validation delays.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Database Changes:
- Added twp_workflow_phones junction table for many-to-many relationship
- Updated activator to create and manage new table
- Maintained backward compatibility with existing phone_number field
Workflow Management:
- Added set_workflow_phone_numbers() and get_workflow_phone_numbers() methods
- Updated get_workflow_by_phone_number() to check both old and new structures
- Enhanced save/update handlers to support phone_numbers array
- Added AJAX endpoint for retrieving workflow phone numbers
User Interface:
- Replaced single phone number select with dynamic multi-select interface
- Added "Add Number" and "Remove" buttons for managing multiple numbers
- Updated workflow listing to display all assigned phone numbers
- Enhanced JavaScript for phone number management and validation
The webhook routing already supports multiple numbers since get_workflow_by_phone_number()
was updated to check both structures. This feature allows users to assign multiple
Twilio phone numbers to trigger the same workflow.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed error message display when browser phone initialization fails (now shows actual error instead of "undefined")
- Fixed ajax_get_phone_numbers to use wp_send_json_error instead of wp_die for proper error handling
- Added error handling for phone numbers loading in browser phone interface
- Updated phone_agent role to ensure all necessary capabilities are added to existing roles
- Added automatic capability updates for existing phone_agent roles on plugin load
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed phone agents getting 'Unauthorized' error when accessing voicemails by checking for twp_access_voicemails capability
- Fixed missing ElevenLabs parameter in queue TwiML generation that prevented announcement messages
- Fixed IVR voicemail messages not being saved correctly - now properly assigns message field based on action type
- Added proper permission checks for both ajax_get_voicemail and ajax_get_voicemail_audio functions
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>