Remove Twilio Push Credential references and add real Firebase config
All checks were successful
Create Release / build (push) Successful in 4s
All checks were successful
Create Release / build (push) Successful in 4s
All FCM push notifications are handled by WordPress backend (TWP_FCM), so Twilio Push Credentials are unnecessary. Also replaces placeholder google-services.json with real Firebase project config (twp-softphone). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
97
CLAUDE.md
97
CLAUDE.md
@@ -6,8 +6,26 @@
|
||||
- **URL**: `https://phone.cloud-hosting.io/`
|
||||
- **Deployment**: rsync to Docker (remote server only, not local)
|
||||
- **SDK**: Twilio PHP SDK v8.7.0
|
||||
- **PHP**: 8.0+ required
|
||||
- **Optional**: AWS SDK (`aws/aws-sdk-php`) for SNS SMS provider
|
||||
- **External SDK**: `wp-content/twilio-sdk/` (survives plugin updates)
|
||||
|
||||
## Commands
|
||||
- **Install SDK (recommended)**: `./install-twilio-sdk-external.sh` (installs to `wp-content/twilio-sdk/`)
|
||||
- **Install SDK (internal)**: `./install-twilio-sdk.sh` (installs to `vendor/`, lost on plugin update)
|
||||
- **Test SDK**: `php test-sdk.php`
|
||||
- **Composer install SDK**: `composer install-sdk`
|
||||
- **Deploy**: rsync to Docker (remote server, see production path above)
|
||||
- **CI/CD**: Gitea workflows in `.gitea/workflows/` — `release.yml`, `update-version.yml`
|
||||
|
||||
## Directory Structure
|
||||
- `twilio-wp-plugin.php` — Main plugin file, constants, SDK loading
|
||||
- `includes/` — All backend classes (28 class files)
|
||||
- `admin/` — Admin UI class (`TWP_Admin`), mobile app settings page
|
||||
- `assets/js/` — Browser phone JS, service worker
|
||||
- `assets/images/`, `assets/sounds/` — Static assets
|
||||
- `.gitea/workflows/` — CI/CD (release, version update)
|
||||
|
||||
## Phone Variable Names
|
||||
**Use**: `incoming_number`, `agent_number`, `customer_number`, `workflow_number`, `queue_number`, `default_number`
|
||||
**Don't use**: `from_number`, `to_number`, `phone_number`, `$agent_phone`
|
||||
@@ -18,11 +36,20 @@
|
||||
- **TWP_Admin**: Has `find_customer_call_leg()` - CRITICAL for call control
|
||||
- **TWP_TTS_Helper**: ElevenLabs/Alice fallback, 30-day cache
|
||||
- **TWP_User_Queue_Manager**: Auto-creates queues/extensions (100-9999)
|
||||
- **TWP_Webhooks**: 26 endpoints at `twilio-webhook/v1`
|
||||
- **TWP_Activator**: Creates 15 DB tables, run `ensure_tables_exist()` if missing
|
||||
- **TWP_Webhooks**: 35 endpoints at `twilio-webhook/v1`
|
||||
- **TWP_Activator**: Creates 16 DB tables, run `ensure_tables_exist()` if missing
|
||||
- **TWP_Core**: Main plugin orchestrator, hooks all classes together
|
||||
- **TWP_SMS_Manager**: SMS abstraction with provider interface
|
||||
- **TWP_SMS_Provider_Twilio** / **TWP_SMS_Provider_SNS**: SMS providers (Twilio default, AWS SNS optional)
|
||||
- **TWP_Mobile_API**: REST API for mobile app
|
||||
- **TWP_Mobile_Auth** / **TWP_Mobile_SSE** / **TWP_FCM**: Mobile auth, server-sent events, push notifications
|
||||
- **TWP_Call_Queue**: Queue operations and management
|
||||
- **TWP_Callback_Manager**: Callback request handling
|
||||
- **TWP_Workflow**: Workflow step execution engine
|
||||
- **TWP_Auto_Updater**: Plugin auto-update from Gitea releases
|
||||
|
||||
## Database
|
||||
15 tables with `twp_` prefix. Key notes:
|
||||
16 tables with `twp_` prefix. Key notes:
|
||||
- `twp_call_queues`: User queues (general/personal/hold)
|
||||
- `twp_agent_status`: Has `auto_busy_at` for 1-min auto-revert
|
||||
- `twp_queued_calls`: Uses `enqueued_at` not `joined_at`
|
||||
@@ -41,32 +68,6 @@ $api->update_call($customer_call_sid, ['twiml' => $twiml_xml]);
|
||||
- Queue: Pass `waitUrl` as option in `enqueue()`
|
||||
- TwiML: Use SDK classes, not raw XML
|
||||
|
||||
## Recent Changes (v2.3.0)
|
||||
- Browser phone moved to admin-only
|
||||
- Call control uses `find_customer_call_leg()` to prevent disconnections
|
||||
- Auto-creates user queues/extensions when needed
|
||||
- Firefox support added
|
||||
- 1-min agent status auto-revert
|
||||
|
||||
## SDK Installation
|
||||
- **External SDK (Recommended)**: Use `install-twilio-sdk-external.sh` to install SDK to `wp-content/twilio-sdk/`
|
||||
- Survives WordPress plugin updates
|
||||
- SDK location defined by `TWP_EXTERNAL_SDK_DIR` constant
|
||||
- Loading priority: External first, then internal `vendor/` fallback
|
||||
- **Internal SDK (Alternative)**: Use `install-twilio-sdk.sh` to install to `vendor/`
|
||||
- Will be deleted when WordPress updates the plugin
|
||||
- Requires reinstallation after each plugin update
|
||||
- **SDK Loading**: Plugin checks external location first via autoloader, falls back to internal
|
||||
- **Post-Update Detection**: Hook on `upgrader_process_complete` checks SDK status and shows warning
|
||||
|
||||
## Browser Phone Configuration
|
||||
- **Edge Location Setting**: Configurable via Settings → Twilio Edge Location
|
||||
- Default: `roaming` (auto-select closest edge)
|
||||
- Options: ashburn, umatilla, dublin, frankfurt, singapore, sydney, tokyo, sao-paulo
|
||||
- Stored in: `twp_twilio_edge` option
|
||||
- Used by: Browser phone JavaScript for WebRTC connection
|
||||
- Critical: Wrong edge causes immediate call failures (e.g., US calls with Sydney edge)
|
||||
|
||||
## Development Notes
|
||||
- **API**: E.164 format (+1XXXXXXXXXX)
|
||||
- **Database**: Use `$wpdb`, prepared statements
|
||||
@@ -79,30 +80,24 @@ $api->update_call($customer_call_sid, ['twiml' => $twiml_xml]);
|
||||
- User-specific queues with extensions
|
||||
- Browser phone at `admin.php?page=twilio-wp-browser-phone`
|
||||
- ElevenLabs TTS with Alice fallback
|
||||
- 68 AJAX actions, 26 REST endpoints
|
||||
- 77 AJAX actions, 35 REST endpoints
|
||||
- Browser phone moved to admin-only (v2.3.0)
|
||||
- Firefox, Chrome, Safari, Edge support
|
||||
- 1-min agent status auto-revert
|
||||
|
||||
## Recent Technical Changes (v2.8.9)
|
||||
## SDK Loading
|
||||
- **External SDK (Recommended)**: `wp-content/twilio-sdk/` — survives plugin updates
|
||||
- **Internal SDK**: `vendor/` — deleted on plugin update, needs reinstall
|
||||
- Loading priority: External first (`TWP_EXTERNAL_SDK_DIR`), then internal fallback
|
||||
- Post-update hook (`upgrader_process_complete`) warns if SDK missing
|
||||
|
||||
### SDK Persistence Between Plugin Updates
|
||||
- **Problem**: WordPress plugin updates delete entire plugin folder including `vendor/` SDK
|
||||
- **Solution**: External SDK installation at `wp-content/twilio-sdk/` survives updates
|
||||
- **Implementation**:
|
||||
- New constant: `TWP_EXTERNAL_SDK_DIR` points to `wp-content/twilio-sdk/`
|
||||
- Loading priority in `twp_check_sdk_installation()`: External first, internal fallback
|
||||
- Classes updated: `TWP_Twilio_API`, `TWP_Webhooks` constructors check external location first
|
||||
- New script: `install-twilio-sdk-external.sh` automates external installation
|
||||
- Post-update hook: `twp_check_sdk_after_update()` detects missing SDK after updates
|
||||
- Admin notices: `twp_sdk_missing_notice()` shows both installation options
|
||||
- Warning system: `twp_show_sdk_update_warning()` via transient after plugin updates
|
||||
## Browser Phone Configuration
|
||||
- **Edge Location**: `twp_twilio_edge` option, default `roaming`
|
||||
- Options: roaming, ashburn, umatilla, dublin, frankfurt, singapore, sydney, tokyo, sao-paulo
|
||||
- Wrong edge causes immediate call failures (e.g., US calls with Sydney edge)
|
||||
|
||||
### US Calls Failing Fix (Browser Phone)
|
||||
- **Problem**: Browser phone had hardcoded `edge: 'sydney'`, causing US calls to fail with immediate HANGUP
|
||||
- **Solution**: Configurable edge location via WordPress settings
|
||||
- **Implementation**:
|
||||
- New setting: `twp_twilio_edge` with default value `roaming`
|
||||
- Settings UI: Dropdown in admin settings with 8 edge options
|
||||
- Browser phone JS: Uses `get_option('twp_twilio_edge', 'roaming')` instead of hardcoded value
|
||||
- Edge options: roaming, ashburn, umatilla, dublin, frankfurt, singapore, sydney, tokyo, sao-paulo
|
||||
## Changelog
|
||||
See `README.md` for detailed version history. Current version: v2.8.9.
|
||||
|
||||
---
|
||||
*Updated: Jan 2026*
|
||||
*Updated: Mar 2026*
|
||||
@@ -54,7 +54,6 @@ if (isset($_POST['twp_save_mobile_settings']) && check_admin_referer('twp_mobile
|
||||
update_option('twp_gitea_token', sanitize_text_field($_POST['twp_gitea_token']));
|
||||
update_option('twp_twilio_api_key_sid', sanitize_text_field($_POST['twp_twilio_api_key_sid']));
|
||||
update_option('twp_twilio_api_key_secret', sanitize_text_field($_POST['twp_twilio_api_key_secret']));
|
||||
update_option('twp_fcm_push_credential_sid', sanitize_text_field($_POST['twp_fcm_push_credential_sid']));
|
||||
|
||||
$settings_saved = true;
|
||||
}
|
||||
@@ -68,7 +67,6 @@ $gitea_repo = get_option('twp_gitea_repo', 'wp-plugins/twilio-wp-plugin');
|
||||
$gitea_token = get_option('twp_gitea_token', '');
|
||||
$twilio_api_key_sid = get_option('twp_twilio_api_key_sid', '');
|
||||
$twilio_api_key_secret = get_option('twp_twilio_api_key_secret', '');
|
||||
$fcm_push_credential_sid = get_option('twp_fcm_push_credential_sid', '');
|
||||
|
||||
// Get update status
|
||||
require_once TWP_PLUGIN_DIR . 'includes/class-twp-auto-updater.php';
|
||||
@@ -208,22 +206,6 @@ $total_sessions = $wpdb->get_var("SELECT COUNT(*) FROM $sessions_table");
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="twp_fcm_push_credential_sid">Push Credential SID</label>
|
||||
</th>
|
||||
<td>
|
||||
<input type="text"
|
||||
id="twp_fcm_push_credential_sid"
|
||||
name="twp_fcm_push_credential_sid"
|
||||
value="<?php echo esc_attr($fcm_push_credential_sid); ?>"
|
||||
class="regular-text"
|
||||
placeholder="CR...">
|
||||
<p class="description">
|
||||
Twilio Push Credential SID. Create in Twilio Console > Messaging > Push Credentials using your FCM service account JSON. Required for incoming call push notifications.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<?php if ($fcm_sa_configured): ?>
|
||||
|
||||
@@ -696,7 +696,6 @@ class TWP_Mobile_API {
|
||||
$api_key_sid = get_option('twp_twilio_api_key_sid');
|
||||
$api_key_secret = get_option('twp_twilio_api_key_secret');
|
||||
$twiml_app_sid = get_option('twp_twiml_app_sid');
|
||||
$push_credential_sid = get_option('twp_fcm_push_credential_sid');
|
||||
|
||||
if (empty($api_key_sid) || empty($api_key_secret)) {
|
||||
return new WP_Error('missing_api_key', 'Twilio API Key SID and Secret must be configured', array('status' => 500));
|
||||
@@ -715,10 +714,6 @@ class TWP_Mobile_API {
|
||||
$voiceGrant->setOutgoingApplicationSid($twiml_app_sid);
|
||||
$voiceGrant->setIncomingAllow(true);
|
||||
|
||||
if (!empty($push_credential_sid)) {
|
||||
$voiceGrant->setPushCredentialSid($push_credential_sid);
|
||||
}
|
||||
|
||||
$token->addGrant($voiceGrant);
|
||||
|
||||
return new WP_REST_Response(array(
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"project_info": {
|
||||
"project_number": "000000000000",
|
||||
"project_id": "twp-softphone-placeholder",
|
||||
"storage_bucket": "twp-softphone-placeholder.appspot.com"
|
||||
"project_number": "187457540438",
|
||||
"project_id": "twp-softphone",
|
||||
"storage_bucket": "twp-softphone.firebasestorage.app"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
|
||||
"mobilesdk_app_id": "1:187457540438:android:d6d777270c23f6660946f7",
|
||||
"android_client_info": {
|
||||
"package_name": "io.cloudhosting.twp.twp_softphone"
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
"oauth_client": [],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "PLACEHOLDER_API_KEY"
|
||||
"current_key": "AIzaSyAdGJrWPy9b9arqHnlY5G_hsGiDcm6cchA"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
|
||||
Reference in New Issue
Block a user