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,251 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reporting-cc
|
|
3
|
+
description: |
|
|
4
|
+
Query and analyze Webex Contact Center analytics: CC queue statistics, CC agent statistics,
|
|
5
|
+
estimated wait time, agent summaries, task search, and real-time CC monitoring.
|
|
6
|
+
Requires CC-scoped OAuth (cjp:config_read).
|
|
7
|
+
NOT for: Webex Calling CDR/queue/AA stats (use reporting skill) or
|
|
8
|
+
meetings/workspace analytics (use reporting-meetings skill).
|
|
9
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
10
|
+
argument-hint: [cc-report-type]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Contact Center Analytics Workflow
|
|
14
|
+
|
|
15
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
16
|
+
1. What OAuth scope do CC analytics require? (Answer: `cjp:config_read` / `cjp:config_write` — standard admin tokens will NOT work.)
|
|
17
|
+
2. How is the CC region configured? (Answer: `wxcli set-cc-region <region>` — defaults to us1.)
|
|
18
|
+
|
|
19
|
+
If you cannot answer both, read `docs/reference/contact-center-analytics.md` before proceeding.
|
|
20
|
+
|
|
21
|
+
## Step 1: Load references
|
|
22
|
+
|
|
23
|
+
1. Read `docs/reference/contact-center-analytics.md` for CC analytics API details
|
|
24
|
+
|
|
25
|
+
**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 (e.g. `wxcli cc-queue-stats --help` and `wxcli cc-agents --help` — CC analytics groups carry the `cc-` prefix and are distinct from the Calling `reporting` skill's groups). 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.
|
|
26
|
+
|
|
27
|
+
## Step 2: Verify auth and region
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
wxcli whoami
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
CC APIs require CJP scopes (`cjp:config_read` / `cjp:config_write`). Two options: **OAuth Integration** (user-facing apps, interactive login) or **Service App** (production automation, no interactive login needed). If the token lacks CC scopes, the user needs to re-authenticate with one of these.
|
|
34
|
+
|
|
35
|
+
Verify region is set. There is no getter command — region is stored in the wxcli
|
|
36
|
+
config file (`~/.wxcli/config.json`, `cc_region` key), set via `wxcli set-cc-region`.
|
|
37
|
+
Inspect the config file directly, or just call `set-cc-region` to (re)set it:
|
|
38
|
+
|
|
39
|
+
If not set, configure it:
|
|
40
|
+
```bash
|
|
41
|
+
wxcli set-cc-region us1
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Available regions: us1, eu1, eu2, anz1, ca1, jp1, sg1.
|
|
45
|
+
|
|
46
|
+
## Step 3: Identify the CC reporting need
|
|
47
|
+
|
|
48
|
+
| Need | CLI Group | Command |
|
|
49
|
+
|------|-----------|---------|
|
|
50
|
+
| Queue volume, wait times, service level | `cc-queue-stats` | `list` |
|
|
51
|
+
| Agent handle time, calls handled | `cc-agents` | `list-statistics` |
|
|
52
|
+
| Current estimated wait time | `cc-ewt` | `show` |
|
|
53
|
+
| AI-generated interaction summaries | `cc-agent-summaries` | `create`, `create-list` |
|
|
54
|
+
| Historical task/contact search | `cc-search` | `create` |
|
|
55
|
+
| Real-time queue/agent state | `cc-realtime` | `create` |
|
|
56
|
+
| Call monitoring | `cc-call-monitoring` | 7 commands |
|
|
57
|
+
|
|
58
|
+
## Step 4: Execute and analyze
|
|
59
|
+
|
|
60
|
+
### Queue Statistics
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
wxcli cc-queue-stats list -o json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### Recipe CC-1 — Queue volume ranking
|
|
67
|
+
Question: "Which queue gets the most calls?"
|
|
68
|
+
```bash
|
|
69
|
+
wxcli cc-queue-stats list -o json | python3.11 -c "
|
|
70
|
+
import json, sys
|
|
71
|
+
data = json.load(sys.stdin)
|
|
72
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
73
|
+
for q in sorted(items, key=lambda x: x.get('totalCalls', x.get('callsOffered', 0)), reverse=True):
|
|
74
|
+
name = q.get('queueName', q.get('name', '?'))
|
|
75
|
+
calls = q.get('totalCalls', q.get('callsOffered', 0))
|
|
76
|
+
print(f'{name}: {calls} calls')
|
|
77
|
+
"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Recipe CC-2 — Queue abandonment rate
|
|
81
|
+
Question: "What's our abandonment rate per queue?"
|
|
82
|
+
```bash
|
|
83
|
+
wxcli cc-queue-stats list -o json | python3.11 -c "
|
|
84
|
+
import json, sys
|
|
85
|
+
data = json.load(sys.stdin)
|
|
86
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
87
|
+
for q in items:
|
|
88
|
+
name = q.get('queueName', q.get('name', '?'))
|
|
89
|
+
total = q.get('totalCalls', q.get('callsOffered', 0))
|
|
90
|
+
abandoned = q.get('callsAbandoned', 0)
|
|
91
|
+
rate = abandoned/total*100 if total else 0
|
|
92
|
+
print(f'{name}: {rate:.1f}% abandoned ({abandoned}/{total})')
|
|
93
|
+
"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
#### Recipe CC-3 — Average wait time per queue
|
|
97
|
+
Question: "How long are callers waiting?"
|
|
98
|
+
```bash
|
|
99
|
+
wxcli cc-queue-stats list -o json | python3.11 -c "
|
|
100
|
+
import json, sys
|
|
101
|
+
data = json.load(sys.stdin)
|
|
102
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
103
|
+
for q in sorted(items, key=lambda x: x.get('avgWaitTime', x.get('averageWaitTime', 0)), reverse=True):
|
|
104
|
+
name = q.get('queueName', q.get('name', '?'))
|
|
105
|
+
wait = q.get('avgWaitTime', q.get('averageWaitTime', 0))
|
|
106
|
+
print(f'{name}: avg {wait}s wait')
|
|
107
|
+
"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### Recipe CC-4 — Service level by queue
|
|
111
|
+
Question: "Are we meeting our SLA?"
|
|
112
|
+
```bash
|
|
113
|
+
wxcli cc-queue-stats list -o json | python3.11 -c "
|
|
114
|
+
import json, sys
|
|
115
|
+
data = json.load(sys.stdin)
|
|
116
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
117
|
+
for q in items:
|
|
118
|
+
name = q.get('queueName', q.get('name', '?'))
|
|
119
|
+
sl = q.get('serviceLevel', q.get('serviceLevelPercentage', 'N/A'))
|
|
120
|
+
print(f'{name}: {sl}% service level')
|
|
121
|
+
"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Agent Statistics
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
wxcli cc-agents list-statistics -o json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Recipe CC-5 — Agent handle time ranking
|
|
131
|
+
Question: "Which agents are fastest/slowest?"
|
|
132
|
+
```bash
|
|
133
|
+
wxcli cc-agents list-statistics -o json | python3.11 -c "
|
|
134
|
+
import json, sys
|
|
135
|
+
data = json.load(sys.stdin)
|
|
136
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
137
|
+
for a in sorted(items, key=lambda x: x.get('avgHandleTime', x.get('averageHandleTime', 0)), reverse=True):
|
|
138
|
+
name = a.get('agentName', a.get('name', '?'))
|
|
139
|
+
aht = a.get('avgHandleTime', a.get('averageHandleTime', 0))
|
|
140
|
+
print(f'{name}: avg {aht}s handle time')
|
|
141
|
+
"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
#### Recipe CC-6 — Agent utilization
|
|
145
|
+
Question: "How busy is each agent?"
|
|
146
|
+
```bash
|
|
147
|
+
wxcli cc-agents list-statistics -o json | python3.11 -c "
|
|
148
|
+
import json, sys
|
|
149
|
+
data = json.load(sys.stdin)
|
|
150
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
151
|
+
for a in sorted(items, key=lambda x: x.get('callsHandled', x.get('totalCalls', 0)), reverse=True):
|
|
152
|
+
name = a.get('agentName', a.get('name', '?'))
|
|
153
|
+
handled = a.get('callsHandled', a.get('totalCalls', 0))
|
|
154
|
+
print(f'{name}: {handled} calls handled')
|
|
155
|
+
"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Estimated Wait Time
|
|
159
|
+
|
|
160
|
+
#### Recipe CC-7 — Current wait time check
|
|
161
|
+
Question: "What's the current wait for queue X?"
|
|
162
|
+
```bash
|
|
163
|
+
wxcli cc-ewt show -o json | python3.11 -c "
|
|
164
|
+
import json, sys
|
|
165
|
+
data = json.load(sys.stdin)
|
|
166
|
+
if isinstance(data, dict):
|
|
167
|
+
print(f\"Estimated wait time: {data.get('estimatedWaitTime', data.get('ewt', 'N/A'))}s\")
|
|
168
|
+
else:
|
|
169
|
+
for q in data:
|
|
170
|
+
print(f\"{q.get('queueName', '?')}: {q.get('estimatedWaitTime', q.get('ewt', 'N/A'))}s\")
|
|
171
|
+
"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Agent Summaries
|
|
175
|
+
|
|
176
|
+
#### Recipe CC-8 — Search interaction summaries
|
|
177
|
+
Question: "Find summaries mentioning billing disputes"
|
|
178
|
+
```bash
|
|
179
|
+
wxcli cc-agent-summaries create --json-body '{"query": "billing dispute"}' -o json
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Real-Time Monitoring
|
|
183
|
+
|
|
184
|
+
#### Recipe CC-9 — Real-time queue depth
|
|
185
|
+
Question: "How many callers are waiting right now?"
|
|
186
|
+
```bash
|
|
187
|
+
wxcli cc-realtime create -o json | python3.11 -c "
|
|
188
|
+
import json, sys
|
|
189
|
+
data = json.load(sys.stdin)
|
|
190
|
+
if isinstance(data, list):
|
|
191
|
+
for q in data:
|
|
192
|
+
print(f\"{q.get('queueName', '?')}: {q.get('callsInQueue', q.get('waitingCalls', 0))} waiting\")
|
|
193
|
+
else:
|
|
194
|
+
print(json.dumps(data, indent=2))
|
|
195
|
+
"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### Recipe CC-10 — Agent availability status
|
|
199
|
+
Question: "Who's available right now?"
|
|
200
|
+
```bash
|
|
201
|
+
wxcli cc-agents list -o json | python3.11 -c "
|
|
202
|
+
import json, sys
|
|
203
|
+
data = json.load(sys.stdin)
|
|
204
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
205
|
+
from collections import Counter
|
|
206
|
+
states = Counter(a.get('state', a.get('agentState', 'Unknown')) for a in items)
|
|
207
|
+
for state, count in states.most_common():
|
|
208
|
+
print(f'{state}: {count} agents')
|
|
209
|
+
"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Historical Search
|
|
213
|
+
|
|
214
|
+
#### Recipe CC-11 — Search tasks by date range
|
|
215
|
+
Question: "Show all contacts handled yesterday"
|
|
216
|
+
```bash
|
|
217
|
+
wxcli cc-search create --json-body '{"from": "2026-04-09T00:00:00Z", "to": "2026-04-10T00:00:00Z"}' -o json
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Recipe CC-12 — Longest wait today
|
|
221
|
+
Question: "What was the worst wait time today?"
|
|
222
|
+
```bash
|
|
223
|
+
wxcli cc-queue-stats list -o json | python3.11 -c "
|
|
224
|
+
import json, sys
|
|
225
|
+
data = json.load(sys.stdin)
|
|
226
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
227
|
+
longest = max(items, key=lambda x: x.get('maxWaitTime', x.get('longestWaitTime', 0)), default={})
|
|
228
|
+
name = longest.get('queueName', longest.get('name', '?'))
|
|
229
|
+
wait = longest.get('maxWaitTime', longest.get('longestWaitTime', 0))
|
|
230
|
+
print(f'Longest wait: {wait}s in queue {name}')
|
|
231
|
+
"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Critical Rules
|
|
237
|
+
|
|
238
|
+
1. **CC-scoped OAuth or Service App required.** Standard admin tokens get 403. Must use `cjp:config_read` / `cjp:config_write` — via OAuth Integration or Service App (both supported).
|
|
239
|
+
2. **Region must be set.** CC APIs route to regional endpoints. Default is us1.
|
|
240
|
+
3. **Response shapes vary.** CC APIs may return objects or arrays. Recipes handle both with `isinstance` checks.
|
|
241
|
+
4. **Field names vary.** Different CC API versions use different field names (e.g., `avgWaitTime` vs `averageWaitTime`). Recipes use fallbacks with `x.get('field1', x.get('field2', 0))`.
|
|
242
|
+
5. **Real-time data is ephemeral.** Snapshot of current state, not historical.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Context Compaction Recovery
|
|
247
|
+
|
|
248
|
+
If context compacts mid-execution:
|
|
249
|
+
1. Read `docs/reference/contact-center-analytics.md` for API details
|
|
250
|
+
2. Verify CC auth with `wxcli whoami` and region — check `cc_region` in `~/.wxcli/config.json` (no getter command; set/reset via `wxcli set-cc-region`)
|
|
251
|
+
3. Resume from the appropriate recipe
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reporting-meetings
|
|
3
|
+
description: |
|
|
4
|
+
Query and analyze Webex meetings quality, usage reports, workspace utilization,
|
|
5
|
+
historical platform analytics, and live meeting monitoring.
|
|
6
|
+
NOT for: Webex Calling CDR/queue stats (use reporting skill), Contact Center analytics
|
|
7
|
+
(use reporting-cc skill), or scheduling/managing meetings (use manage-meetings skill).
|
|
8
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
9
|
+
argument-hint: [meetings-report-type]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Meetings & Workspace Analytics Workflow
|
|
13
|
+
|
|
14
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
15
|
+
1. Which CLI group provides per-meeting quality data in JSON? (Answer: `wxcli meeting-qualities` — returns jitter, latency, packet loss per media session. Faster than async CSV reports for single-meeting troubleshooting.)
|
|
16
|
+
2. Which CLI group provides historical platform analytics? (Answer: `wxcli analytics` — messaging daily totals, room device metrics, meetings aggregates.)
|
|
17
|
+
|
|
18
|
+
If you cannot answer both, read `docs/reference/meetings-infrastructure.md` and `docs/reference/reporting-analytics.md` before proceeding.
|
|
19
|
+
|
|
20
|
+
## Step 1: Load references
|
|
21
|
+
|
|
22
|
+
1. Read `docs/reference/meetings-infrastructure.md` for meeting quality, participants, Video Mesh
|
|
23
|
+
2. Read `docs/reference/meetings-core.md` for meeting CRUD and reports
|
|
24
|
+
3. Read `docs/reference/reporting-analytics.md` Section 2-3 for report templates
|
|
25
|
+
|
|
26
|
+
**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 (e.g. `wxcli meeting-qualities --help` and `wxcli meeting-reports --help`). 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.
|
|
27
|
+
|
|
28
|
+
## Step 2: Verify auth token
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
wxcli whoami
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Required scopes
|
|
35
|
+
|
|
36
|
+
| Report Type | Scope |
|
|
37
|
+
|-------------|-------|
|
|
38
|
+
| Meeting quality | `analytics:read_all` |
|
|
39
|
+
| Meeting usage/attendees | `analytics:read_all` |
|
|
40
|
+
| Historical analytics | `analytics:read_all` |
|
|
41
|
+
| Workspace metrics | `spark-admin:workspace_metrics_read` |
|
|
42
|
+
| Live monitoring | `analytics:read_all` |
|
|
43
|
+
|
|
44
|
+
## Step 3: Identify the reporting need
|
|
45
|
+
|
|
46
|
+
| Need | CLI Group | Command |
|
|
47
|
+
|------|-----------|---------|
|
|
48
|
+
| Quality for a specific meeting (jitter, latency, loss) | `meeting-qualities` | `list` |
|
|
49
|
+
| Meeting usage trends | `meeting-reports` | `list` |
|
|
50
|
+
| Meeting attendee details | `meeting-reports` | `list-attendees` |
|
|
51
|
+
| Historical messaging metrics | `analytics` | `show` |
|
|
52
|
+
| Historical room device metrics | `analytics` | `show-daily-totals` |
|
|
53
|
+
| Historical meetings aggregates | `analytics` | `show-aggregates` |
|
|
54
|
+
| Workspace usage | `workspace-metrics` | `list` |
|
|
55
|
+
| Workspace duration | `workspace-metrics` | `list-workspace-duration-metrics` |
|
|
56
|
+
| Live meeting counts | `live-monitoring` | `create` |
|
|
57
|
+
|
|
58
|
+
## Step 4: Execute and analyze
|
|
59
|
+
|
|
60
|
+
### Meeting Quality
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
wxcli meeting-qualities list --meeting-id MEETING_ID -o json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### Recipe M-1 — Meeting quality for a specific meeting
|
|
67
|
+
Question: "How was the quality on yesterday's all-hands?"
|
|
68
|
+
```bash
|
|
69
|
+
wxcli meeting-qualities list --meeting-id MEETING_ID -o json | python3.11 -c "
|
|
70
|
+
import json, sys
|
|
71
|
+
data = json.load(sys.stdin)
|
|
72
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
73
|
+
for p in items:
|
|
74
|
+
name = p.get('participantName', p.get('displayName', '?'))
|
|
75
|
+
jitter = p.get('audioJitter', p.get('jitter', 'N/A'))
|
|
76
|
+
latency = p.get('audioLatency', p.get('latency', 'N/A'))
|
|
77
|
+
loss = p.get('audioPacketLoss', p.get('packetLoss', 'N/A'))
|
|
78
|
+
print(f'{name}: jitter={jitter}ms latency={latency}ms loss={loss}%')
|
|
79
|
+
"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
#### Recipe M-2 — Quality issues in a meeting
|
|
83
|
+
Question: "Did anyone have bad quality?"
|
|
84
|
+
```bash
|
|
85
|
+
wxcli meeting-qualities list --meeting-id MEETING_ID -o json | python3.11 -c "
|
|
86
|
+
import json, sys
|
|
87
|
+
data = json.load(sys.stdin)
|
|
88
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
89
|
+
issues = []
|
|
90
|
+
for p in items:
|
|
91
|
+
name = p.get('participantName', p.get('displayName', '?'))
|
|
92
|
+
jitter = float(p.get('audioJitter', p.get('jitter', 0)) or 0)
|
|
93
|
+
latency = float(p.get('audioLatency', p.get('latency', 0)) or 0)
|
|
94
|
+
loss = float(p.get('audioPacketLoss', p.get('packetLoss', 0)) or 0)
|
|
95
|
+
if jitter > 30 or latency > 200 or loss > 5:
|
|
96
|
+
issues.append(f'{name}: jitter={jitter}ms latency={latency}ms loss={loss}%')
|
|
97
|
+
if issues:
|
|
98
|
+
print(f'{len(issues)} participants with quality issues:')
|
|
99
|
+
for i in issues: print(f' {i}')
|
|
100
|
+
else:
|
|
101
|
+
print('No quality issues detected (thresholds: jitter>30ms, latency>200ms, loss>5%)')
|
|
102
|
+
"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Meeting Usage
|
|
106
|
+
|
|
107
|
+
#### Recipe M-3 — Meeting usage summary
|
|
108
|
+
Question: "How many meetings are we having?"
|
|
109
|
+
```bash
|
|
110
|
+
wxcli meeting-reports list -o json | python3.11 -c "
|
|
111
|
+
import json, sys
|
|
112
|
+
data = json.load(sys.stdin)
|
|
113
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
114
|
+
print(f'Meeting usage reports: {len(items)}')
|
|
115
|
+
for r in items[:10]:
|
|
116
|
+
print(f\" {r.get('meetingDate', r.get('date', '?'))}: {r.get('totalMeetings', r.get('meetingCount', '?'))} meetings\")
|
|
117
|
+
"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### Recipe M-4 — Meeting attendance
|
|
121
|
+
Question: "How many invitees actually joined?"
|
|
122
|
+
```bash
|
|
123
|
+
wxcli meeting-reports list-attendees --meeting-id MEETING_ID -o json | python3.11 -c "
|
|
124
|
+
import json, sys
|
|
125
|
+
data = json.load(sys.stdin)
|
|
126
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
127
|
+
attended = [a for a in items if a.get('attended', a.get('joined', False))]
|
|
128
|
+
print(f'Attendees: {len(attended)} of {len(items)} ({len(attended)/len(items)*100:.1f}%)' if items else 'No data')
|
|
129
|
+
"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Historical Analytics
|
|
133
|
+
|
|
134
|
+
#### Recipe M-5 — Messaging adoption trend
|
|
135
|
+
Question: "Is messaging usage growing?"
|
|
136
|
+
```bash
|
|
137
|
+
wxcli analytics show -o json | python3.11 -c "
|
|
138
|
+
import json, sys
|
|
139
|
+
data = json.load(sys.stdin)
|
|
140
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
141
|
+
for d in items[:14]:
|
|
142
|
+
print(f\"{d.get('date', '?')}: {d.get('totalMessages', d.get('messages', '?'))} messages\")
|
|
143
|
+
"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Recipe M-6 — Room device utilization
|
|
147
|
+
Question: "Are our room devices being used?"
|
|
148
|
+
```bash
|
|
149
|
+
wxcli analytics show-daily-totals -o json | python3.11 -c "
|
|
150
|
+
import json, sys
|
|
151
|
+
data = json.load(sys.stdin)
|
|
152
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
153
|
+
for d in items[:14]:
|
|
154
|
+
print(f\"{d.get('date', '?')}: {d.get('activatedDevices', d.get('activeDevices', '?'))} active devices\")
|
|
155
|
+
"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### Recipe M-7 — Meetings aggregate comparison
|
|
159
|
+
Question: "How do this month's meetings compare?"
|
|
160
|
+
```bash
|
|
161
|
+
wxcli analytics show-aggregates -o json | python3.11 -c "
|
|
162
|
+
import json, sys
|
|
163
|
+
data = json.load(sys.stdin)
|
|
164
|
+
if isinstance(data, dict):
|
|
165
|
+
for key, val in data.items():
|
|
166
|
+
print(f'{key}: {val}')
|
|
167
|
+
else:
|
|
168
|
+
print(json.dumps(data, indent=2))
|
|
169
|
+
"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Workspace Metrics
|
|
173
|
+
|
|
174
|
+
#### Recipe M-8 — Workspace occupancy
|
|
175
|
+
Question: "Which rooms are used the most?"
|
|
176
|
+
```bash
|
|
177
|
+
wxcli workspace-metrics list -o json | python3.11 -c "
|
|
178
|
+
import json, sys
|
|
179
|
+
data = json.load(sys.stdin)
|
|
180
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
181
|
+
for w in sorted(items, key=lambda x: x.get('utilizationPercentage', x.get('occupancy', 0)), reverse=True)[:15]:
|
|
182
|
+
name = w.get('workspaceName', w.get('name', '?'))
|
|
183
|
+
util = w.get('utilizationPercentage', w.get('occupancy', 0))
|
|
184
|
+
print(f'{name}: {util}% utilized')
|
|
185
|
+
"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### Recipe M-9 — Workspace duration analysis
|
|
189
|
+
Question: "How long are rooms occupied on average?"
|
|
190
|
+
```bash
|
|
191
|
+
wxcli workspace-metrics list-workspace-duration-metrics -o json | python3.11 -c "
|
|
192
|
+
import json, sys
|
|
193
|
+
data = json.load(sys.stdin)
|
|
194
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
195
|
+
for w in sorted(items, key=lambda x: x.get('averageDuration', x.get('avgDuration', 0)), reverse=True)[:15]:
|
|
196
|
+
name = w.get('workspaceName', w.get('name', '?'))
|
|
197
|
+
dur = w.get('averageDuration', w.get('avgDuration', 0))
|
|
198
|
+
print(f'{name}: avg {dur/60:.1f} min per session')
|
|
199
|
+
"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Live Monitoring
|
|
203
|
+
|
|
204
|
+
#### Recipe M-10 — Live meetings right now
|
|
205
|
+
Question: "How many meetings are happening globally?"
|
|
206
|
+
```bash
|
|
207
|
+
wxcli live-monitoring create -o json | python3.11 -c "
|
|
208
|
+
import json, sys
|
|
209
|
+
data = json.load(sys.stdin)
|
|
210
|
+
if isinstance(data, dict):
|
|
211
|
+
for country, count in sorted(data.items(), key=lambda x: x[1] if isinstance(x[1], (int,float)) else 0, reverse=True):
|
|
212
|
+
print(f'{country}: {count}')
|
|
213
|
+
else:
|
|
214
|
+
print(json.dumps(data, indent=2))
|
|
215
|
+
"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
#### Recipe M-11 — Quality by participant (recurring issues)
|
|
219
|
+
Question: "Who has recurring quality issues across meetings?"
|
|
220
|
+
Note: Requires multiple meeting quality pulls. Run for each recent meeting ID.
|
|
221
|
+
```bash
|
|
222
|
+
wxcli meeting-qualities list --meeting-id MEETING_ID_1 -o json > /tmp/mq1.json
|
|
223
|
+
wxcli meeting-qualities list --meeting-id MEETING_ID_2 -o json > /tmp/mq2.json
|
|
224
|
+
python3.11 -c "
|
|
225
|
+
import json
|
|
226
|
+
from collections import defaultdict
|
|
227
|
+
issues = defaultdict(int)
|
|
228
|
+
for f in ['/tmp/mq1.json', '/tmp/mq2.json']:
|
|
229
|
+
data = json.load(open(f))
|
|
230
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
231
|
+
for p in items:
|
|
232
|
+
name = p.get('participantName', p.get('displayName', '?'))
|
|
233
|
+
jitter = float(p.get('audioJitter', p.get('jitter', 0)) or 0)
|
|
234
|
+
latency = float(p.get('audioLatency', p.get('latency', 0)) or 0)
|
|
235
|
+
loss = float(p.get('audioPacketLoss', p.get('packetLoss', 0)) or 0)
|
|
236
|
+
if jitter > 30 or latency > 200 or loss > 5:
|
|
237
|
+
issues[name] += 1
|
|
238
|
+
for name, count in sorted(issues.items(), key=lambda x: x[1], reverse=True):
|
|
239
|
+
print(f'{name}: quality issues in {count} meetings')
|
|
240
|
+
"
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
#### Recipe M-12 — Attendee report for compliance
|
|
244
|
+
Question: "Who attended this meeting?"
|
|
245
|
+
```bash
|
|
246
|
+
wxcli meeting-reports list-attendees --meeting-id MEETING_ID -o json | python3.11 -c "
|
|
247
|
+
import json, sys
|
|
248
|
+
data = json.load(sys.stdin)
|
|
249
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
250
|
+
for a in items:
|
|
251
|
+
name = a.get('displayName', a.get('name', '?'))
|
|
252
|
+
email = a.get('email', '?')
|
|
253
|
+
joined = a.get('joinTime', a.get('joinedTime', '?'))
|
|
254
|
+
left = a.get('leaveTime', a.get('leftTime', '?'))
|
|
255
|
+
print(f'{name} ({email}): joined {joined}, left {left}')
|
|
256
|
+
"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
#### Recipe M-13 — Top meeting hosts
|
|
260
|
+
Question: "Who schedules the most meetings?"
|
|
261
|
+
```bash
|
|
262
|
+
wxcli meeting-reports list -o json | python3.11 -c "
|
|
263
|
+
import json, sys
|
|
264
|
+
from collections import Counter
|
|
265
|
+
data = json.load(sys.stdin)
|
|
266
|
+
items = data if isinstance(data, list) else data.get('items', [data])
|
|
267
|
+
hosts = Counter(r.get('hostEmail', r.get('hostName', '?')) for r in items)
|
|
268
|
+
for host, count in hosts.most_common(15):
|
|
269
|
+
print(f'{host}: {count} meetings')
|
|
270
|
+
"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Critical Rules
|
|
276
|
+
|
|
277
|
+
1. **Meeting quality requires a meeting ID.** Use `wxcli meetings list` to find meeting IDs first.
|
|
278
|
+
2. **Historical analytics may require Pro Pack.** Depends on the data type.
|
|
279
|
+
3. **Live monitoring is a snapshot.** Data is current, not historical.
|
|
280
|
+
4. **Workspace metrics require workspace admin scope.** `spark-admin:workspace_metrics_read`.
|
|
281
|
+
5. **Response shapes vary across API versions.** Recipes use `isinstance` checks and field fallbacks.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Context Compaction Recovery
|
|
286
|
+
|
|
287
|
+
If context compacts mid-execution:
|
|
288
|
+
1. Read `docs/reference/meetings-infrastructure.md` for meeting quality API details
|
|
289
|
+
2. Read `docs/reference/reporting-analytics.md` for report template details
|
|
290
|
+
3. Resume from the appropriate recipe
|