diff --git a/CLAUDE.md b/CLAUDE.md index 35aa4e2..55218f0 100644 --- a/CLAUDE.md +++ b/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* \ No newline at end of file +*Updated: Mar 2026* \ No newline at end of file diff --git a/admin/mobile-app-settings.php b/admin/mobile-app-settings.php index cc92f58..f1ead94 100644 --- a/admin/mobile-app-settings.php +++ b/admin/mobile-app-settings.php @@ -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");
-- Twilio Push Credential SID. Create in Twilio Console > Messaging > Push Credentials using your FCM service account JSON. Required for incoming call push notifications. -
-