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.
Files changed (413) hide show
  1. wxcli/__init__.py +4 -0
  2. wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
  3. wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
  4. wxcli/_playbook/.claude/rules/cleanup.md +29 -0
  5. wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
  6. wxcli/_playbook/.claude/rules/org-health.md +14 -0
  7. wxcli/_playbook/.claude/settings.json +8 -0
  8. wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
  9. wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
  10. wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
  11. wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
  12. wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
  13. wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
  14. wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
  15. wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
  16. wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
  17. wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
  18. wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
  19. wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
  20. wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
  21. wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
  22. wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
  23. wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
  24. wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
  25. wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
  26. wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
  27. wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
  28. wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
  29. wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
  30. wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
  31. wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
  32. wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
  33. wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
  34. wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
  35. wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
  36. wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
  37. wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
  38. wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
  39. wxcli/_playbook/CLAUDE.md +373 -0
  40. wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
  41. wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
  42. wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
  43. wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
  44. wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
  45. wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
  46. wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
  47. wxcli/_playbook/docs/reference/admin-partner.md +357 -0
  48. wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
  49. wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
  50. wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
  51. wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
  52. wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
  53. wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
  54. wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
  55. wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
  56. wxcli/_playbook/docs/reference/authentication.md +965 -0
  57. wxcli/_playbook/docs/reference/call-control.md +1205 -0
  58. wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
  59. wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
  60. wxcli/_playbook/docs/reference/call-routing.md +2304 -0
  61. wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
  62. wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
  63. wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
  64. wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
  65. wxcli/_playbook/docs/reference/devices-core.md +1869 -0
  66. wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
  67. wxcli/_playbook/docs/reference/devices-platform.md +467 -0
  68. wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
  69. wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
  70. wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
  71. wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
  72. wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
  73. wxcli/_playbook/docs/reference/meetings-content.md +473 -0
  74. wxcli/_playbook/docs/reference/meetings-core.md +903 -0
  75. wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
  76. wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
  77. wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
  78. wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
  79. wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
  80. wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
  81. wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
  82. wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
  83. wxcli/_playbook/docs/reference/provisioning.md +1366 -0
  84. wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
  85. wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
  86. wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
  87. wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
  88. wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
  89. wxcli/_version.py +24 -0
  90. wxcli/auth.py +137 -0
  91. wxcli/commands/__init__.py +0 -0
  92. wxcli/commands/_registry.py +181 -0
  93. wxcli/commands/activation_email.py +103 -0
  94. wxcli/commands/admin_recordings.py +585 -0
  95. wxcli/commands/analytics.py +105 -0
  96. wxcli/commands/announcement_playlists.py +219 -0
  97. wxcli/commands/announcements.py +519 -0
  98. wxcli/commands/archive_users.py +36 -0
  99. wxcli/commands/attachment_actions.py +60 -0
  100. wxcli/commands/audit_events.py +83 -0
  101. wxcli/commands/authorizations.py +113 -0
  102. wxcli/commands/auto_attendant.py +642 -0
  103. wxcli/commands/broadworks_billing_reports.py +126 -0
  104. wxcli/commands/broadworks_enterprises.py +160 -0
  105. wxcli/commands/broadworks_subscribers.py +319 -0
  106. wxcli/commands/broadworks_workspaces.py +108 -0
  107. wxcli/commands/call_controls.py +1304 -0
  108. wxcli/commands/call_park.py +494 -0
  109. wxcli/commands/call_pickup.py +229 -0
  110. wxcli/commands/call_queue.py +1878 -0
  111. wxcli/commands/call_recording.py +707 -0
  112. wxcli/commands/call_routing.py +1610 -0
  113. wxcli/commands/call_settings_for_me_phase_5.py +212 -0
  114. wxcli/commands/caller_reputation.py +169 -0
  115. wxcli/commands/calling_service.py +305 -0
  116. wxcli/commands/cc_address_book.py +770 -0
  117. wxcli/commands/cc_agent_greetings.py +242 -0
  118. wxcli/commands/cc_agent_summaries.py +39 -0
  119. wxcli/commands/cc_agent_wellbeing.py +216 -0
  120. wxcli/commands/cc_agents.py +425 -0
  121. wxcli/commands/cc_ai_assistant.py +55 -0
  122. wxcli/commands/cc_ai_feature.py +294 -0
  123. wxcli/commands/cc_audio_files.py +149 -0
  124. wxcli/commands/cc_auto_csat.py +311 -0
  125. wxcli/commands/cc_aux_code.py +458 -0
  126. wxcli/commands/cc_business_hour.py +353 -0
  127. wxcli/commands/cc_call_monitoring.py +228 -0
  128. wxcli/commands/cc_callbacks.py +194 -0
  129. wxcli/commands/cc_campaign.py +212 -0
  130. wxcli/commands/cc_captures.py +39 -0
  131. wxcli/commands/cc_contact_list.py +169 -0
  132. wxcli/commands/cc_contact_number.py +295 -0
  133. wxcli/commands/cc_data_sources.py +235 -0
  134. wxcli/commands/cc_desktop_layout.py +380 -0
  135. wxcli/commands/cc_desktop_profile.py +322 -0
  136. wxcli/commands/cc_dial_number.py +511 -0
  137. wxcli/commands/cc_dial_plan.py +347 -0
  138. wxcli/commands/cc_dnc.py +101 -0
  139. wxcli/commands/cc_entry_point.py +545 -0
  140. wxcli/commands/cc_ewt.py +51 -0
  141. wxcli/commands/cc_flow.py +477 -0
  142. wxcli/commands/cc_global_vars.py +430 -0
  143. wxcli/commands/cc_holiday_list.py +335 -0
  144. wxcli/commands/cc_journey.py +1261 -0
  145. wxcli/commands/cc_legacy_flows.py +49 -0
  146. wxcli/commands/cc_multimedia_profile.py +436 -0
  147. wxcli/commands/cc_notification.py +51 -0
  148. wxcli/commands/cc_outdial_ani.py +604 -0
  149. wxcli/commands/cc_overrides.py +341 -0
  150. wxcli/commands/cc_queue.py +1083 -0
  151. wxcli/commands/cc_queue_stats.py +55 -0
  152. wxcli/commands/cc_realtime.py +51 -0
  153. wxcli/commands/cc_resource_collection.py +312 -0
  154. wxcli/commands/cc_search.py +46 -0
  155. wxcli/commands/cc_site.py +400 -0
  156. wxcli/commands/cc_skill.py +350 -0
  157. wxcli/commands/cc_skill_profile.py +289 -0
  158. wxcli/commands/cc_subscriptions.py +426 -0
  159. wxcli/commands/cc_summaries.py +130 -0
  160. wxcli/commands/cc_tasks.py +844 -0
  161. wxcli/commands/cc_team.py +325 -0
  162. wxcli/commands/cc_user_profiles.py +349 -0
  163. wxcli/commands/cc_users.py +701 -0
  164. wxcli/commands/cc_work_types.py +363 -0
  165. wxcli/commands/cdr.py +89 -0
  166. wxcli/commands/classifications.py +38 -0
  167. wxcli/commands/cleanup.py +1427 -0
  168. wxcli/commands/client_settings.py +72 -0
  169. wxcli/commands/conference.py +328 -0
  170. wxcli/commands/configure.py +72 -0
  171. wxcli/commands/converged_recordings.py +347 -0
  172. wxcli/commands/converged_recordings_export.py +310 -0
  173. wxcli/commands/cq_playlists.py +42 -0
  174. wxcli/commands/cucm.py +2794 -0
  175. wxcli/commands/cucm_config.py +129 -0
  176. wxcli/commands/customer_assist.py +373 -0
  177. wxcli/commands/data_sources.py +227 -0
  178. wxcli/commands/dect_devices.py +787 -0
  179. wxcli/commands/device_configurations.py +77 -0
  180. wxcli/commands/device_dynamic_settings.py +320 -0
  181. wxcli/commands/device_settings.py +1489 -0
  182. wxcli/commands/devices.py +280 -0
  183. wxcli/commands/domains.py +142 -0
  184. wxcli/commands/ecm.py +178 -0
  185. wxcli/commands/emergency_services.py +827 -0
  186. wxcli/commands/events.py +83 -0
  187. wxcli/commands/external_voicemail.py +52 -0
  188. wxcli/commands/groups.py +206 -0
  189. wxcli/commands/guest_management.py +76 -0
  190. wxcli/commands/hds.py +340 -0
  191. wxcli/commands/hot_desk.py +67 -0
  192. wxcli/commands/hot_desking_members.py +118 -0
  193. wxcli/commands/hot_desking_portal.py +124 -0
  194. wxcli/commands/hunt_group.py +577 -0
  195. wxcli/commands/hybrid_clusters.py +71 -0
  196. wxcli/commands/hybrid_connectors.py +67 -0
  197. wxcli/commands/identity_org.py +159 -0
  198. wxcli/commands/init_playbook.py +155 -0
  199. wxcli/commands/licenses.py +106 -0
  200. wxcli/commands/live_monitoring.py +40 -0
  201. wxcli/commands/location_call_handling.py +577 -0
  202. wxcli/commands/location_schedules.py +341 -0
  203. wxcli/commands/location_settings.py +1297 -0
  204. wxcli/commands/location_voicemail.py +494 -0
  205. wxcli/commands/locations.py +336 -0
  206. wxcli/commands/meeting_captions.py +110 -0
  207. wxcli/commands/meeting_chats.py +63 -0
  208. wxcli/commands/meeting_invitees.py +234 -0
  209. wxcli/commands/meeting_messages.py +28 -0
  210. wxcli/commands/meeting_participants.py +278 -0
  211. wxcli/commands/meeting_polls.py +111 -0
  212. wxcli/commands/meeting_preferences.py +515 -0
  213. wxcli/commands/meeting_qa.py +78 -0
  214. wxcli/commands/meeting_qualities.py +43 -0
  215. wxcli/commands/meeting_reports.py +101 -0
  216. wxcli/commands/meeting_session_types.py +105 -0
  217. wxcli/commands/meeting_site.py +57 -0
  218. wxcli/commands/meeting_slido.py +44 -0
  219. wxcli/commands/meeting_summaries.py +92 -0
  220. wxcli/commands/meeting_tracking_codes.py +233 -0
  221. wxcli/commands/meeting_transcripts.py +230 -0
  222. wxcli/commands/meetings.py +1997 -0
  223. wxcli/commands/memberships.py +164 -0
  224. wxcli/commands/messages.py +213 -0
  225. wxcli/commands/mode_management.py +244 -0
  226. wxcli/commands/my_call_settings.py +3577 -0
  227. wxcli/commands/numbers.py +405 -0
  228. wxcli/commands/operating_modes.py +410 -0
  229. wxcli/commands/org_contacts.py +284 -0
  230. wxcli/commands/org_health_cli.py +55 -0
  231. wxcli/commands/org_settings.py +71 -0
  232. wxcli/commands/organizations.py +83 -0
  233. wxcli/commands/paging_group.py +257 -0
  234. wxcli/commands/partner_admins.py +141 -0
  235. wxcli/commands/partner_reports.py +188 -0
  236. wxcli/commands/partner_tags.py +216 -0
  237. wxcli/commands/people.py +279 -0
  238. wxcli/commands/person_call_settings.py +71 -0
  239. wxcli/commands/pstn.py +280 -0
  240. wxcli/commands/recording_report.py +154 -0
  241. wxcli/commands/report_templates.py +38 -0
  242. wxcli/commands/reports.py +144 -0
  243. wxcli/commands/resource_group_memberships.py +160 -0
  244. wxcli/commands/resource_groups.py +67 -0
  245. wxcli/commands/roles.py +63 -0
  246. wxcli/commands/room_tabs.py +160 -0
  247. wxcli/commands/rooms.py +225 -0
  248. wxcli/commands/scim_bulk.py +46 -0
  249. wxcli/commands/scim_groups.py +246 -0
  250. wxcli/commands/scim_schemas.py +82 -0
  251. wxcli/commands/scim_users.py +283 -0
  252. wxcli/commands/security_audit.py +54 -0
  253. wxcli/commands/service_apps.py +51 -0
  254. wxcli/commands/single_number_reach.py +209 -0
  255. wxcli/commands/team_memberships.py +155 -0
  256. wxcli/commands/teams.py +153 -0
  257. wxcli/commands/ucm_profile.py +42 -0
  258. wxcli/commands/update.py +219 -0
  259. wxcli/commands/user_settings.py +5116 -0
  260. wxcli/commands/video_mesh.py +1090 -0
  261. wxcli/commands/virtual_extensions.py +502 -0
  262. wxcli/commands/virtual_line_settings.py +2072 -0
  263. wxcli/commands/webhooks.py +176 -0
  264. wxcli/commands/wholesale_billing_reports.py +147 -0
  265. wxcli/commands/wholesale_provisioning.py +523 -0
  266. wxcli/commands/workspace_locations.py +339 -0
  267. wxcli/commands/workspace_metrics.py +103 -0
  268. wxcli/commands/workspace_personalization.py +70 -0
  269. wxcli/commands/workspace_settings.py +3347 -0
  270. wxcli/commands/workspaces.py +279 -0
  271. wxcli/commands/xapi.py +114 -0
  272. wxcli/config.py +139 -0
  273. wxcli/errors.py +77 -0
  274. wxcli/main.py +210 -0
  275. wxcli/migration/CLAUDE.md +106 -0
  276. wxcli/migration/__init__.py +1 -0
  277. wxcli/migration/advisory/CLAUDE.md +196 -0
  278. wxcli/migration/advisory/__init__.py +46 -0
  279. wxcli/migration/advisory/advisor.py +107 -0
  280. wxcli/migration/advisory/advisory_patterns.py +2552 -0
  281. wxcli/migration/advisory/recommendation_rules.py +835 -0
  282. wxcli/migration/cucm/CLAUDE.md +74 -0
  283. wxcli/migration/cucm/__init__.py +5 -0
  284. wxcli/migration/cucm/connection.py +265 -0
  285. wxcli/migration/cucm/discovery.py +225 -0
  286. wxcli/migration/cucm/extractors/__init__.py +1 -0
  287. wxcli/migration/cucm/extractors/announcements.py +92 -0
  288. wxcli/migration/cucm/extractors/base.py +90 -0
  289. wxcli/migration/cucm/extractors/device_profiles.py +98 -0
  290. wxcli/migration/cucm/extractors/devices.py +193 -0
  291. wxcli/migration/cucm/extractors/e911.py +103 -0
  292. wxcli/migration/cucm/extractors/features.py +309 -0
  293. wxcli/migration/cucm/extractors/helpers.py +73 -0
  294. wxcli/migration/cucm/extractors/informational.py +295 -0
  295. wxcli/migration/cucm/extractors/locations.py +221 -0
  296. wxcli/migration/cucm/extractors/moh.py +100 -0
  297. wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
  298. wxcli/migration/cucm/extractors/routing.py +493 -0
  299. wxcli/migration/cucm/extractors/shared_lines.py +146 -0
  300. wxcli/migration/cucm/extractors/templates.py +229 -0
  301. wxcli/migration/cucm/extractors/tier4.py +173 -0
  302. wxcli/migration/cucm/extractors/users.py +240 -0
  303. wxcli/migration/cucm/extractors/voicemail.py +243 -0
  304. wxcli/migration/cucm/extractors/workspaces.py +88 -0
  305. wxcli/migration/cucm/unity_connection.py +304 -0
  306. wxcli/migration/execute/CLAUDE.md +372 -0
  307. wxcli/migration/execute/__init__.py +303 -0
  308. wxcli/migration/execute/batch.py +277 -0
  309. wxcli/migration/execute/dependency.py +483 -0
  310. wxcli/migration/execute/engine.py +964 -0
  311. wxcli/migration/execute/handlers.py +2232 -0
  312. wxcli/migration/execute/planner.py +1939 -0
  313. wxcli/migration/execute/runtime.py +571 -0
  314. wxcli/migration/export/CLAUDE.md +49 -0
  315. wxcli/migration/export/__init__.py +8 -0
  316. wxcli/migration/export/csv_export.py +126 -0
  317. wxcli/migration/export/deployment_plan.py +479 -0
  318. wxcli/migration/export/json_export.py +60 -0
  319. wxcli/migration/models.py +941 -0
  320. wxcli/migration/phone_models.py +50 -0
  321. wxcli/migration/preflight/CLAUDE.md +52 -0
  322. wxcli/migration/preflight/__init__.py +89 -0
  323. wxcli/migration/preflight/checks.py +911 -0
  324. wxcli/migration/preflight/runner.py +293 -0
  325. wxcli/migration/rate_limiter.py +144 -0
  326. wxcli/migration/report/CLAUDE.md +245 -0
  327. wxcli/migration/report/__init__.py +7 -0
  328. wxcli/migration/report/appendix.py +2437 -0
  329. wxcli/migration/report/assembler.py +183 -0
  330. wxcli/migration/report/charts.py +263 -0
  331. wxcli/migration/report/executive.py +776 -0
  332. wxcli/migration/report/explainer.py +704 -0
  333. wxcli/migration/report/helpers.py +74 -0
  334. wxcli/migration/report/ingest.py +152 -0
  335. wxcli/migration/report/notice_templates.py +192 -0
  336. wxcli/migration/report/score.py +375 -0
  337. wxcli/migration/report/styles.py +1052 -0
  338. wxcli/migration/report/user_diff.py +1052 -0
  339. wxcli/migration/report/user_notice.py +425 -0
  340. wxcli/migration/state.py +139 -0
  341. wxcli/migration/store.py +860 -0
  342. wxcli/migration/transform/CLAUDE.md +107 -0
  343. wxcli/migration/transform/__init__.py +12 -0
  344. wxcli/migration/transform/analysis_pipeline.py +453 -0
  345. wxcli/migration/transform/analyzers/__init__.py +142 -0
  346. wxcli/migration/transform/analyzers/css_permission.py +189 -0
  347. wxcli/migration/transform/analyzers/css_routing.py +335 -0
  348. wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
  349. wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
  350. wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
  351. wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
  352. wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
  353. wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
  354. wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
  355. wxcli/migration/transform/analyzers/missing_data.py +300 -0
  356. wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
  357. wxcli/migration/transform/analyzers/shared_line.py +170 -0
  358. wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
  359. wxcli/migration/transform/analyzers/workspace_license.py +212 -0
  360. wxcli/migration/transform/cross_reference.py +1136 -0
  361. wxcli/migration/transform/cucm_pattern.py +246 -0
  362. wxcli/migration/transform/decisions.py +301 -0
  363. wxcli/migration/transform/e164.py +145 -0
  364. wxcli/migration/transform/engine.py +256 -0
  365. wxcli/migration/transform/mappers/CLAUDE.md +123 -0
  366. wxcli/migration/transform/mappers/__init__.py +76 -0
  367. wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
  368. wxcli/migration/transform/mappers/base.py +190 -0
  369. wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
  370. wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
  371. wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
  372. wxcli/migration/transform/mappers/css_mapper.py +868 -0
  373. wxcli/migration/transform/mappers/dect_mapper.py +367 -0
  374. wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
  375. wxcli/migration/transform/mappers/device_mapper.py +227 -0
  376. wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
  377. wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
  378. wxcli/migration/transform/mappers/e911_mapper.py +129 -0
  379. wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
  380. wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
  381. wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
  382. wxcli/migration/transform/mappers/line_mapper.py +310 -0
  383. wxcli/migration/transform/mappers/location_mapper.py +235 -0
  384. wxcli/migration/transform/mappers/moh_mapper.py +114 -0
  385. wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
  386. wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
  387. wxcli/migration/transform/mappers/routing_mapper.py +821 -0
  388. wxcli/migration/transform/mappers/snr_mapper.py +201 -0
  389. wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
  390. wxcli/migration/transform/mappers/user_mapper.py +264 -0
  391. wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
  392. wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
  393. wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
  394. wxcli/migration/transform/normalizers.py +2008 -0
  395. wxcli/migration/transform/pattern_converter.py +106 -0
  396. wxcli/migration/transform/pipeline.py +271 -0
  397. wxcli/migration/transform/rules.py +255 -0
  398. wxcli/org_health/CLAUDE.md +63 -0
  399. wxcli/org_health/__init__.py +7 -0
  400. wxcli/org_health/analyze.py +93 -0
  401. wxcli/org_health/checks.py +458 -0
  402. wxcli/org_health/collector.py +62 -0
  403. wxcli/org_health/models.py +78 -0
  404. wxcli/org_health/report.py +300 -0
  405. wxcli/output.py +101 -0
  406. wxcli-1.2.0.dist-info/METADATA +505 -0
  407. wxcli-1.2.0.dist-info/RECORD +413 -0
  408. wxcli-1.2.0.dist-info/WHEEL +5 -0
  409. wxcli-1.2.0.dist-info/entry_points.txt +2 -0
  410. wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
  411. wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
  412. wxcli-1.2.0.dist-info/scm_version.json +8 -0
  413. wxcli-1.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,380 @@
