wxcli 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: configure-routing
|
|
3
|
+
description: |
|
|
4
|
+
Create, modify, or delete Webex Calling routing infrastructure using wxcli CLI commands: Trunks, Route Groups,
|
|
5
|
+
Route Lists, Dial Plans, Translation Patterns (digit manipulation, strip/add digits, country codes),
|
|
6
|
+
and PSTN Connection settings. Guides the user from prerequisites through the full dependency chain
|
|
7
|
+
and verification.
|
|
8
|
+
Use for: create, update, delete, remove, list, or troubleshoot any Calling routing component.
|
|
9
|
+
NOT for: Contact Center dial plans or DN-to-entry-point mapping (use contact-center skill).
|
|
10
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
11
|
+
argument-hint: [routing-component]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<!-- Created 2026-03-19 -->
|
|
15
|
+
|
|
16
|
+
# Configure Call Routing Workflow
|
|
17
|
+
|
|
18
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
19
|
+
1. What is the creation dependency chain for routing? (Answer: Trunk → Route Group → then Dial Plan AND Route List in parallel. Each dial plan has ONE route target, so different patterns routing to different trunks/groups need separate dial plans.)
|
|
20
|
+
2. Do routing delete commands use singular or plural names? (Answer: plural — `delete-route-groups`, `delete-trunks`, `delete-route-lists`.)
|
|
21
|
+
|
|
22
|
+
If you cannot answer both, you skipped reading this skill. Go back and read it.
|
|
23
|
+
|
|
24
|
+
## When to Use This Skill
|
|
25
|
+
|
|
26
|
+
- Setting up PSTN connectivity for a location (local gateway, cloud-connected PSTN)
|
|
27
|
+
- Creating or modifying dial plans and dial patterns
|
|
28
|
+
- Configuring trunks to on-premises SBCs or local gateways
|
|
29
|
+
- Building route groups for trunk failover/load distribution
|
|
30
|
+
- Creating route lists for Dedicated Instance cloud PSTN
|
|
31
|
+
- Adding translation patterns for digit manipulation
|
|
32
|
+
- Validating or testing call routing end-to-end
|
|
33
|
+
|
|
34
|
+
## Step 1: Load references
|
|
35
|
+
|
|
36
|
+
1. Read `docs/reference/call-routing.md` for full API detail, data models, and gotchas
|
|
37
|
+
|
|
38
|
+
**Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags. Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
|
|
39
|
+
|
|
40
|
+
## Step 2: Verify auth token
|
|
41
|
+
|
|
42
|
+
Before any API calls, confirm the user has a working auth token:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
wxcli whoami
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
If this fails, stop and resolve authentication first (`wxcli configure`). Required scopes for routing:
|
|
49
|
+
|
|
50
|
+
- **Read**: `spark-admin:telephony_config_read`
|
|
51
|
+
- **Write**: `spark-admin:telephony_config_write`
|
|
52
|
+
- **PSTN Read**: `spark-admin:telephony_pstn_read`
|
|
53
|
+
- **PSTN Write**: `spark-admin:telephony_pstn_write`
|
|
54
|
+
|
|
55
|
+
## Step 3: Interview -- what routing does the user need?
|
|
56
|
+
|
|
57
|
+
Ask the user what they want to accomplish. Present this decision matrix if they are unsure:
|
|
58
|
+
|
|
59
|
+
| Need | Component(s) |
|
|
60
|
+
|------|-------------|
|
|
61
|
+
| Connect a location to PSTN via on-premises SBC/gateway | **Trunk** + **PSTN Connection** |
|
|
62
|
+
| Failover between multiple SBCs across locations | **Trunk(s)** + **Route Group** + **Dial Plan** |
|
|
63
|
+
| Route outbound calls by dialed pattern (e.g., +1! to US trunk) | **Dial Plan** (requires existing trunk or route group) |
|
|
64
|
+
| Rewrite/manipulate digits before routing (strip prefix, add prefix) | **Translation Pattern** (org-level or location-level) |
|
|
65
|
+
| Provide cloud PSTN numbers to Dedicated Instance | **Route List** (requires route group) |
|
|
66
|
+
| Verify that a number routes correctly end-to-end | **Test Call Routing** |
|
|
67
|
+
| Set up full premises-based PSTN from scratch | All: Trunk -> Route Group -> Dial Plan -> PSTN Connection |
|
|
68
|
+
|
|
69
|
+
## Step 4: Prerequisites
|
|
70
|
+
|
|
71
|
+
### 4a. Location exists
|
|
72
|
+
|
|
73
|
+
Trunks, route lists, and PSTN connections are location-scoped. Confirm the target location:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
wxcli locations list --output json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Capture the `location_id` for the target location.
|
|
80
|
+
|
|
81
|
+
### 4b. PSTN provider / SBC credentials ready
|
|
82
|
+
|
|
83
|
+
For premises-based PSTN (local gateway trunks), the user needs:
|
|
84
|
+
|
|
85
|
+
| Trunk Type | Requirements |
|
|
86
|
+
|-----------|-------------|
|
|
87
|
+
| **Registering** (`REGISTERING`) | Cisco CUBE Local Gateway. Needs a password for SIP registration. |
|
|
88
|
+
| **Certificate-based** (`CERTIFICATE_BASED`) | Cisco UBE, Oracle ACME, AudioCodes, or Ribbon SBC. Needs FQDN/SRV address, domain, port, and max concurrent calls. |
|
|
89
|
+
|
|
90
|
+
For cloud-connected PSTN (CCP), the provider must already be set up in Control Hub.
|
|
91
|
+
|
|
92
|
+
### 4c. Existing routing components (if building on top of them)
|
|
93
|
+
|
|
94
|
+
Check what already exists:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# List existing trunks
|
|
98
|
+
wxcli call-routing list-trunks --output json
|
|
99
|
+
|
|
100
|
+
# List existing route groups
|
|
101
|
+
wxcli call-routing list-route-groups --output json
|
|
102
|
+
|
|
103
|
+
# List existing dial plans
|
|
104
|
+
wxcli call-routing list-dial-plans --output json
|
|
105
|
+
|
|
106
|
+
# List existing translation patterns
|
|
107
|
+
wxcli call-routing list-translation-patterns --output json
|
|
108
|
+
|
|
109
|
+
# List existing route lists
|
|
110
|
+
wxcli call-routing list-route-lists --output json
|
|
111
|
+
|
|
112
|
+
# Check current PSTN connection for a location
|
|
113
|
+
wxcli pstn list-connection LOCATION_ID --output json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 4d. Dependency chain -- `[STRICT ORDER]`
|
|
117
|
+
|
|
118
|
+
Routing components have hard dependencies. You **must** create them in this order:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
1: Trunk (SIP connection to SBC/LGW)
|
|
122
|
+
|
|
|
123
|
+
2: Route Group (optional -- bundles trunks for failover)
|
|
124
|
+
|
|
|
125
|
+
+---> 3a: Dial Plan (pattern matching -> trunk or route group)
|
|
126
|
+
|
|
|
127
|
+
+---> 3b: Route List (optional -- for Dedicated Instance cloud PSTN)
|
|
128
|
+
|
|
|
129
|
+
4: PSTN Connection (points a location to trunk or route group)
|
|
130
|
+
|
|
|
131
|
+
5: Translation Pattern (independent -- digit rewrite before outbound routing)
|
|
132
|
+
|
|
|
133
|
+
6: Test Call Routing (validate the configuration)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Why this order matters:**
|
|
137
|
+
- A Dial Plan requires an existing trunk or route group as its route choice -- you cannot create a dial plan without one.
|
|
138
|
+
- A Route Group requires existing trunk(s) -- you cannot create a route group without trunks.
|
|
139
|
+
- A Route List requires an existing route group.
|
|
140
|
+
- Dial Plans and Route Lists are parallel branches from Route Group -- neither depends on the other.
|
|
141
|
+
- PSTN Connection points to either a trunk or route group -- they must exist first.
|
|
142
|
+
- Translation Patterns have no dependencies -- they can be created at any point.
|
|
143
|
+
- **Each dial plan has exactly one route target** (one trunk or one route group). To route different patterns to different targets, create separate dial plans.
|
|
144
|
+
|
|
145
|
+
**Deletion order (reverse):**
|
|
146
|
+
|
|
147
|
+
When tearing down routing, delete in reverse: PSTN Connection → Route Lists → Dial Plans → Route Groups → Trunks. A trunk cannot be deleted if it's referenced by a route group; a route group cannot be deleted if it's referenced by a dial plan or route list. The API returns error 27350 when you try to delete a component that's still referenced.
|
|
148
|
+
|
|
149
|
+
### 4e. Component CLI reference -- Trunks
|
|
150
|
+
|
|
151
|
+
A trunk is a SIP connection between Webex Calling and an on-premises local gateway or SBC.
|
|
152
|
+
|
|
153
|
+
**List available trunk types:**
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
wxcli call-routing list-trunk-types --output json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Create a registering trunk (Cisco CUBE):**
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
wxcli call-routing create-trunks \
|
|
163
|
+
--name "HQ-LGW-01" \
|
|
164
|
+
--location-id LOCATION_ID \
|
|
165
|
+
--password "SecurePass123!" \
|
|
166
|
+
--trunk-type REGISTERING
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Create a certificate-based trunk (third-party SBC):**
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
wxcli call-routing create-trunks \
|
|
173
|
+
--name "HQ-SBC-01" \
|
|
174
|
+
--location-id LOCATION_ID \
|
|
175
|
+
--password "SecurePass123!" \
|
|
176
|
+
--trunk-type CERTIFICATE_BASED \
|
|
177
|
+
--address "sbc.example.com" \
|
|
178
|
+
--domain "example.com" \
|
|
179
|
+
--port 5061 \
|
|
180
|
+
--max-concurrent-calls 100
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**View trunk details and status:**
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
wxcli call-routing show-trunks TRUNK_ID --output json
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The response includes `status` (online/offline/unknown), `sipAuthenticationUserName`, `linePort`, and `otgDtgId` -- all needed for SBC configuration.
|
|
190
|
+
|
|
191
|
+
**Check trunk usage (what's connected to it):**
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
wxcli call-routing show TRUNK_ID --output json
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Delete a trunk:**
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
wxcli call-routing delete-trunks TRUNK_ID
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Trunk limitations:**
|
|
204
|
+
- You cannot change `trunkType`, `locationId`, or `deviceType` after creation. Delete and recreate instead.
|
|
205
|
+
- `name` and `password` are always required on updates.
|
|
206
|
+
|
|
207
|
+
### 4f. Component CLI reference -- Route Groups
|
|
208
|
+
|
|
209
|
+
A route group bundles up to 10 trunks (from different locations) with priority-based failover.
|
|
210
|
+
|
|
211
|
+
**Create a route group:**
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
wxcli call-routing create-route-groups \
|
|
215
|
+
--name "US-East-RG" \
|
|
216
|
+
--json-body '{"localGateways": [{"id": "TRUNK_ID_1", "priority": 1}, {"id": "TRUNK_ID_2", "priority": 2}]}'
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
> **NOTE:** The `localGateways` array requires `--json-body` because it's a nested object the CLI cannot express as flat options. Each entry uses `id` (not `trunkId`) for the trunk identifier.
|
|
220
|
+
|
|
221
|
+
**View route group details:**
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
wxcli call-routing show-route-groups ROUTE_GROUP_ID --output json
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Check route group usage:**
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
wxcli call-routing show-usage ROUTE_GROUP_ID --output json
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Delete a route group:**
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
wxcli call-routing delete-route-groups ROUTE_GROUP_ID
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 4g. Component CLI reference -- Dial Plans
|
|
240
|
+
|
|
241
|
+
Dial plans route outbound calls by matching dialed patterns to a trunk or route group. They are **org-wide** (not per-location).
|
|
242
|
+
|
|
243
|
+
**Dial pattern rules:**
|
|
244
|
+
- `!` matches any sequence of digits. Can only appear once at the end. Only valid in E.164 patterns.
|
|
245
|
+
- `X` matches a single digit (0-9).
|
|
246
|
+
- Example E.164: `+1408!` matches any number starting with +1408.
|
|
247
|
+
- Example short: `9XXX` matches any 4-digit string starting with 9.
|
|
248
|
+
|
|
249
|
+
**Create a dial plan:**
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
wxcli call-routing create \
|
|
253
|
+
--name "US-Outbound" \
|
|
254
|
+
--route-id TRUNK_OR_ROUTE_GROUP_ID \
|
|
255
|
+
--route-type TRUNK
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
`--route-type` is either `TRUNK` or `ROUTE_GROUP`.
|
|
259
|
+
|
|
260
|
+
**Add dial patterns to a dial plan:**
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
wxcli call-routing update DIAL_PLAN_ID \
|
|
264
|
+
--json-body '{"dialPatterns": [{"dialPattern": "+1!", "action": "ADD"}]}'
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**Multi-destination routing (different patterns → different trunks/groups):**
|
|
268
|
+
|
|
269
|
+
Each dial plan has exactly one route target. To route US and UK calls to different trunks:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Dial plan 1: US calls → US route group (with failover)
|
|
273
|
+
wxcli call-routing create --name "US-Outbound" --route-id US_ROUTE_GROUP_ID --route-type ROUTE_GROUP
|
|
274
|
+
wxcli call-routing update US_DP_ID --json-body '{"dialPatterns": [{"dialPattern": "+1!", "action": "ADD"}]}'
|
|
275
|
+
|
|
276
|
+
# Dial plan 2: UK calls → UK trunk (direct)
|
|
277
|
+
wxcli call-routing create --name "UK-Outbound" --route-id UK_TRUNK_ID --route-type TRUNK
|
|
278
|
+
wxcli call-routing update UK_DP_ID --json-body '{"dialPatterns": [{"dialPattern": "+44!", "action": "ADD"}]}'
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Validate dial patterns before adding:**
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
wxcli call-routing validate-a-dial --json-body '{"dialPatterns": ["+1408!", "+44!", "9XXX"]}'
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**View a dial plan:**
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
wxcli call-routing show-dial-plans DIAL_PLAN_ID --output json
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**List which dial plans use a trunk:**
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
wxcli call-routing list TRUNK_ID --output json
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
> This lists dial plans that reference the given trunk — not patterns within a dial plan. To see a dial plan's details (including its route choice), use `show-dial-plans`.
|
|
300
|
+
|
|
301
|
+
**Modify a dial plan's route target (name, route-id, route-type):**
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
wxcli call-routing update-dial-plans DIAL_PLAN_ID \
|
|
305
|
+
--route-id NEW_TRUNK_OR_ROUTE_GROUP_ID \
|
|
306
|
+
--route-type ROUTE_GROUP
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Delete a dial plan:**
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
wxcli call-routing delete DIAL_PLAN_ID
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 4h. Component CLI reference -- Route Lists
|
|
316
|
+
|
|
317
|
+
Route lists are lists of phone numbers reachable via a route group. Used for Dedicated Instance cloud PSTN connectivity.
|
|
318
|
+
|
|
319
|
+
**Create a route list:**
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
wxcli call-routing create-route-lists \
|
|
323
|
+
--name "US-East-Numbers" \
|
|
324
|
+
--location-id LOCATION_ID \
|
|
325
|
+
--route-group-id ROUTE_GROUP_ID
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Add numbers to a route list:**
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
wxcli call-routing update-numbers ROUTE_LIST_ID \
|
|
332
|
+
--json-body '{"numbers": [{"number": "+19195551234", "action": "ADD"}, {"number": "+19195555678", "action": "ADD"}]}'
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**List numbers on a route list:**
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
wxcli call-routing list-numbers ROUTE_LIST_ID --output json
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**View route list details:**
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
wxcli call-routing show-route-lists ROUTE_LIST_ID --output json
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Delete a route list:**
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
wxcli call-routing delete-route-lists ROUTE_LIST_ID
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### 4i. Component CLI reference -- Translation Patterns
|
|
354
|
+
|
|
355
|
+
Translation patterns rewrite dialed digits **before routing** (outbound calls only). They can be org-level or location-level.
|
|
356
|
+
|
|
357
|
+
**Common use cases:**
|
|
358
|
+
|
|
359
|
+
| Pattern | Matching | Replacement | Purpose |
|
|
360
|
+
|---------|----------|-------------|---------|
|
|
361
|
+
| Strip access code | `9XXX` | `XXX` | Remove leading '9' prefix for external dialing |
|
|
362
|
+
| Add country code | `XXXXXXXXXX` | `+1XXXXXXXXXX` | Prepend +1 to 10-digit national numbers |
|
|
363
|
+
| Site-specific rewrite | `+1919555XXXX` | `+19196660000` | Redirect a number range to a specific destination |
|
|
364
|
+
| Short code to E.164 | `411` | `+18005551212` | Map short codes to full numbers |
|
|
365
|
+
|
|
366
|
+
**Create org-level translation pattern:**
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
wxcli call-routing create-translation-patterns-call-routing \
|
|
370
|
+
--name "Strip-9-Prefix" \
|
|
371
|
+
--matching-pattern "9XXX" \
|
|
372
|
+
--replacement-pattern "XXX"
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**Create location-level translation pattern:**
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
wxcli call-routing create-translation-patterns-call-routing-1 \
|
|
379
|
+
--name "Local-Rewrite" \
|
|
380
|
+
--matching-pattern "+1919555XXXX" \
|
|
381
|
+
--replacement-pattern "+19196660000" \
|
|
382
|
+
--location-id LOCATION_ID
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**View translation patterns:**
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
# List all translation patterns (org and location)
|
|
389
|
+
wxcli call-routing list-translation-patterns --output json
|
|
390
|
+
|
|
391
|
+
# Show a specific org-level pattern
|
|
392
|
+
wxcli call-routing show-translation-patterns-call-routing PATTERN_ID --output json
|
|
393
|
+
|
|
394
|
+
# Show a specific location-level pattern
|
|
395
|
+
wxcli call-routing show-translation-patterns-call-routing-1 PATTERN_ID --location-id LOCATION_ID --output json
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**Delete translation patterns:**
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
# Org-level
|
|
402
|
+
wxcli call-routing delete-translation-patterns-call-routing PATTERN_ID
|
|
403
|
+
|
|
404
|
+
# Location-level
|
|
405
|
+
wxcli call-routing delete-translation-patterns-call-routing-1 PATTERN_ID --location-id LOCATION_ID
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### 4j. Component CLI reference -- PSTN Connection (per-location)
|
|
409
|
+
|
|
410
|
+
The PSTN connection setting determines which provider handles calls for a specific location.
|
|
411
|
+
|
|
412
|
+
**PSTN connection types:**
|
|
413
|
+
|
|
414
|
+
| Type | Value | API Configurable? | Notes |
|
|
415
|
+
|------|-------|:-----------------:|-------|
|
|
416
|
+
| Local Gateway | `LOCAL_GATEWAY` | Yes | Points to a trunk or route group |
|
|
417
|
+
| Non-Integrated CCP | `NON_INTEGRATED_CCP` | Yes | Points to a CCP provider ID |
|
|
418
|
+
| Integrated CCP | `INTEGRATED_CCP` | No | Must be configured via Control Hub |
|
|
419
|
+
| Cisco PSTN | `CISCO_PSTN` | No | Must be configured via Control Hub |
|
|
420
|
+
|
|
421
|
+
**Check available PSTN options for a location:**
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
wxcli pstn list LOCATION_ID --output json
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Read current PSTN connection:**
|
|
428
|
+
|
|
429
|
+
```bash
|
|
430
|
+
wxcli pstn list-connection LOCATION_ID --output json
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**Set PSTN connection to a trunk:**
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
wxcli pstn update LOCATION_ID \
|
|
437
|
+
--json-body '{"premiseRouteType": "TRUNK", "premiseRouteId": "TRUNK_ID"}'
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Set PSTN connection to a route group:**
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
wxcli pstn update LOCATION_ID \
|
|
444
|
+
--json-body '{"premiseRouteType": "ROUTE_GROUP", "premiseRouteId": "ROUTE_GROUP_ID"}'
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
|
|
448
|
+
|
|
449
|
+
Before executing any commands, present the full plan to the user:
|
|
450
|
+
|
|
451
|
+
```
|
|
452
|
+
ROUTING DEPLOYMENT PLAN
|
|
453
|
+
=======================
|
|
454
|
+
Objective: [what the user wants to accomplish]
|
|
455
|
+
Location: [name] ([location_id])
|
|
456
|
+
|
|
457
|
+
Components to create (in dependency order):
|
|
458
|
+
|
|
459
|
+
1. Trunk: [name]
|
|
460
|
+
Type: [REGISTERING / CERTIFICATE_BASED]
|
|
461
|
+
Location: [location_name]
|
|
462
|
+
[FQDN/Port if certificate-based]
|
|
463
|
+
|
|
464
|
+
2. Route Group: [name] (if applicable)
|
|
465
|
+
Trunks: [trunk_1 (priority 1), trunk_2 (priority 2)]
|
|
466
|
+
|
|
467
|
+
3. Dial Plan: [name]
|
|
468
|
+
Route Choice: [trunk or route group name] ([type])
|
|
469
|
+
Patterns: [+1!, +44!, etc.]
|
|
470
|
+
|
|
471
|
+
4. Translation Patterns: (if applicable)
|
|
472
|
+
[matching_pattern] -> [replacement_pattern] ([org/location level])
|
|
473
|
+
|
|
474
|
+
5. PSTN Connection:
|
|
475
|
+
Location: [location_name]
|
|
476
|
+
Route Type: [TRUNK / ROUTE_GROUP]
|
|
477
|
+
Route Target: [trunk or route group name]
|
|
478
|
+
|
|
479
|
+
Prerequisites verified:
|
|
480
|
+
[check] Location exists
|
|
481
|
+
[check] SBC/gateway credentials available
|
|
482
|
+
[check] No conflicting dial patterns
|
|
483
|
+
|
|
484
|
+
Commands to execute:
|
|
485
|
+
wxcli call-routing create-trunks ...
|
|
486
|
+
wxcli call-routing create-route-groups ...
|
|
487
|
+
wxcli call-routing create ...
|
|
488
|
+
wxcli pstn update ...
|
|
489
|
+
|
|
490
|
+
Proceed? (yes/no)
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
**Wait for user confirmation before executing.**
|
|
494
|
+
|
|
495
|
+
> **WARNING:** Routing changes can affect live calls. Modifying dial plans, trunks, or PSTN connections on a production organization can immediately disrupt call routing for all users. Always confirm with the user and prefer off-hours changes for production environments.
|
|
496
|
+
|
|
497
|
+
## Step 6: Execute via wxcli
|
|
498
|
+
|
|
499
|
+
### 6a. Run commands in dependency order
|
|
500
|
+
|
|
501
|
+
Execute commands in strict dependency order (Step 4d): Trunk -> Route Group -> Dial Plan -> Translation Pattern -> PSTN Connection -> Route List.
|
|
502
|
+
|
|
503
|
+
Capture the ID returned by each create command -- subsequent commands need it as input.
|
|
504
|
+
|
|
505
|
+
### 6b. Handle errors
|
|
506
|
+
|
|
507
|
+
- **401/403**: Token expired or insufficient scopes -- run `wxcli configure`
|
|
508
|
+
- **400**: Validation error -- read the error message, common causes:
|
|
509
|
+
- Invalid dial pattern syntax
|
|
510
|
+
- Trunk name already exists
|
|
511
|
+
- Route group references a non-existent trunk
|
|
512
|
+
- **404**: Referenced resource doesn't exist -- verify IDs
|
|
513
|
+
- **409**: Name conflict -- ask user for alternate name
|
|
514
|
+
|
|
515
|
+
## Step 7: Verify the configuration
|
|
516
|
+
|
|
517
|
+
### Verify each component was created
|
|
518
|
+
|
|
519
|
+
```bash
|
|
520
|
+
# Verify trunk (check status: online/offline)
|
|
521
|
+
wxcli call-routing show-trunks TRUNK_ID --output json
|
|
522
|
+
|
|
523
|
+
# Verify route group (check localGateways populated)
|
|
524
|
+
wxcli call-routing show-route-groups ROUTE_GROUP_ID --output json
|
|
525
|
+
|
|
526
|
+
# Verify dial plan (check routeId and routeType)
|
|
527
|
+
wxcli call-routing show-dial-plans DIAL_PLAN_ID --output json
|
|
528
|
+
|
|
529
|
+
# Verify PSTN connection
|
|
530
|
+
wxcli pstn list-connection LOCATION_ID --output json
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### Test call routing end-to-end
|
|
534
|
+
|
|
535
|
+
The test call routing command simulates routing without placing an actual call:
|
|
536
|
+
|
|
537
|
+
```bash
|
|
538
|
+
wxcli call-routing test-call-routing \
|
|
539
|
+
--originator-id PERSON_ID \
|
|
540
|
+
--originator-type PEOPLE \
|
|
541
|
+
--destination "+19195551234"
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
Check the response for:
|
|
545
|
+
- `destinationType` -- should be `PSTN_NUMBER` for external calls
|
|
546
|
+
- `isRejected` -- should be `false`
|
|
547
|
+
- `routingAddress` -- the resolved address
|
|
548
|
+
- `callSourceInfo.dialPlanName` -- confirms which dial plan matched
|
|
549
|
+
|
|
550
|
+
To include translation pattern details in the test:
|
|
551
|
+
|
|
552
|
+
```bash
|
|
553
|
+
wxcli call-routing test-call-routing \
|
|
554
|
+
--originator-id PERSON_ID \
|
|
555
|
+
--originator-type PEOPLE \
|
|
556
|
+
--destination "+19195551234" \
|
|
557
|
+
--include-applied-services true
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
## Step 8: Report results
|
|
561
|
+
|
|
562
|
+
Present the creation results:
|
|
563
|
+
|
|
564
|
+
```
|
|
565
|
+
ROUTING CONFIGURED
|
|
566
|
+
==================
|
|
567
|
+
Location: [location_name]
|
|
568
|
+
|
|
569
|
+
Components created:
|
|
570
|
+
Trunk: [name] (ID: [trunk_id], Status: [online/offline])
|
|
571
|
+
Route Group: [name] (ID: [rg_id], Trunks: [count])
|
|
572
|
+
Dial Plan: [name] (ID: [dp_id], Patterns: [count])
|
|
573
|
+
PSTN Connection: [type] -> [target_name]
|
|
574
|
+
|
|
575
|
+
Test Routing Result:
|
|
576
|
+
+19195551234 -> PSTN_NUMBER via [trunk_name]
|
|
577
|
+
Rejected: false
|
|
578
|
+
|
|
579
|
+
Next steps:
|
|
580
|
+
- Monitor trunk status (should show "online" once SBC registers)
|
|
581
|
+
- Add additional dial patterns as needed
|
|
582
|
+
- Configure translation patterns for digit manipulation
|
|
583
|
+
- Set up additional locations with PSTN connections
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## Critical Rules
|
|
589
|
+
|
|
590
|
+
1. **Strict dependency order.** Create Trunk → Route Group → then Dial Plan and Route List (parallel) → PSTN Connection. Reversing the order will fail because each component references the one before it.
|
|
591
|
+
2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing. Routing changes can affect live calls immediately.
|
|
592
|
+
3. **Dial plans require an existing trunk or route group.** You cannot create a standalone dial plan without a route choice.
|
|
593
|
+
4. **Trunk type, location, and device type are immutable after creation.** To change any of these, delete and recreate the trunk.
|
|
594
|
+
5. **Trunk updates always require name + password.** Even if you're only changing one field, both must be sent.
|
|
595
|
+
6. **Route groups are limited to 10 trunks** from different locations.
|
|
596
|
+
7. **Translation pattern E.164 replacements must use fully specified digits.** `+1919666XXXX` is rejected as a replacement pattern -- use `+19196660000` instead. `X` wildcards ARE valid in non-E.164 replacements (e.g., `9XXX` -> `XXX`).
|
|
597
|
+
8. **Only LOCAL_GATEWAY and NON_INTEGRATED_CCP are API-configurable** for PSTN connections. INTEGRATED_CCP and CISCO_PSTN must be configured via Control Hub.
|
|
598
|
+
9. **Test call routing requires a calling-enabled user as originator.** Passing a non-calling user's ID returns 404.
|
|
599
|
+
10. **Dial plans are org-wide, not per-location.** A dial plan applies to all users across all locations in the organization.
|
|
600
|
+
11. **Route group `--json-body` is required** for specifying trunks with priorities. The CLI cannot express the nested `localGateways` array as flat options.
|
|
601
|
+
12. **Translation patterns are outbound only.** They manipulate digits before outbound routing. They do not affect inbound call routing.
|
|
602
|
+
13. **Raw HTTP URL prefixes differ by component.** Dial plans/trunks/route groups/route lists use `/premisePstn/`. Translation patterns use `/callRouting/`. PSTN connections use `/telephony/pstn/`. Getting the prefix wrong returns 404. See `docs/reference/call-routing.md` for full URL tables.
|
|
603
|
+
14. **Production routing changes should be done off-hours.** Modifying dial plans, trunks, or PSTN connections can immediately disrupt live call routing.
|
|
604
|
+
15. **Dial plan `dialPatterns` format differs between CREATE and MODIFY.** CREATE (POST) takes a plain string array: `["pattern1", "pattern2"]`. MODIFY (PUT on `/{id}/dialPatterns`) takes objects with action: `[{"dialPattern": "+1!", "action": "ADD"}]`. Using the modify format on create returns 400 "Invalid field value: dialPatterns".
|
|
605
|
+
16. **Delete command names use plural suffixes.** `delete-trunks`, `delete-route-groups`, `delete-route-lists`. Dial plan delete is just `delete` (no suffix). Translation pattern delete is `delete-translation-patterns-call-routing`. Always check `wxcli call-routing --help` if unsure.
|
|
606
|
+
|
|
607
|
+
---
|
|
608
|
+
|
|
609
|
+
## Scope Quick Reference
|
|
610
|
+
|
|
611
|
+
| Operation | Scope |
|
|
612
|
+
|-----------|-------|
|
|
613
|
+
| Read trunks, route groups, dial plans, route lists, translation patterns | `spark-admin:telephony_config_read` |
|
|
614
|
+
| Create/update/delete trunks, route groups, dial plans, route lists, translation patterns | `spark-admin:telephony_config_write` |
|
|
615
|
+
| Test call routing | `spark-admin:telephony_config_write` |
|
|
616
|
+
| Validate phone numbers | `spark-admin:telephony_config_write` |
|
|
617
|
+
| Read PSTN connection settings | `spark-admin:telephony_pstn_read` |
|
|
618
|
+
| Configure PSTN connection settings | `spark-admin:telephony_pstn_write` |
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## Context Compaction Recovery
|
|
623
|
+
|
|
624
|
+
If context compacts mid-execution, recover by:
|
|
625
|
+
1. Read the deployment plan from `docs/plans/` to recover what was planned
|
|
626
|
+
2. Check what's already been created: run the relevant `list` commands for each component
|
|
627
|
+
3. Resume from the first incomplete step in the dependency chain
|