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,757 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: manage-call-settings
|
|
3
|
+
description: |
|
|
4
|
+
Configure person-level and workspace-level call settings in Webex Calling.
|
|
5
|
+
Covers 39+ settings organized into categories: call handling, voicemail & media,
|
|
6
|
+
permissions, and behavior & devices. Includes phone number add/remove/reassign,
|
|
7
|
+
executive-assistant delegation, hoteling, shared line appearance, simultaneous ring,
|
|
8
|
+
sequential ring, single number reach, receptionist client, and workspace hoteling.
|
|
9
|
+
Use when the user wants to read, change, or audit call settings for one or more
|
|
10
|
+
users/workspaces.
|
|
11
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
12
|
+
argument-hint: [person-email-or-workspace-name]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<!-- Updated by playbook session 2026-04-23 -->
|
|
16
|
+
|
|
17
|
+
# Manage Call Settings Workflow
|
|
18
|
+
|
|
19
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
20
|
+
1. What are the two path families for person call settings, and which is newer? (Answer: `/people/{id}/features/{feature}` is classic; `/telephony/config/people/{id}/{feature}` is newer. Some setting names differ between them.)
|
|
21
|
+
2. What happens when you use `/telephony/config/workspaces/{id}/` settings on a Basic-licensed workspace? (Answer: 405 "Invalid Professional Place" — only `musicOnHold` and `doNotDisturb` work on Basic. Use `/workspaces/{id}/features/` path for Basic workspaces.)
|
|
22
|
+
3. What wxcli command group handles org/location call recording? (Answer: `call-recording`, NOT `location-settings`. Run `wxcli call-recording --help` to confirm.)
|
|
23
|
+
|
|
24
|
+
If you cannot answer all three, you skipped reading this skill. Go back and read it.
|
|
25
|
+
|
|
26
|
+
**MANDATORY: Before including ANY wxcli command in your plan, verify it exists.** Run `wxcli <group> --help` to confirm the command group exists and list its commands. If you cannot run `--help` (e.g., plan-only mode), use ONLY commands listed in the Quick Recipes section below. Do NOT construct command names from reference doc titles or API concepts — the CLI group names often differ from the API concept names (e.g., location recording config uses `wxcli call-recording`, NOT `wxcli location-settings`).
|
|
27
|
+
|
|
28
|
+
## Quick Recipes — Use These Exact Commands
|
|
29
|
+
|
|
30
|
+
**These are the authoritative command names. Use them exactly as shown. Do NOT construct command names from reference doc terminology.**
|
|
31
|
+
|
|
32
|
+
### Recording setup (3-level prerequisite chain)
|
|
33
|
+
```bash
|
|
34
|
+
wxcli call-recording show -o json # 1. Org-level recording vendor
|
|
35
|
+
wxcli call-recording list-vendors -o json # 2. Per-location vendor assignment
|
|
36
|
+
wxcli user-settings show-call-recording PERSON_ID -o json # 3. Person recording
|
|
37
|
+
wxcli user-settings update-call-recording PERSON_ID --json-body '{"enabled": true, "record": "Always"}'
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Voicemail transcription (location-scoped — affects ALL users at location)
|
|
41
|
+
```bash
|
|
42
|
+
wxcli location-voicemail show LOCATION_ID -o json # Location voicemail policy
|
|
43
|
+
wxcli location-voicemail update LOCATION_ID --json-body '{"voiceMessageTranscriptionEnabled": true}'
|
|
44
|
+
wxcli user-settings update-voicemail PERSON_ID --json-body '{"enabled": true, "emailCopyOfMessage": {"enabled": true, "emailId": "user@example.com"}}'
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Voicemail self-service (user-level OAuth — Phase 5)
|
|
48
|
+
```bash
|
|
49
|
+
wxcli call-settings-for-me-phase-5 show -o json # Show own voicemail settings
|
|
50
|
+
wxcli call-settings-for-me-phase-5 update --json-body '{"enabled": true, "sendUnansweredCalls": {"enabled": true, "numberOfRings": 6}}'
|
|
51
|
+
wxcli call-settings-for-me-phase-5 show-rules -o json # Show voicemail PIN rules
|
|
52
|
+
wxcli call-settings-for-me-phase-5 update-pin --json-body '{"pin": "123456"}' # Reset/change voicemail PIN
|
|
53
|
+
```
|
|
54
|
+
- Requires **user-level OAuth** token (`spark:people_read` / `spark:people_write`). Admin tokens will not work.
|
|
55
|
+
- These are `/people/me/` endpoints — the authenticated user configures their own settings.
|
|
56
|
+
|
|
57
|
+
### Hoteling self-service (user-level OAuth — Phase 5)
|
|
58
|
+
```bash
|
|
59
|
+
wxcli call-settings-for-me-phase-5 show-guest -o json # Show own hoteling guest settings
|
|
60
|
+
wxcli call-settings-for-me-phase-5 update-guest --json-body '{"enabled": true}' # Enable self as hoteling guest
|
|
61
|
+
wxcli call-settings-for-me-phase-5 list -o json # List available hoteling hosts
|
|
62
|
+
```
|
|
63
|
+
- Requires **user-level OAuth** token. Admin tokens will not work.
|
|
64
|
+
- The admin path for hoteling guest is `wxcli user-settings update-hoteling PERSON_ID`. Use the self-service path when the user is configuring their own hoteling.
|
|
65
|
+
|
|
66
|
+
### Call forwarding (PUT replaces entire object — read first, carry ALL blocks)
|
|
67
|
+
```bash
|
|
68
|
+
wxcli user-settings show-call-forwarding PERSON_ID -o json
|
|
69
|
+
wxcli user-settings update-call-forwarding PERSON_ID --json-body '{
|
|
70
|
+
"always": {"enabled": false},
|
|
71
|
+
"busy": {"enabled": true, "destination": "+15551234567", "destinationVoicemailEnabled": false},
|
|
72
|
+
"noAnswer": {"enabled": false, "numberOfRings": 3},
|
|
73
|
+
"businessContinuity": {"enabled": false}
|
|
74
|
+
}'
|
|
75
|
+
```
|
|
76
|
+
Note: 4 blocks (always, busy, noAnswer, businessContinuity). selectiveForward is a SEPARATE API.
|
|
77
|
+
|
|
78
|
+
### Workspace hoteling
|
|
79
|
+
```bash
|
|
80
|
+
wxcli device-settings update-devices-workspaces WORKSPACE_ID --enabled # Enable workspace hoteling host
|
|
81
|
+
wxcli user-settings update-hoteling PERSON_ID --json-body '{"enabled": true}' # Person hoteling guest (simple toggle)
|
|
82
|
+
```
|
|
83
|
+
- Workspace hoteling host requires **Professional** workspace license (Basic returns 405).
|
|
84
|
+
- Supports `--limit-guest-use` + `--guest-hours-limit N` for time-limited guest sessions.
|
|
85
|
+
- Guest users must ALSO have person-level hoteling enabled (`user-settings update-hoteling`) to sign in.
|
|
86
|
+
|
|
87
|
+
### Receptionist client
|
|
88
|
+
```bash
|
|
89
|
+
wxcli user-settings list-reception PERSON_ID -o json
|
|
90
|
+
wxcli user-settings update-reception PERSON_ID --json-body '{"receptionEnabled": true, "monitoredMembers": ["ID1", "ID2"]}'
|
|
91
|
+
```
|
|
92
|
+
- API path is `/features/reception` (NOT `/features/receptionist`). Person-level only — no workspace equivalent.
|
|
93
|
+
- `receptionEnabled` must be `true` if `monitoredMembers` is non-empty.
|
|
94
|
+
- Max 50 monitored members. Members can be person or workspace IDs.
|
|
95
|
+
|
|
96
|
+
### SimRing for persons (admin-configurable)
|
|
97
|
+
```bash
|
|
98
|
+
wxcli user-settings list-simultaneous-ring PERSON_ID -o json
|
|
99
|
+
wxcli user-settings update-simultaneous-ring PERSON_ID --enabled --json-body '{"enabled":true,"phoneNumbers":[{"phoneNumber":"+15551234567"}]}'
|
|
100
|
+
wxcli user-settings create-criteria-simultaneous-ring PERSON_ID --json-body '{"name":"After hours","phoneNumbers":["+15551234567"]}'
|
|
101
|
+
wxcli user-settings show-criteria-simultaneous-ring PERSON_ID ID -o json
|
|
102
|
+
wxcli user-settings update-criteria-simultaneous-ring PERSON_ID ID --json-body '{"enabled":true}'
|
|
103
|
+
wxcli user-settings delete-criteria-simultaneous-ring PERSON_ID ID
|
|
104
|
+
```
|
|
105
|
+
- Person SimRing now has an admin path via `user-settings` — `list-simultaneous-ring` / `update-simultaneous-ring` configure the base setting (enabled, do-not-ring-if-on-call, numbers); the `criteria-simultaneous-ring` commands manage schedule-based ring criteria.
|
|
106
|
+
- **Workspace SimRing is also admin-configurable:** `wxcli workspace-settings list-simultaneous-ring WORKSPACE_ID` and `update-simultaneous-ring` exist. Use those for workspaces instead of the `user-settings` commands.
|
|
107
|
+
- SNR (`single-number-reach`) remains a valid alternative for the desk + mobile ring-simultaneously use case, but it is no longer the only admin-configurable option for person SimRing:
|
|
108
|
+
```bash
|
|
109
|
+
wxcli single-number-reach list-single-number-reach PERSON_ID -o json
|
|
110
|
+
wxcli single-number-reach create PERSON_ID --phone-number "+15551234567" --enabled --name "Mobile"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Executive-assistant pairing (3-step process)
|
|
114
|
+
```bash
|
|
115
|
+
# Step 1: Assign roles
|
|
116
|
+
wxcli user-settings update-executive-assistant EXEC_ID --json-body '{"type": "EXECUTIVE"}'
|
|
117
|
+
wxcli user-settings update-executive-assistant ASST_ID --json-body '{"type": "EXECUTIVE_ASSISTANT"}'
|
|
118
|
+
# Step 2: Link the assistant to the executive
|
|
119
|
+
wxcli user-settings update-assigned-assistants EXEC_ID --json-body '{"assistantIds": ["ASST_ID"]}'
|
|
120
|
+
# Step 3: Verify both sides
|
|
121
|
+
wxcli user-settings show-executive-assistant EXEC_ID -o json
|
|
122
|
+
wxcli user-settings list-assigned-assistants EXEC_ID -o json
|
|
123
|
+
```
|
|
124
|
+
- Both users require **Professional** Calling license (Basic does not support exec-asst).
|
|
125
|
+
- Type assignment uses `people_write` scope; assigned-assistants linkage uses `telephony_config_write` scope.
|
|
126
|
+
- Rollback: set both to `--type UNASSIGNED` (auto-unlinks).
|
|
127
|
+
|
|
128
|
+
### Command group mapping (do NOT guess — use this table)
|
|
129
|
+
| Setting domain | wxcli group | NOT this group |
|
|
130
|
+
|---------------|-------------|----------------|
|
|
131
|
+
| Org call recording | `call-recording` | ~~location-settings~~ |
|
|
132
|
+
| Location voicemail | `location-voicemail` | ~~location-settings~~ |
|
|
133
|
+
| Person settings | `user-settings` | — |
|
|
134
|
+
| Workspace settings | `workspace-settings` | — |
|
|
135
|
+
| Workspace hoteling | `device-settings` | ~~workspace-settings~~ |
|
|
136
|
+
| Self-service voicemail/hoteling (Phase 5) | `call-settings-for-me-phase-5` | ~~my-call-settings~~ |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Step 1: Load references (only what you need)
|
|
141
|
+
|
|
142
|
+
Load ONLY the reference docs relevant to the user's specific request. Do NOT load all 4 by default.
|
|
143
|
+
|
|
144
|
+
| If the request involves... | Load this doc |
|
|
145
|
+
|---------------------------|---------------|
|
|
146
|
+
| Forwarding, DND, call waiting, sim ring, SNR | `docs/reference/person-call-settings-handling.md` |
|
|
147
|
+
| Voicemail, caller ID, recording, intercept, monitoring | `docs/reference/person-call-settings-media.md` |
|
|
148
|
+
| Permissions, executive/assistant, feature access | `docs/reference/person-call-settings-permissions.md` |
|
|
149
|
+
| Hoteling, receptionist, calling behavior, numbers | `docs/reference/person-call-settings-behavior.md` |
|
|
150
|
+
| Self-service settings (user-level OAuth) | `docs/reference/self-service-call-settings.md` |
|
|
151
|
+
|
|
152
|
+
**For recording + voicemail scenarios:** Load `person-call-settings-media.md` only. The location-level recording commands are in the Quick Recipes above — you do NOT need to load any location-settings docs.
|
|
153
|
+
|
|
154
|
+
## Step 2: Verify auth token
|
|
155
|
+
|
|
156
|
+
Before any API calls, confirm the user's auth token is working:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
wxcli whoami
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Check the token has the required scopes for the target operation.
|
|
163
|
+
|
|
164
|
+
### Required Scopes by Operation Type
|
|
165
|
+
|
|
166
|
+
| Scope | Grants |
|
|
167
|
+
|-------|--------|
|
|
168
|
+
| `spark-admin:people_read` | Read any person's call settings (admin) |
|
|
169
|
+
| `spark-admin:people_write` | Modify any person's call settings (admin) |
|
|
170
|
+
| `spark:people_read` | Read own call settings (self) |
|
|
171
|
+
| `spark:people_write` | Modify own call settings (self) |
|
|
172
|
+
| `spark-admin:telephony_config_read` | Read telephony config (SNR, MoH, App Services, ECBN, Numbers, Feature Access, Executive, etc.) |
|
|
173
|
+
| `spark-admin:telephony_config_write` | Modify telephony config |
|
|
174
|
+
| `spark-admin:workspaces_read` | Read workspace settings (outgoing permissions transfer numbers, access codes, call policy) |
|
|
175
|
+
| `spark-admin:workspaces_write` | Modify workspace settings |
|
|
176
|
+
|
|
177
|
+
### Which Settings Use Which Scopes
|
|
178
|
+
|
|
179
|
+
| `people_read/write` | `telephony_config_read/write` | `workspaces_read/write` |
|
|
180
|
+
|---------------------|-------------------------------|------------------------|
|
|
181
|
+
| Forwarding | Single Number Reach | Outgoing Permissions — Transfer Numbers |
|
|
182
|
+
| Call Waiting | Music on Hold | Outgoing Permissions — Access Codes |
|
|
183
|
+
| DND | Voicemail (passcode only) | Call Policy |
|
|
184
|
+
| Voicemail (main) | App Services (read) | |
|
|
185
|
+
| Caller ID | App Shared Line | |
|
|
186
|
+
| ~~Anon Call Rejection~~ *(user-only)* | Feature Access Controls | |
|
|
187
|
+
| Privacy | Executive Settings | |
|
|
188
|
+
| Barge-In | Numbers (update) | |
|
|
189
|
+
| Call Recording | Available Numbers | |
|
|
190
|
+
| Call Intercept | Preferred Answer | |
|
|
191
|
+
| Monitoring | MS Teams | |
|
|
192
|
+
| Push-to-Talk | Mode Management | |
|
|
193
|
+
| Incoming Permissions | Personal Assistant | |
|
|
194
|
+
| Outgoing Permissions (main) | ECBN | |
|
|
195
|
+
| Exec Assistant Type | Digit Patterns | |
|
|
196
|
+
| Calling Behavior | | |
|
|
197
|
+
| Call Bridge | | |
|
|
198
|
+
| Hoteling | | |
|
|
199
|
+
| Receptionist | | |
|
|
200
|
+
| Numbers (read) | | |
|
|
201
|
+
|
|
202
|
+
**Self-service scopes:** `call-settings-for-me-phase-5` commands use `spark:people_read` / `spark:people_write` (user-level, NOT admin). These are the same scopes as `my-call-settings`.
|
|
203
|
+
|
|
204
|
+
### Scope Verification Logic
|
|
205
|
+
|
|
206
|
+
1. Determine target type: **Person** needs `people_*` scopes; **Workspace** needs `workspaces_*` scopes
|
|
207
|
+
2. Determine operation: **Read** needs `*_read`; **Write** needs `*_write`
|
|
208
|
+
3. Check if the setting uses `telephony_config` scopes (see table above) — if so, verify those are present too
|
|
209
|
+
4. **Self-service commands** (`call-settings-for-me-phase-5`, `my-call-settings`): require user-level `spark:people_*` scopes, NOT admin scopes
|
|
210
|
+
5. If `wxcli whoami` does not show the required scopes, stop and tell the user which scopes are missing before proceeding
|
|
211
|
+
|
|
212
|
+
## Step 3: Identify the operation
|
|
213
|
+
|
|
214
|
+
Confirm with the user:
|
|
215
|
+
|
|
216
|
+
- **Target type:** Person or Workspace?
|
|
217
|
+
- **Target identifier:** Email address (person) or workspace name (workspace)?
|
|
218
|
+
- **Scope:** Single target, a list, or all users at a location?
|
|
219
|
+
|
|
220
|
+
### Look up a person
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
wxcli users list --email user@example.com --output json
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Extract the `id` field from the JSON output to use as `PERSON_ID` in subsequent commands.
|
|
227
|
+
|
|
228
|
+
### Look up a workspace
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
wxcli workspaces list --output json
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Filter by display name in the output. Extract the `id` field to use as `WORKSPACE_ID`.
|
|
235
|
+
|
|
236
|
+
### For bulk operations (all calling users)
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# List all users, then filter for calling-enabled users (those with a locationId)
|
|
240
|
+
wxcli users list --output json
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
For small batches, use a shell loop. For large batches (50+ users), use the migration engine's async pattern which handles concurrency, rate limiting, and retry automatically.
|
|
244
|
+
|
|
245
|
+
### Settings Catalog
|
|
246
|
+
|
|
247
|
+
### Settings Scope Router
|
|
248
|
+
|
|
249
|
+
**Before attempting any settings command, determine the correct scope.** The same setting often exists at multiple levels with different command groups.
|
|
250
|
+
|
|
251
|
+
#### Quick router: "Who/what am I configuring?"
|
|
252
|
+
|
|
253
|
+
| Target | Command group | Scope prefix | Example |
|
|
254
|
+
|--------|--------------|-------------|---------|
|
|
255
|
+
| A specific **person** | `wxcli user-settings` | `spark-admin:people_read/write` | `wxcli user-settings show-voicemail PERSON_ID` |
|
|
256
|
+
| A specific **workspace** | `wxcli workspace-settings` | `spark-admin:workspaces_read/write` | `wxcli workspace-settings show-voicemail WORKSPACE_ID` |
|
|
257
|
+
| All people/workspaces at a **location** | `wxcli location-voicemail` / `wxcli location-settings` | `spark-admin:telephony_config_read/write` | `wxcli location-voicemail show LOCATION_ID` |
|
|
258
|
+
| **Org-wide** recording vendor | `wxcli call-recording` | `spark-admin:telephony_config_read/write` | `wxcli call-recording show` |
|
|
259
|
+
| **Self** (own settings) | `wxcli my-call-settings` or `wxcli call-settings-for-me-phase-5` | `spark:people_read/write` | `wxcli call-settings-for-me-phase-5 show` |
|
|
260
|
+
|
|
261
|
+
#### Multi-scope settings — which command for what?
|
|
262
|
+
|
|
263
|
+
| Setting | Person | Workspace | Location | Org | Self-Service |
|
|
264
|
+
|---------|--------|-----------|----------|-----|-------------|
|
|
265
|
+
| **Voicemail** | `user-settings show-voicemail PERSON_ID` | `workspace-settings show-voicemail WS_ID` | `location-voicemail show LOC_ID` (policies) | — | `call-settings-for-me-phase-5 show` |
|
|
266
|
+
| **Voicemail PIN** | `user-settings reset-voicemail-pin PERSON_ID` | — | — | — | `call-settings-for-me-phase-5 update-pin` |
|
|
267
|
+
| **Voicemail PIN Rules** | — | — | — | — | `call-settings-for-me-phase-5 show-rules` |
|
|
268
|
+
| **Call Recording** | `user-settings show-call-recording PERSON_ID` | `workspace-settings show-call-recordings WS_ID` | — | `call-recording show` (vendor config) | — |
|
|
269
|
+
| **Music on Hold** | SDK only (telephony_config) | SDK only | `location-settings` (must enable first) | — | — |
|
|
270
|
+
| **Call Intercept** | `user-settings show-intercept PERSON_ID` | `workspace-settings show-intercept WS_ID` | Location defaults apply | — | — |
|
|
271
|
+
| **Call Forwarding** | `user-settings show-call-forwarding PERSON_ID` | `workspace-settings show-call-forwarding WS_ID` | — | — | — |
|
|
272
|
+
| **Hoteling Guest** | `user-settings show-hoteling PERSON_ID` | — | — | — | `call-settings-for-me-phase-5 show-guest` |
|
|
273
|
+
| **Hoteling Hosts** | — | — | — | — | `call-settings-for-me-phase-5 list` |
|
|
274
|
+
|
|
275
|
+
#### User-only settings (no admin endpoint — 404 guaranteed)
|
|
276
|
+
|
|
277
|
+
These 5 settings exist ONLY at `/people/me/settings/{feature}`. Admin tokens **always** get 404. With a **user-level OAuth token**, use `wxcli my-call-settings` (120 commands covering all self-service `/people/me/` endpoints including these 5). Without user-level OAuth, the user must configure these via the Webex app.
|
|
278
|
+
|
|
279
|
+
**Simultaneous Ring is no longer in this table** — it now has an admin path via `user-settings list-simultaneous-ring` / `update-simultaneous-ring` (plus `*-criteria-simultaneous-ring` for schedule-based criteria). See the SimRing recipe above.
|
|
280
|
+
|
|
281
|
+
| Setting | Self-service path | CLI group | Workspace equivalent? |
|
|
282
|
+
|---------|-------------------|-----------|----------------------|
|
|
283
|
+
| Sequential Ring | `/me/settings/sequentialRing` | `my-call-settings` | No |
|
|
284
|
+
| Priority Alert | `/me/settings/priorityAlert` | `my-call-settings` | No |
|
|
285
|
+
| Call Notify | `/me/settings/callNotify` | `my-call-settings` | No |
|
|
286
|
+
| Anonymous Call Reject | `/me/settings/anonymousCallReject` | `my-call-settings` | **Yes:** `workspace-settings` has admin endpoint |
|
|
287
|
+
| Call Policies | `/me/settings/callPolicies` | `my-call-settings` | **Yes:** workspace-level admin endpoint (Professional license required) |
|
|
288
|
+
|
|
289
|
+
**Phase 5 self-service commands** (`call-settings-for-me-phase-5`): These are NOT user-only — they have admin-path equivalents (`user-settings show-voicemail`, `user-settings update-hoteling`, `user-settings reset-voicemail-pin`). The Phase 5 group provides the self-service path for users to manage their own voicemail and hoteling settings with a user-level token. Route to this group when the user is configuring their own settings rather than an admin configuring someone else's.
|
|
290
|
+
|
|
291
|
+
**If the user asks to configure one of these for a person:** Stop and explain that no admin API exists. Offer the workspace-level alternative if applicable, or inform them the user must self-configure.
|
|
292
|
+
|
|
293
|
+
Present the user with the settings categories. Ask which settings they want to read or change.
|
|
294
|
+
|
|
295
|
+
#### Category 1: Call Handling
|
|
296
|
+
|
|
297
|
+
| Setting | CLI Command (show) | CLI Command (update) | Notes |
|
|
298
|
+
|---------|-------------------|---------------------|-------|
|
|
299
|
+
| Call Forwarding | `show-call-forwarding` | `update-call-forwarding` | Always, Busy, No-Answer, Business Continuity |
|
|
300
|
+
| Call Waiting | `show-call-waiting` | `update-call-waiting` | Simple on/off toggle |
|
|
301
|
+
| Do Not Disturb | `show-do-not-disturb` | `update-do-not-disturb` | Includes ring splash, Webex Go override |
|
|
302
|
+
| Simultaneous Ring | `list-simultaneous-ring` | `update-simultaneous-ring` | Admin-configurable via `user-settings`; `*-criteria-simultaneous-ring` commands manage schedule-based criteria |
|
|
303
|
+
| Sequential Ring | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/sequentialRing`** |
|
|
304
|
+
| Single Number Reach | `wxcli single-number-reach` group | `wxcli single-number-reach` group | Uses `telephony_config` scopes, not `people` scopes |
|
|
305
|
+
| Selective Accept | — | — | Criteria managed via separate CRUD methods (SDK only) |
|
|
306
|
+
| Selective Forward | — | — | Takes precedence over standard forwarding |
|
|
307
|
+
| Selective Reject | — | — | Highest priority of the selective features |
|
|
308
|
+
| Priority Alert | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/priorityAlert`** |
|
|
309
|
+
| Call Notify | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/callNotify`** |
|
|
310
|
+
|
|
311
|
+
#### Category 2: Voicemail & Media
|
|
312
|
+
|
|
313
|
+
| Setting | CLI Command (show) | CLI Command (update) | Notes |
|
|
314
|
+
|---------|-------------------|---------------------|-------|
|
|
315
|
+
| Voicemail | `show-voicemail` | `update-voicemail` | Inherits from location; greeting uploads via `configure-busy-voicemail`, `configure-no-answer` |
|
|
316
|
+
| Voicemail (self-service) | `call-settings-for-me-phase-5 show` | `call-settings-for-me-phase-5 update` | User-level OAuth only. User manages own voicemail settings |
|
|
317
|
+
| Voicemail PIN Rules | `call-settings-for-me-phase-5 show-rules` | — | User-level OAuth only. Read-only PIN policy |
|
|
318
|
+
| Voicemail PIN Reset | — | `call-settings-for-me-phase-5 update-pin` | User-level OAuth only. User resets own PIN |
|
|
319
|
+
| Caller ID | `list` | `update-caller-id-features` | |
|
|
320
|
+
| Anonymous Call Rejection | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/anonymousCallReject`; workspace-level uses `workspaces/{id}/anonymousCallReject`** |
|
|
321
|
+
| Privacy | `list-privacy` | `update-privacy` | Controls line monitoring, AA extension/name dialing |
|
|
322
|
+
| Barge-In | `show-barge-in` | `update-barge-in` | Enables FAC-based barge-in across locations |
|
|
323
|
+
| Call Recording | `show-call-recording` | `update-call-recording` | **Read scope is `people_read` not `people_write` (SDK doc bug)**; inherits from location recording vendor config |
|
|
324
|
+
| Call Intercept | `show-intercept` | `update-intercept` | Takes phone out of service; greeting upload via `configure-call-intercept` |
|
|
325
|
+
| Monitoring | `list-monitoring` | `update-monitoring` | Max 50 monitored elements (people, places, call park extensions) |
|
|
326
|
+
| Push-to-Talk | `list-push-to-talk` | `update-push-to-talk` | One-way or two-way intercom; allow/block member lists |
|
|
327
|
+
| Music on Hold | — | — | **Requires location-level MoH enabled first**; uses `telephony_config` scopes (SDK only for now) |
|
|
328
|
+
|
|
329
|
+
#### Category 3: Permissions
|
|
330
|
+
|
|
331
|
+
| Setting | CLI Command (show) | CLI Command (update) | Notes |
|
|
332
|
+
|---------|-------------------|---------------------|-------|
|
|
333
|
+
| Incoming Permissions | `show-incoming-permission` | `update-incoming-permission` | External transfer, internal calls, collect calls |
|
|
334
|
+
| Outgoing Permissions | `list-outgoing-permission` | `update-outgoing-permission` | Per-call-type (local, toll, international, etc.) |
|
|
335
|
+
| Feature Access Controls | — | — | Controls what users can self-modify (SDK only for now) |
|
|
336
|
+
| Executive/Assistant | `show-executive-assistant` | `update-executive-assistant` | UNASSIGNED, EXECUTIVE, or EXECUTIVE_ASSISTANT |
|
|
337
|
+
| Call Policy | — | — | **USER-ONLY for persons (via `/me/settings/callPolicies`); workspace-only at admin level (`workspaces/{id}/features/callPolicies`, professional license required)** |
|
|
338
|
+
|
|
339
|
+
#### Category 4: Behavior & Devices
|
|
340
|
+
|
|
341
|
+
| Setting | CLI Command (show) | CLI Command (update) | Notes |
|
|
342
|
+
|---------|-------------------|---------------------|-------|
|
|
343
|
+
| Calling Behavior | `show-calling-behavior` | `update-calling-behavior` | Which Webex telephony app handles calls |
|
|
344
|
+
| App Services | `show` | `update` | Client platforms (browser, desktop, tablet, mobile) and ring behavior |
|
|
345
|
+
| Hoteling | `show-hoteling` | `update-hoteling` | Person-level only (admin path). **Workspace hoteling:** use `wxcli device-settings update-devices-workspaces WORKSPACE_ID --enabled` |
|
|
346
|
+
| Hoteling (self-service) | `call-settings-for-me-phase-5 show-guest` | `call-settings-for-me-phase-5 update-guest` | User-level OAuth only. User manages own hoteling guest settings |
|
|
347
|
+
| Available Hoteling Hosts | `call-settings-for-me-phase-5 list` | — | User-level OAuth only. Lists hosts the user can sign into |
|
|
348
|
+
| Receptionist Client | `list-reception` | `update-reception` | `receptionEnabled` must be `true` if members set. Path: `/features/reception` (NOT receptionist) |
|
|
349
|
+
| Numbers | `list-numbers` | — | Primary + alternate numbers; distinctive ring patterns |
|
|
350
|
+
| Preferred Answer Endpoint | — | — | Which device/app answers by default (SDK only for now) |
|
|
351
|
+
| MS Teams | — | — | HIDE_WEBEX_APP, PRESENCE_SYNC (SDK only for now) |
|
|
352
|
+
| Mode Management | — | — | Operating mode assignments (SDK only for now) |
|
|
353
|
+
| Personal Assistant | — | — | Away status, transfer, alerting (SDK only for now) |
|
|
354
|
+
| Emergency Callback Number | — | — | DIRECT_LINE, LOCATION_ECBN, or LOCATION_MEMBER_NUMBER (SDK only for now) |
|
|
355
|
+
|
|
356
|
+
All CLI commands above are under `wxcli user-settings` unless otherwise noted. Run `wxcli user-settings --help` to see the full list. Self-service commands use `wxcli call-settings-for-me-phase-5` (run `wxcli call-settings-for-me-phase-5 --help` to see all 7 commands).
|
|
357
|
+
|
|
358
|
+
### Settings without CLI commands ("SDK only")
|
|
359
|
+
|
|
360
|
+
**6 USER-ONLY settings (no admin endpoint — require user-level OAuth token):**
|
|
361
|
+
SimRing, SequentialRing, PriorityAlert, CallNotify, AnonymousCallReject, CallPolicies (person-level).
|
|
362
|
+
These ONLY work at `/telephony/config/people/me/settings/{feature}` with a user token. Admin tokens get 404.
|
|
363
|
+
|
|
364
|
+
For other settings marked "SDK only" above (Music on Hold, Feature Access Controls, Preferred Answer, MS Teams, Mode Management, Personal Assistant, ECBN), use the raw HTTP fallback pattern with an **admin** token:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
# Read the current setting value
|
|
368
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
369
|
+
"https://webexapis.com/v1/telephony/config/people/{person_id}/{settingEndpoint}" | python3 -m json.tool
|
|
370
|
+
|
|
371
|
+
# Update via PUT (read-modify-write)
|
|
372
|
+
curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
|
|
373
|
+
"https://webexapis.com/v1/telephony/config/people/{person_id}/{settingEndpoint}" \
|
|
374
|
+
-d '{ ... }'
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Consult `docs/reference/person-call-settings-handling.md` (SimRing, SeqRing, Priority Alert, Selective features) or `docs/reference/person-call-settings-behavior.md` (ECBN, Mode Management, MS Teams, Personal Assistant, Preferred Answer) for the exact endpoint paths, required fields, and gotchas for each setting.
|
|
378
|
+
|
|
379
|
+
## Step 4: Check prerequisites
|
|
380
|
+
|
|
381
|
+
### 4a. Read current settings — always do this first
|
|
382
|
+
|
|
383
|
+
**CRITICAL: Always read the current value of any setting before proposing a change.** This prevents accidental overwrites and gives the user a clear before/after comparison.
|
|
384
|
+
|
|
385
|
+
#### Pattern for simple settings
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
# Call Waiting
|
|
389
|
+
wxcli user-settings show-call-waiting PERSON_ID --output json
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
#### Pattern for object settings
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
# Call Forwarding (always, busy, no-answer, business continuity)
|
|
396
|
+
wxcli user-settings show-call-forwarding PERSON_ID --output json
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
#### Pattern for settings with sub-components
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
# Voicemail (many nested fields)
|
|
403
|
+
wxcli user-settings show-voicemail PERSON_ID --output json
|
|
404
|
+
|
|
405
|
+
# DND (enabled + ring splash)
|
|
406
|
+
wxcli user-settings show-do-not-disturb PERSON_ID --output json
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
#### Reading multiple settings at once
|
|
410
|
+
|
|
411
|
+
For a full audit, read all relevant settings and review the JSON output:
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
# Read several settings for the same person
|
|
415
|
+
wxcli user-settings show-call-waiting PERSON_ID --output json
|
|
416
|
+
wxcli user-settings show-do-not-disturb PERSON_ID --output json
|
|
417
|
+
wxcli user-settings show-hoteling PERSON_ID --output json
|
|
418
|
+
wxcli user-settings show-call-forwarding PERSON_ID --output json
|
|
419
|
+
wxcli user-settings show-voicemail PERSON_ID --output json
|
|
420
|
+
wxcli user-settings show-caller-id PERSON_ID --output json
|
|
421
|
+
wxcli user-settings list-privacy PERSON_ID --output json
|
|
422
|
+
wxcli user-settings show-barge-in PERSON_ID --output json
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
#### Reading self-service settings (user-level OAuth)
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Read own voicemail settings
|
|
429
|
+
wxcli call-settings-for-me-phase-5 show --output json
|
|
430
|
+
|
|
431
|
+
# Read own hoteling guest settings
|
|
432
|
+
wxcli call-settings-for-me-phase-5 show-guest --output json
|
|
433
|
+
|
|
434
|
+
# Check voicemail PIN rules
|
|
435
|
+
wxcli call-settings-for-me-phase-5 show-rules --output json
|
|
436
|
+
|
|
437
|
+
# List available hoteling hosts
|
|
438
|
+
wxcli call-settings-for-me-phase-5 list --output json
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### 4b. Check for location-level dependencies
|
|
442
|
+
|
|
443
|
+
Use the exact commands from the Quick Recipes section. Key prerequisites:
|
|
444
|
+
|
|
445
|
+
| Setting | Verify command | Fix command |
|
|
446
|
+
|---------|----------------|-------------|
|
|
447
|
+
| Call Recording (org) | `wxcli call-recording show -o json` | `wxcli call-recording update --json-body '{...}'` |
|
|
448
|
+
| Call Recording (location vendor) | `wxcli call-recording list-vendors -o json` | `wxcli call-recording update-vendor-call-recording LOC_ID --json-body '{...}'` |
|
|
449
|
+
| Voicemail transcription | `wxcli location-voicemail show LOC_ID -o json` | `wxcli location-voicemail update LOC_ID --json-body '{...}'` |
|
|
450
|
+
| Music on Hold | No wxcli command — use Control Hub or SDK | — |
|
|
451
|
+
|
|
452
|
+
**Do NOT use `location-settings` for recording or voicemail.** That group handles dial patterns only.
|
|
453
|
+
|
|
454
|
+
### 4c. Verify scope coverage
|
|
455
|
+
|
|
456
|
+
Cross-reference the settings the user wants to change against the scopes table in Step 2. If any required scopes are missing from the token, stop and inform the user before building the plan.
|
|
457
|
+
|
|
458
|
+
## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
|
|
459
|
+
|
|
460
|
+
**CRITICAL: Always show the plan and get user confirmation before making changes.**
|
|
461
|
+
|
|
462
|
+
Format the plan as a table:
|
|
463
|
+
|
|
464
|
+
```
|
|
465
|
+
## Deployment Plan for: Jane Smith (jane@company.com)
|
|
466
|
+
|
|
467
|
+
| Setting | Current Value | New Value | Impact |
|
|
468
|
+
|---------|--------------|-----------|--------|
|
|
469
|
+
| Call Forwarding (Always) | Disabled | Enabled -> +12025551234 | All calls forwarded |
|
|
470
|
+
| DND | Disabled | Enabled (ring splash: on) | All callers get busy |
|
|
471
|
+
| Voicemail (rings) | 3 | 6 | More time before VM |
|
|
472
|
+
|
|
473
|
+
Affected scopes required: spark-admin:people_write
|
|
474
|
+
|
|
475
|
+
Proceed? (y/n)
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
## Step 6: Execute via wxcli — `[After user confirms plan]`
|
|
479
|
+
|
|
480
|
+
### 6a. Execute individual changes
|
|
481
|
+
|
|
482
|
+
#### Pattern: Simple toggle
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
# Enable Call Waiting
|
|
486
|
+
wxcli user-settings update-call-waiting PERSON_ID --json-body '{"enabled": true}'
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
#### Pattern: Object-based settings
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
# Enable DND with ring splash
|
|
493
|
+
wxcli user-settings update-do-not-disturb PERSON_ID --json-body '{"enabled": true, "ringSplashEnabled": true}'
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
#### Pattern: Complex nested settings (read first, modify fields, write back)
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
# 1. Read current forwarding — capture ALL 4 blocks
|
|
500
|
+
wxcli user-settings show-call-forwarding PERSON_ID --output json
|
|
501
|
+
# 2. PUT replaces entire object — include ALL blocks, modify only target
|
|
502
|
+
wxcli user-settings update-call-forwarding PERSON_ID --json-body '{
|
|
503
|
+
"always": {"enabled": false},
|
|
504
|
+
"busy": {"enabled": true, "destination": "+15551234567", "destinationVoicemailEnabled": false},
|
|
505
|
+
"noAnswer": {"enabled": false, "numberOfRings": 3},
|
|
506
|
+
"businessContinuity": {"enabled": false}
|
|
507
|
+
}'
|
|
508
|
+
```
|
|
509
|
+
Forwarding has 4 blocks: always, busy, noAnswer, businessContinuity. selectiveForward is a SEPARATE API.
|
|
510
|
+
|
|
511
|
+
#### Pattern: Voicemail configuration
|
|
512
|
+
|
|
513
|
+
```bash
|
|
514
|
+
# Update voicemail settings
|
|
515
|
+
wxcli user-settings update-voicemail PERSON_ID --json-body '{
|
|
516
|
+
"enabled": true,
|
|
517
|
+
"sendUnansweredCalls": {
|
|
518
|
+
"enabled": true,
|
|
519
|
+
"numberOfRings": 6
|
|
520
|
+
}
|
|
521
|
+
}'
|
|
522
|
+
|
|
523
|
+
# Upload voicemail greetings (json-body only — no --file flag)
|
|
524
|
+
wxcli user-settings configure-busy-voicemail PERSON_ID --json-body '{"type": "CUSTOM", ...}'
|
|
525
|
+
wxcli user-settings configure-no-answer PERSON_ID --json-body '{"type": "CUSTOM", ...}'
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
#### Pattern: Call intercept (take phone out of service)
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
# Enable call intercept
|
|
532
|
+
wxcli user-settings update-intercept PERSON_ID --json-body '{
|
|
533
|
+
"enabled": true,
|
|
534
|
+
"incoming": {
|
|
535
|
+
"type": "INTERCEPT_ALL"
|
|
536
|
+
}
|
|
537
|
+
}'
|
|
538
|
+
|
|
539
|
+
# Upload intercept greeting (json-body only — no --file flag)
|
|
540
|
+
wxcli user-settings configure-call-intercept PERSON_ID --json-body '{"type": "CUSTOM", ...}'
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
#### Pattern: Permissions
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
# Update incoming permissions
|
|
547
|
+
wxcli user-settings update-incoming-permission PERSON_ID --json-body '{
|
|
548
|
+
"externalTransfer": "ALLOW_ALL_EXTERNAL",
|
|
549
|
+
"internalCallsEnabled": true,
|
|
550
|
+
"collectCallsEnabled": false
|
|
551
|
+
}'
|
|
552
|
+
|
|
553
|
+
# Update outgoing permissions
|
|
554
|
+
wxcli user-settings update-outgoing-permission PERSON_ID --json-body '{
|
|
555
|
+
"callingPermissions": [
|
|
556
|
+
{"callType": "INTERNATIONAL", "action": "BLOCK"}
|
|
557
|
+
]
|
|
558
|
+
}'
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
#### Pattern: Executive/Assistant pairing
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
# Assign executive role
|
|
565
|
+
wxcli user-settings update-executive-assistant EXEC_PERSON_ID --json-body '{"type": "EXECUTIVE"}'
|
|
566
|
+
|
|
567
|
+
# Assign assistant role
|
|
568
|
+
wxcli user-settings update-executive-assistant ASST_PERSON_ID --json-body '{"type": "EXECUTIVE_ASSISTANT"}'
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
#### Pattern: Workspace settings
|
|
572
|
+
|
|
573
|
+
Workspace settings mirror person settings but use the workspace-settings command group. Check available commands:
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
wxcli workspace-settings --help
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
#### Pattern: Schedules
|
|
580
|
+
|
|
581
|
+
Person-level schedules have full CRUD support:
|
|
582
|
+
|
|
583
|
+
```bash
|
|
584
|
+
# List schedules
|
|
585
|
+
wxcli user-settings list-schedules PERSON_ID --output json
|
|
586
|
+
|
|
587
|
+
# Create a schedule
|
|
588
|
+
wxcli user-settings create PERSON_ID --json-body '{
|
|
589
|
+
"name": "Business Hours",
|
|
590
|
+
"type": "businessHours",
|
|
591
|
+
"events": []
|
|
592
|
+
}'
|
|
593
|
+
|
|
594
|
+
# Add an event to a schedule
|
|
595
|
+
wxcli user-settings create-events PERSON_ID SCHEDULE_ID --json-body '{
|
|
596
|
+
"name": "Weekdays",
|
|
597
|
+
"startDate": "2026-01-01",
|
|
598
|
+
"endDate": "2026-12-31",
|
|
599
|
+
"startTime": "09:00",
|
|
600
|
+
"endTime": "17:00",
|
|
601
|
+
"recurrence": {"recurWeekly": {"monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true}}
|
|
602
|
+
}'
|
|
603
|
+
|
|
604
|
+
# Show schedule detail
|
|
605
|
+
wxcli user-settings show-schedules PERSON_ID SCHEDULE_ID --output json
|
|
606
|
+
|
|
607
|
+
# Delete a schedule event (requires 4 positional args)
|
|
608
|
+
wxcli user-settings delete PERSON_ID SCHEDULE_TYPE SCHEDULE_ID EVENT_ID
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
#### Pattern: Reset voicemail PIN
|
|
612
|
+
|
|
613
|
+
```bash
|
|
614
|
+
wxcli user-settings reset-voicemail-pin PERSON_ID
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
#### Pattern: Self-service voicemail and hoteling (user-level OAuth)
|
|
618
|
+
|
|
619
|
+
```bash
|
|
620
|
+
# User updates own voicemail settings
|
|
621
|
+
wxcli call-settings-for-me-phase-5 update --json-body '{"enabled": true, "sendUnansweredCalls": {"enabled": true, "numberOfRings": 6}}'
|
|
622
|
+
|
|
623
|
+
# User resets own voicemail PIN
|
|
624
|
+
wxcli call-settings-for-me-phase-5 update-pin --json-body '{"pin": "123456"}'
|
|
625
|
+
|
|
626
|
+
# User enables self as hoteling guest
|
|
627
|
+
wxcli call-settings-for-me-phase-5 update-guest --json-body '{"enabled": true}'
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### 6b. Bulk changes
|
|
631
|
+
|
|
632
|
+
#### Shell loop for small batches
|
|
633
|
+
|
|
634
|
+
```bash
|
|
635
|
+
# Disable call waiting for a list of users
|
|
636
|
+
for ID in PERSON_ID_1 PERSON_ID_2 PERSON_ID_3; do
|
|
637
|
+
wxcli user-settings update-call-waiting "$ID" --json-body '{"enabled": false}'
|
|
638
|
+
done
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
#### Bulk operations for large batches (50+ users)
|
|
642
|
+
|
|
643
|
+
For large batches, use shell loops with sleep for rate limiting, or reference the migration engine's async pattern for maximum throughput with concurrency control.
|
|
644
|
+
|
|
645
|
+
```bash
|
|
646
|
+
# Example: disable call waiting for all users via shell loop
|
|
647
|
+
for USER_ID in $(wxcli people list --calling-data --output json | python3 -c "
|
|
648
|
+
import sys, json
|
|
649
|
+
for u in json.load(sys.stdin).get('items', []):
|
|
650
|
+
if u.get('locationId'): print(u['id'])
|
|
651
|
+
"); do
|
|
652
|
+
wxcli user-settings update-call-waiting "$USER_ID" --enabled false
|
|
653
|
+
sleep 1
|
|
654
|
+
])
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
## Step 7: Verify — `[Read back after every update]`
|
|
658
|
+
|
|
659
|
+
Always read back the setting after writing to confirm the change took effect:
|
|
660
|
+
|
|
661
|
+
```bash
|
|
662
|
+
# After updating call waiting
|
|
663
|
+
wxcli user-settings show-call-waiting PERSON_ID --output json
|
|
664
|
+
|
|
665
|
+
# After updating forwarding
|
|
666
|
+
wxcli user-settings show-call-forwarding PERSON_ID --output json
|
|
667
|
+
|
|
668
|
+
# After updating voicemail
|
|
669
|
+
wxcli user-settings show-voicemail PERSON_ID --output json
|
|
670
|
+
|
|
671
|
+
# After self-service voicemail update
|
|
672
|
+
wxcli call-settings-for-me-phase-5 show --output json
|
|
673
|
+
|
|
674
|
+
# After self-service hoteling update
|
|
675
|
+
wxcli call-settings-for-me-phase-5 show-guest --output json
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
Compare the JSON output to the values you set. Flag any discrepancies.
|
|
679
|
+
|
|
680
|
+
## Step 8: Report results
|
|
681
|
+
|
|
682
|
+
Summarize what was changed:
|
|
683
|
+
|
|
684
|
+
```
|
|
685
|
+
## Results for: Jane Smith (jane@company.com)
|
|
686
|
+
|
|
687
|
+
| Setting | Before | After | Status |
|
|
688
|
+
|---------|--------|-------|--------|
|
|
689
|
+
| Call Forwarding (Always) | Disabled | Enabled -> +12025551234 | Confirmed |
|
|
690
|
+
| DND | Disabled | Enabled (ring splash: on) | Confirmed |
|
|
691
|
+
| Voicemail (rings) | 3 | 6 | Confirmed |
|
|
692
|
+
|
|
693
|
+
All 3 changes applied successfully.
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
---
|
|
697
|
+
|
|
698
|
+
## Critical Rules
|
|
699
|
+
|
|
700
|
+
- **Always read before writing** — never update a setting without first reading its current value via `wxcli user-settings show-*`
|
|
701
|
+
- **Always show plan before executing** — present the deployment plan (Step 5) and get user confirmation
|
|
702
|
+
- **Handle person vs workspace scope differences** — some scopes use `workspaces_read/write` instead of `people_read/write` (outgoing permissions transfer numbers, access codes, call policy)
|
|
703
|
+
- **Location-level prerequisites** — voicemail, recording, intercept, and MoH have location-level settings that must be configured first; person-level settings may be overridden or ineffective without them
|
|
704
|
+
- **SimRing, SequentialRing, PriorityAlert admin limitation** — these are not available via admin-level person management; use `wxcli my-call-settings` with user-level OAuth, or workspace-level commands where available
|
|
705
|
+
- **Self-service vs admin path** — for voicemail and hoteling, both admin (`user-settings`) and self-service (`call-settings-for-me-phase-5`) paths exist. Use admin path when configuring for another user; use self-service path when the user is configuring their own settings with a user-level token
|
|
706
|
+
- **Call Recording read scope bug** — the actual required scope is `people_read`, not `people_write` as some docs state
|
|
707
|
+
- **Selective feature precedence** — Selective Reject > Selective Accept > Selective Forward > Standard Forwarding
|
|
708
|
+
- **SNR uses telephony_config scopes** — Single Number Reach uses `spark-admin:telephony_config_read/write`, not `people_read/write`
|
|
709
|
+
- **MoH requires both location + person enabled** — `moh_location_enabled=true` AND `moh_enabled=true` for MoH to play; if either is false, no music plays
|
|
710
|
+
- **Numbers API split endpoints** — read uses `people/{id}/features/numbers`, update uses `telephony/config/people/{id}/numbers` (different paths)
|
|
711
|
+
- **Receptionist validation** — `enabled` must be `True` if `monitored_members` is set
|
|
712
|
+
- **Use --output json** — always pass `--output json` on show/list commands to get structured data for comparison and scripting
|
|
713
|
+
- **Run `wxcli user-settings --help`** — to discover all available commands and their exact names
|
|
714
|
+
- **Run `wxcli call-settings-for-me-phase-5 --help`** — to discover all 7 self-service commands
|
|
715
|
+
|
|
716
|
+
---
|
|
717
|
+
|
|
718
|
+
## Error Handling
|
|
719
|
+
|
|
720
|
+
When a wxcli command fails:
|
|
721
|
+
|
|
722
|
+
**A. Fix and retry** — If the error is a missing required field, wrong ID, or format issue:
|
|
723
|
+
1. Read the full error message
|
|
724
|
+
2. Run `wxcli <group> <command> --help` to check required flags
|
|
725
|
+
3. Fix the command and retry
|
|
726
|
+
|
|
727
|
+
**B. Skip and continue** — If the error is non-blocking (e.g., setting already configured):
|
|
728
|
+
1. Verify current state with the corresponding show/list command
|
|
729
|
+
2. If already correct, skip and move to next setting
|
|
730
|
+
|
|
731
|
+
**C. Escalate** — If the error is unclear or persistent:
|
|
732
|
+
1. Run with `--debug` to see the raw HTTP request/response
|
|
733
|
+
2. Invoke `/wxc-calling-debug` for systematic diagnosis
|
|
734
|
+
|
|
735
|
+
Common errors:
|
|
736
|
+
- 400: Check required fields, verify IDs exist, check `--json-body` format
|
|
737
|
+
- 403: Check token scopes — some settings need `spark-admin:people_write`
|
|
738
|
+
- 404: Verify person/location ID is correct and has calling license
|
|
739
|
+
- 409: Resource already exists — GET current state before retrying
|
|
740
|
+
|
|
741
|
+
### Settings-specific errors
|
|
742
|
+
|
|
743
|
+
- **404 on person settings (anonymousCallReject, sequentialRing, priorityAlert, callNotify, callPolicies):** These 5 settings have NO admin endpoint. Admin tokens always get 404. See the "User-only settings" table in Step 3. Offer the workspace-level alternative if applicable. (Simultaneous Ring is no longer in this list — it now has an admin path via `user-settings list-simultaneous-ring` / `update-simultaneous-ring`.)
|
|
744
|
+
- **404 on person settings (all others):** Verify the person has a Webex Calling license. Unlicensed users return 404 on all `/telephony/config/people/{id}/` endpoints.
|
|
745
|
+
- **405 "Invalid Professional Place" on workspace settings:** The workspace has a Basic license. Most `/telephony/config/workspaces/{id}/` settings require Professional. Only `musicOnHold` and `doNotDisturb` work on Basic. Use the `/workspaces/{id}/features/` path family for Basic workspaces (callForwarding, callWaiting, callerId, intercept, monitoring).
|
|
746
|
+
- **403 on Single Number Reach:** SNR uses `spark-admin:telephony_config_read/write` scopes, not `spark-admin:people_read/write`. Check token scopes.
|
|
747
|
+
- **Empty/no-effect on MoH:** Both location-level `moh_location_enabled` AND person-level `moh_enabled` must be `true`. If either is false, no music plays. Check both levels.
|
|
748
|
+
- **404 on `call-settings-for-me-phase-5` commands:** The authenticated user must have a Webex Calling license. These are `/people/me/` endpoints and require user-level OAuth tokens (`spark:people_read` / `spark:people_write`), not admin tokens.
|
|
749
|
+
|
|
750
|
+
---
|
|
751
|
+
|
|
752
|
+
## Context Compaction Recovery
|
|
753
|
+
|
|
754
|
+
If context compacts mid-execution, recover by:
|
|
755
|
+
1. Read the deployment plan from `docs/plans/` to recover what was planned
|
|
756
|
+
2. Check what's already been created: run the relevant `list` commands
|
|
757
|
+
3. Resume from the first incomplete step
|