1
+ import json
2
+ import typer
3
+ from wxcli.auth import get_api
4
+ from wxcli.errors import WebexError, handle_rest_error
5
+ from wxcli.output import print_table, print_json
6
+ from wxcli.config import resolve_org_id, get_cc_base_url, get_cc_org_id
7
+
8
+
9
+ app = typer.Typer(help="Manage Webex Contact Center cc-desktop-layout.")
10
+
11
+
12
+ @app.command("create")
13
+ def create(
14
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
15
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
16
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
17
+ name: str = typer.Option(None, "--name", help="(required) A name for the Desktop Layout."),
18
+ description: str = typer.Option(None, "--description", help="A short description indicating the context of the Desktop La"),
19
+ edited_by: str = typer.Option(None, "--edited-by", help="(required) Indicates who modified the Desktop Layout."),
20
+ json_file_name: str = typer.Option(None, "--json-file-name", help="(required) Enter the name of the file."),
21
+ json_file_content: str = typer.Option(None, "--json-file-content", help="(required) Enter the Desktop Layout json."),
22
+ global_param: bool = typer.Option(None, "--global/--no-global", help="(required) Indicates if the Desktop Layout is a global layout or a cust"),
23
+ status: bool = typer.Option(None, "--status/--no-status", help="(required) Indicates if the Desktop Layout is in active state or inacti"),
24
+ default_json_modified: bool = typer.Option(None, "--default-json-modified/--no-default-json-modified", help="(required) Indicates if the default Desktop Layout is modified."),
25
+ validated: bool = typer.Option(None, "--validated/--no-validated", help="(required) Indicates if the Desktop Layout is validated."),
26
+ validated_time: str = typer.Option(None, "--validated-time", help="Validated time(in epoch milliseconds) of this resource."),
27
+ default_json_modified_time: str = typer.Option(None, "--default-json-modified-time", help="Default Json Modified time(in epoch milliseconds) of this re"),
28
+ modified_time: str = typer.Option(None, "--modified-time", help="Modified time(in epoch milliseconds) of this resource."),
29
+ system_default: bool = typer.Option(None, "--system-default/--no-system-default", help="Indicates whether the created resource is system created or"),
30
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
31
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
32
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
33
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
34
+ debug: bool = typer.Option(False, "--debug"),
35
+ ):
36
+ """Create a new Desktop Layout\n\nExample --json-body:\n '{"name":"...","editedBy":"...","jsonFileName":"...","jsonFileContent":"...","global":true,"status":true,"defaultJsonModified":true,"validated":true}'."""
37
+ api = get_api(debug=debug)
38
+ cc_base_url = get_cc_base_url()
39
+ orgid = get_cc_org_id(api.session)
40
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout"
41
+ if json_body:
42
+ body = json.loads(json_body)
43
+ else:
44
+ body = {}
45
+ if organization_id is not None:
46
+ body["organizationId"] = organization_id
47
+ if id_param is not None:
48
+ body["id"] = id_param
49
+ if version is not None:
50
+ body["version"] = version
51
+ if name is not None:
52
+ body["name"] = name
53
+ if description is not None:
54
+ body["description"] = description
55
+ if edited_by is not None:
56
+ body["editedBy"] = edited_by
57
+ if json_file_name is not None:
58
+ body["jsonFileName"] = json_file_name
59
+ if json_file_content is not None:
60
+ body["jsonFileContent"] = json_file_content
61
+ if global_param is not None:
62
+ body["global"] = global_param
63
+ if status is not None:
64
+ body["status"] = status
65
+ if default_json_modified is not None:
66
+ body["defaultJsonModified"] = default_json_modified
67
+ if validated is not None:
68
+ body["validated"] = validated
69
+ if validated_time is not None:
70
+ body["validatedTime"] = validated_time
71
+ if default_json_modified_time is not None:
72
+ body["defaultJsonModifiedTime"] = default_json_modified_time
73
+ if modified_time is not None:
74
+ body["modifiedTime"] = modified_time
75
+ if system_default is not None:
76
+ body["systemDefault"] = system_default
77
+ if created_time is not None:
78
+ body["createdTime"] = created_time
79
+ if last_updated_time is not None:
80
+ body["lastUpdatedTime"] = last_updated_time
81
+ _missing = [f for f in ['name', 'editedBy', 'jsonFileName', 'jsonFileContent', 'global', 'status', 'defaultJsonModified', 'validated'] if f not in body or body[f] is None]
82
+ if _missing:
83
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
84
+ raise typer.Exit(1)
85
+ try:
86
+ result = api.session.rest_post(url, json=body)
87
+ except WebexError as e:
88
+ handle_rest_error(e)
89
+ if output == "json":
90
+ print_json(result)
91
+ elif isinstance(result, dict) and "id" in result:
92
+ typer.echo(f"Created: {result['id']}")
93
+ elif not result or result == {}:
94
+ typer.echo("Created.")
95
+ else:
96
+ print_json(result)
97
+
98
+
99
+
100
+ @app.command("create-bulk")
101
+ def create_bulk(
102
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
103
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
104
+ debug: bool = typer.Option(False, "--debug"),
105
+ ):
106
+ """Bulk save Desktop Layout(s)\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
107
+ api = get_api(debug=debug)
108
+ cc_base_url = get_cc_base_url()
109
+ orgid = get_cc_org_id(api.session)
110
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/bulk"
111
+ if json_body:
112
+ body = json.loads(json_body)
113
+ else:
114
+ body = {}
115
+ try:
116
+ result = api.session.rest_post(url, json=body)
117
+ except WebexError as e:
118
+ handle_rest_error(e)
119
+ if output == "json":
120
+ print_json(result)
121
+ elif isinstance(result, dict) and "id" in result:
122
+ typer.echo(f"Created: {result['id']}")
123
+ elif not result or result == {}:
124
+ typer.echo("Created.")
125
+ else:
126
+ print_json(result)
127
+
128
+
129
+
130
+ @app.command("create-purge-inactive-entities")
131
+ def create_purge_inactive_entities(
132
+ next_start_id: str = typer.Option(None, "--next-start-id", help="This is the entity ID from which items for the next purge ba"),
133
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
134
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
135
+ debug: bool = typer.Option(False, "--debug"),
136
+ ):
137
+ """Purge inactive Desktop Layout(s)."""
138
+ api = get_api(debug=debug)
139
+ cc_base_url = get_cc_base_url()
140
+ orgid = get_cc_org_id(api.session)
141
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/purge-inactive-entities"
142
+ params = {}
143
+ if next_start_id is not None:
144
+ params["nextStartId"] = next_start_id
145
+ if json_body:
146
+ body = json.loads(json_body)
147
+ else:
148
+ body = {}
149
+ try:
150
+ result = api.session.rest_post(url, json=body, params=params)
151
+ except WebexError as e:
152
+ handle_rest_error(e)
153
+ if output == "json":
154
+ print_json(result)
155
+ elif isinstance(result, dict) and "id" in result:
156
+ typer.echo(f"Created: {result['id']}")
157
+ elif not result or result == {}:
158
+ typer.echo("Created.")
159
+ else:
160
+ print_json(result)
161
+
162
+
163
+
164
+ @app.command("show")
165
+ def show(
166
+ id: str = typer.Argument(help="id"),
167
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
168
+ debug: bool = typer.Option(False, "--debug"),
169
+ ):
170
+ """Get specific Desktop Layout by ID."""
171
+ api = get_api(debug=debug)
172
+ cc_base_url = get_cc_base_url()
173
+ orgid = get_cc_org_id(api.session)
174
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/{id}"
175
+ try:
176
+ result = api.session.rest_get(url)
177
+ except WebexError as e:
178
+ handle_rest_error(e)
179
+ if output == "json":
180
+ print_json(result)
181
+ else:
182
+ if isinstance(result, dict):
183
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
184
+ elif isinstance(result, list):
185
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
186
+ else:
187
+ print_json(result)
188
+
189
+
190
+
191
+ @app.command("update")
192
+ def update(
193
+ id: str = typer.Argument(help="id"),
194
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. This field is require"),
195
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
196
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
197
+ name: str = typer.Option(None, "--name", help="A name for the Desktop Layout."),
198
+ description: str = typer.Option(None, "--description", help="A short description indicating the context of the Desktop La"),
199
+ edited_by: str = typer.Option(None, "--edited-by", help="Indicates who modified the Desktop Layout."),
200
+ json_file_name: str = typer.Option(None, "--json-file-name", help="Enter the name of the file."),
201
+ json_file_content: str = typer.Option(None, "--json-file-content", help="Enter the Desktop Layout json."),
202
+ global_param: bool = typer.Option(None, "--global/--no-global", help="Indicates if the Desktop Layout is a global layout or a cust"),
203
+ status: bool = typer.Option(None, "--status/--no-status", help="Indicates if the Desktop Layout is in active state or inacti"),
204
+ default_json_modified: bool = typer.Option(None, "--default-json-modified/--no-default-json-modified", help="Indicates if the default Desktop Layout is modified."),
205
+ validated: bool = typer.Option(None, "--validated/--no-validated", help="Indicates if the Desktop Layout is validated."),
206
+ validated_time: str = typer.Option(None, "--validated-time", help="Validated time(in epoch milliseconds) of this resource."),
207
+ default_json_modified_time: str = typer.Option(None, "--default-json-modified-time", help="Default Json Modified time(in epoch milliseconds) of this re"),
208
+ modified_time: str = typer.Option(None, "--modified-time", help="Modified time(in epoch milliseconds) of this resource."),
209
+ system_default: bool = typer.Option(None, "--system-default/--no-system-default", help="Indicates whether the created resource is system created or"),
210
+ created_time: str = typer.Option(None, "--created-time", help="This is the created time of the entity."),
211
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="This is the updated time of the entity."),
212
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
213
+ debug: bool = typer.Option(False, "--debug"),
214
+ ):
215
+ """Update specific Desktop Layout by ID\n\nExample --json-body:\n '{"name":"...","editedBy":"...","jsonFileName":"...","jsonFileContent":"...","global":true,"status":true,"defaultJsonModified":true,"validated":true}'."""
216
+ api = get_api(debug=debug)
217
+ cc_base_url = get_cc_base_url()
218
+ orgid = get_cc_org_id(api.session)
219
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/{id}"
220
+ if json_body:
221
+ body = json.loads(json_body)
222
+ else:
223
+ body = {}
224
+ if organization_id is not None:
225
+ body["organizationId"] = organization_id
226
+ if id_param is not None:
227
+ body["id"] = id_param
228
+ if version is not None:
229
+ body["version"] = version
230
+ if name is not None:
231
+ body["name"] = name
232
+ if description is not None:
233
+ body["description"] = description
234
+ if edited_by is not None:
235
+ body["editedBy"] = edited_by
236
+ if json_file_name is not None:
237
+ body["jsonFileName"] = json_file_name
238
+ if json_file_content is not None:
239
+ body["jsonFileContent"] = json_file_content
240
+ if global_param is not None:
241
+ body["global"] = global_param
242
+ if status is not None:
243
+ body["status"] = status
244
+ if default_json_modified is not None:
245
+ body["defaultJsonModified"] = default_json_modified
246
+ if validated is not None:
247
+ body["validated"] = validated
248
+ if validated_time is not None:
249
+ body["validatedTime"] = validated_time
250
+ if default_json_modified_time is not None:
251
+ body["defaultJsonModifiedTime"] = default_json_modified_time
252
+ if modified_time is not None:
253
+ body["modifiedTime"] = modified_time
254
+ if system_default is not None:
255
+ body["systemDefault"] = system_default
256
+ if created_time is not None:
257
+ body["createdTime"] = created_time
258
+ if last_updated_time is not None:
259
+ body["lastUpdatedTime"] = last_updated_time
260
+ try:
261
+ result = api.session.rest_put(url, json=body)
262
+ except WebexError as e:
263
+ handle_rest_error(e)
264
+ typer.echo(f"Updated.")
265
+
266
+
267
+
268
+ @app.command("delete")
269
+ def delete(
270
+ id: str = typer.Argument(help="id"),
271
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
272
+ debug: bool = typer.Option(False, "--debug"),
273
+ ):
274
+ """Delete specific Desktop Layout by ID."""
275
+ if not force:
276
+ typer.confirm(f"Delete {id}?", abort=True)
277
+ api = get_api(debug=debug)
278
+ cc_base_url = get_cc_base_url()
279
+ orgid = get_cc_org_id(api.session)
280
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/{id}"
281
+ try:
282
+ api.session.rest_delete(url)
283
+ except WebexError as e:
284
+ handle_rest_error(e)
285
+ typer.echo(f"Deleted: {id}")
286
+
287
+
288
+
289
+ @app.command("list")
290
+ def cmd_list(
291
+ id: str = typer.Argument(help="id"),
292
+ type_param: str = typer.Option(None, "--type", help="Entity type of the other entity that has a reference to this"),
293
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
294
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
295
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
296
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
297
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
298
+ debug: bool = typer.Option(False, "--debug"),
299
+ ):
300
+ """List references for a specific Desktop Layout."""
301
+ api = get_api(debug=debug)
302
+ cc_base_url = get_cc_base_url()
303
+ orgid = get_cc_org_id(api.session)
304
+ url = f"{cc_base_url}/organization/{orgid}/desktop-layout/{id}/incoming-references"
305
+ params = {}
306
+ if type_param is not None:
307
+ params["type"] = type_param
308
+ if page is not None:
309
+ params["page"] = page
310
+ if page_size is not None:
311
+ params["pageSize"] = page_size
312
+ if limit > 0:
313
+ params["max"] = limit
314
+ if offset > 0:
315
+ params["start"] = offset
316
+ result = None
317
+ try:
318
+ result = api.session.rest_get(url, params=params)
319
+ except WebexError as e:
320
+ handle_rest_error(e)
321
+ result = result or []
322
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
323
+ if output == "json":
324
+ print_json(items)
325
+ else:
326
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
327
+
328
+
329
+
330
+ @app.command("list-desktop-layout")
331
+ def list_desktop_layout(
332
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
333
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned. By default, all attri"),
334
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
335
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
336
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
337
+ single_object_response: str = typer.Option(None, "--single-object-response", help="Specifiy whether to include array fields in the response, Th"),
338
+ provisioning_view: str = typer.Option(None, "--provisioning-view", help="If set to true, the API will only return data that user has"),
339
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
340
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
341
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
342
+ debug: bool = typer.Option(False, "--debug"),
343
+ ):
344
+ """List Desktop Layout(s)."""
345
+ api = get_api(debug=debug)
346
+ cc_base_url = get_cc_base_url()
347
+ orgid = get_cc_org_id(api.session)
348
+ url = f"{cc_base_url}/organization/{orgid}/v2/desktop-layout"
349
+ params = {}
350
+ if filter_param is not None:
351
+ params["filter"] = filter_param
352
+ if attributes is not None:
353
+ params["attributes"] = attributes
354
+ if search is not None:
355
+ params["search"] = search
356
+ if page is not None:
357
+ params["page"] = page
358
+ if page_size is not None:
359
+ params["pageSize"] = page_size
360
+ if single_object_response is not None:
361
+ params["singleObjectResponse"] = single_object_response
362
+ if provisioning_view is not None:
363
+ params["provisioningView"] = provisioning_view
364
+ if limit > 0:
365
+ params["max"] = limit
366
+ if offset > 0:
367
+ params["start"] = offset
368
+ result = None
369
+ try:
370
+ result = api.session.rest_get(url, params=params)
371
+ except WebexError as e:
372
+ handle_rest_error(e)
373
+ result = result or []
374
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
375
+ if output == "json":
376
+ print_json(items)
377
+ else:
378
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
379
+
380
+