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,844 @@
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 get_org_id, get_cc_base_url, get_cc_org_id
7
+
8
+
9
+ app = typer.Typer(help="Manage Webex Contact Center cc-tasks.")
10
+
11
+
12
+ @app.command("list")
13
+ def cmd_list(
14
+ channel_types: str = typer.Option(None, "--channel-types", help="Task channel type(s) permitted in response. Separate values"),
15
+ from_param: str = typer.Option(..., "--from", help="Filters tasks created after the given epoch timestamp (in mi"),
16
+ to: str = typer.Option(None, "--to", help="Filters tasks created before the given epoch timestamp (in m"),
17
+ page_size: str = typer.Option(None, "--page-size", help="Maximum page size in the response. Maximum allowed value is"),
18
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
19
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
20
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
21
+ debug: bool = typer.Option(False, "--debug"),
22
+ ):
23
+ """Get Tasks."""
24
+ api = get_api(debug=debug)
25
+ cc_base_url = get_cc_base_url()
26
+ url = f"{cc_base_url}/tasks"
27
+ params = {}
28
+ if channel_types is not None:
29
+ params["channelTypes"] = channel_types
30
+ if from_param is not None:
31
+ params["from"] = from_param
32
+ if to is not None:
33
+ params["to"] = to
34
+ if page_size is not None:
35
+ params["pageSize"] = page_size
36
+ if limit > 0:
37
+ params["max"] = limit
38
+ if offset > 0:
39
+ params["start"] = offset
40
+ org_id = get_org_id()
41
+ if org_id is not None:
42
+ params["orgId"] = org_id
43
+ result = None
44
+ try:
45
+ result = api.session.rest_get(url, params=params)
46
+ except WebexError as e:
47
+ handle_rest_error(e)
48
+ result = result or []
49
+ items = result.get("data", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
50
+ if output == "json":
51
+ print_json(items)
52
+ else:
53
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
54
+
55
+
56
+
57
+ @app.command("create")
58
+ def create(
59
+ destination: str = typer.Option(None, "--destination", help="(required) A valid customer DN, on which the response is expected, maxi"),
60
+ entry_point_id: str = typer.Option(None, "--entry-point-id", help="(required) An entryPointId for respective task. For ```CALLBACK``` and"),
61
+ outbound_type: str = typer.Option(None, "--outbound-type", help="The outbound type for the task. Supported values are ```CALL"),
62
+ media_type: str = typer.Option(None, "--media-type", help="(required) The media type for the request. The ```telephony``` type is"),
63
+ origin: str = typer.Option(None, "--origin", help="The contact center number, which is an ANI Outdial number, t"),
64
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
65
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
66
+ debug: bool = typer.Option(False, "--debug"),
67
+ ):
68
+ """Create Task\n\nExample --json-body:\n '{"destination":"...","entryPointId":"...","mediaType":"...","attributes":{},"outboundType":"...","origin":"...","callback":{"callbackOrigin":"...","callbackType":"..."},"customAttributes":{}}'."""
69
+ api = get_api(debug=debug)
70
+ cc_base_url = get_cc_base_url()
71
+ url = f"{cc_base_url}/tasks"
72
+ if json_body:
73
+ body = json.loads(json_body)
74
+ else:
75
+ body = {}
76
+ if destination is not None:
77
+ body["destination"] = destination
78
+ if entry_point_id is not None:
79
+ body["entryPointId"] = entry_point_id
80
+ if outbound_type is not None:
81
+ body["outboundType"] = outbound_type
82
+ if media_type is not None:
83
+ body["mediaType"] = media_type
84
+ if origin is not None:
85
+ body["origin"] = origin
86
+ _missing = [f for f in ['destination', 'entryPointId', 'mediaType'] if f not in body or body[f] is None]
87
+ if _missing:
88
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
89
+ raise typer.Exit(1)
90
+ try:
91
+ result = api.session.rest_post(url, json=body)
92
+ except WebexError as e:
93
+ handle_rest_error(e)
94
+ if output == "json":
95
+ print_json(result)
96
+ elif isinstance(result, dict) and "id" in result:
97
+ typer.echo(f"Created: {result['id']}")
98
+ elif not result or result == {}:
99
+ typer.echo("Created.")
100
+ else:
101
+ print_json(result)
102
+
103
+
104
+
105
+ @app.command("update")
106
+ def update(
107
+ task_id: str = typer.Argument(help="taskId"),
108
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
109
+ debug: bool = typer.Option(False, "--debug"),
110
+ ):
111
+ """Update Task\n\nExample --json-body:\n '{"attributes":{}}'."""
112
+ api = get_api(debug=debug)
113
+ cc_base_url = get_cc_base_url()
114
+ url = f"{cc_base_url}/tasks/{task_id}"
115
+ if json_body:
116
+ body = json.loads(json_body)
117
+ else:
118
+ body = {}
119
+ try:
120
+ result = api.session.rest_patch(url, json=body)
121
+ except WebexError as e:
122
+ handle_rest_error(e)
123
+ typer.echo(f"Updated.")
124
+
125
+
126
+
127
+ @app.command("create-accept-tasks")
128
+ def create_accept_tasks(
129
+ task_id: str = typer.Argument(help="taskId"),
130
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
131
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
132
+ debug: bool = typer.Option(False, "--debug"),
133
+ ):
134
+ """Accept Task."""
135
+ api = get_api(debug=debug)
136
+ cc_base_url = get_cc_base_url()
137
+ url = f"{cc_base_url}/tasks/{task_id}/accept"
138
+ if json_body:
139
+ body = json.loads(json_body)
140
+ else:
141
+ body = {}
142
+ try:
143
+ result = api.session.rest_post(url, json=body)
144
+ except WebexError as e:
145
+ handle_rest_error(e)
146
+ if output == "json":
147
+ print_json(result)
148
+ elif isinstance(result, dict) and "id" in result:
149
+ typer.echo(f"Created: {result['id']}")
150
+ elif not result or result == {}:
151
+ typer.echo("Created.")
152
+ else:
153
+ print_json(result)
154
+
155
+
156
+
157
+ @app.command("create-end-tasks")
158
+ def create_end_tasks(
159
+ task_id: str = typer.Argument(help="taskId"),
160
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
161
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
162
+ debug: bool = typer.Option(False, "--debug"),
163
+ ):
164
+ """End Task."""
165
+ api = get_api(debug=debug)
166
+ cc_base_url = get_cc_base_url()
167
+ url = f"{cc_base_url}/tasks/{task_id}/end"
168
+ if json_body:
169
+ body = json.loads(json_body)
170
+ else:
171
+ body = {}
172
+ try:
173
+ result = api.session.rest_post(url, json=body)
174
+ except WebexError as e:
175
+ handle_rest_error(e)
176
+ if output == "json":
177
+ print_json(result)
178
+ elif isinstance(result, dict) and "id" in result:
179
+ typer.echo(f"Created: {result['id']}")
180
+ elif not result or result == {}:
181
+ typer.echo("Created.")
182
+ else:
183
+ print_json(result)
184
+
185
+
186
+
187
+ @app.command("create-wrapup")
188
+ def create_wrapup(
189
+ task_id: str = typer.Argument(help="taskId"),
190
+ aux_code_id: str = typer.Option(None, "--aux-code-id", help="(required) Auxiliary codes are status codes which an agent can select i"),
191
+ wrap_up_reason: str = typer.Option(None, "--wrap-up-reason", help="(required) Every wrap up reason will have an unique auxillary code. Use"),
192
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
193
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
194
+ debug: bool = typer.Option(False, "--debug"),
195
+ ):
196
+ """Wrap Up Task."""
197
+ api = get_api(debug=debug)
198
+ cc_base_url = get_cc_base_url()
199
+ url = f"{cc_base_url}/tasks/{task_id}/wrapup"
200
+ if json_body:
201
+ body = json.loads(json_body)
202
+ else:
203
+ body = {}
204
+ if aux_code_id is not None:
205
+ body["auxCodeId"] = aux_code_id
206
+ if wrap_up_reason is not None:
207
+ body["wrapUpReason"] = wrap_up_reason
208
+ _missing = [f for f in ['auxCodeId', 'wrapUpReason'] if f not in body or body[f] is None]
209
+ if _missing:
210
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
211
+ raise typer.Exit(1)
212
+ try:
213
+ result = api.session.rest_post(url, json=body)
214
+ except WebexError as e:
215
+ handle_rest_error(e)
216
+ if output == "json":
217
+ print_json(result)
218
+ elif isinstance(result, dict) and "id" in result:
219
+ typer.echo(f"Created: {result['id']}")
220
+ elif not result or result == {}:
221
+ typer.echo("Created.")
222
+ else:
223
+ print_json(result)
224
+
225
+
226
+
227
+ @app.command("create-hold")
228
+ def create_hold(
229
+ task_id: str = typer.Argument(help="taskId"),
230
+ media_resource_id: str = typer.Option(None, "--media-resource-id", help="(required) It is an identifier of a media resource, maximum length 36 c"),
231
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
232
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
233
+ debug: bool = typer.Option(False, "--debug"),
234
+ ):
235
+ """Hold Task."""
236
+ api = get_api(debug=debug)
237
+ cc_base_url = get_cc_base_url()
238
+ url = f"{cc_base_url}/tasks/{task_id}/hold"
239
+ if json_body:
240
+ body = json.loads(json_body)
241
+ else:
242
+ body = {}
243
+ if media_resource_id is not None:
244
+ body["mediaResourceId"] = media_resource_id
245
+ _missing = [f for f in ['mediaResourceId'] if f not in body or body[f] is None]
246
+ if _missing:
247
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
248
+ raise typer.Exit(1)
249
+ try:
250
+ result = api.session.rest_post(url, json=body)
251
+ except WebexError as e:
252
+ handle_rest_error(e)
253
+ if output == "json":
254
+ print_json(result)
255
+ elif isinstance(result, dict) and "id" in result:
256
+ typer.echo(f"Created: {result['id']}")
257
+ elif not result or result == {}:
258
+ typer.echo("Created.")
259
+ else:
260
+ print_json(result)
261
+
262
+
263
+
264
+ @app.command("create-unhold")
265
+ def create_unhold(
266
+ task_id: str = typer.Argument(help="taskId"),
267
+ media_resource_id: str = typer.Option(None, "--media-resource-id", help="(required) It is an identifier of a media resource, maximum length 36 c"),
268
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
269
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
270
+ debug: bool = typer.Option(False, "--debug"),
271
+ ):
272
+ """Resume Task."""
273
+ api = get_api(debug=debug)
274
+ cc_base_url = get_cc_base_url()
275
+ url = f"{cc_base_url}/tasks/{task_id}/unhold"
276
+ if json_body:
277
+ body = json.loads(json_body)
278
+ else:
279
+ body = {}
280
+ if media_resource_id is not None:
281
+ body["mediaResourceId"] = media_resource_id
282
+ _missing = [f for f in ['mediaResourceId'] if f not in body or body[f] is None]
283
+ if _missing:
284
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
285
+ raise typer.Exit(1)
286
+ try:
287
+ result = api.session.rest_post(url, json=body)
288
+ except WebexError as e:
289
+ handle_rest_error(e)
290
+ if output == "json":
291
+ print_json(result)
292
+ elif isinstance(result, dict) and "id" in result:
293
+ typer.echo(f"Created: {result['id']}")
294
+ elif not result or result == {}:
295
+ typer.echo("Created.")
296
+ else:
297
+ print_json(result)
298
+
299
+
300
+
301
+ @app.command("create-reject")
302
+ def create_reject(
303
+ task_id: str = typer.Argument(help="taskId"),
304
+ media_resource_id: str = typer.Option(None, "--media-resource-id", help="(required) It is an identifier of a media resource, maximum length 36 c"),
305
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
306
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
307
+ debug: bool = typer.Option(False, "--debug"),
308
+ ):
309
+ """Reject Task."""
310
+ api = get_api(debug=debug)
311
+ cc_base_url = get_cc_base_url()
312
+ url = f"{cc_base_url}/tasks/{task_id}/reject"
313
+ if json_body:
314
+ body = json.loads(json_body)
315
+ else:
316
+ body = {}
317
+ if media_resource_id is not None:
318
+ body["mediaResourceId"] = media_resource_id
319
+ _missing = [f for f in ['mediaResourceId'] if f not in body or body[f] is None]
320
+ if _missing:
321
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
322
+ raise typer.Exit(1)
323
+ try:
324
+ result = api.session.rest_post(url, json=body)
325
+ except WebexError as e:
326
+ handle_rest_error(e)
327
+ if output == "json":
328
+ print_json(result)
329
+ elif isinstance(result, dict) and "id" in result:
330
+ typer.echo(f"Created: {result['id']}")
331
+ elif not result or result == {}:
332
+ typer.echo("Created.")
333
+ else:
334
+ print_json(result)
335
+
336
+
337
+
338
+ @app.command("create-pause")
339
+ def create_pause(
340
+ task_id: str = typer.Argument(help="taskId"),
341
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
342
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
343
+ debug: bool = typer.Option(False, "--debug"),
344
+ ):
345
+ """Pause Recording Task."""
346
+ api = get_api(debug=debug)
347
+ cc_base_url = get_cc_base_url()
348
+ url = f"{cc_base_url}/tasks/{task_id}/record/pause"
349
+ if json_body:
350
+ body = json.loads(json_body)
351
+ else:
352
+ body = {}
353
+ try:
354
+ result = api.session.rest_post(url, json=body)
355
+ except WebexError as e:
356
+ handle_rest_error(e)
357
+ if output == "json":
358
+ print_json(result)
359
+ elif isinstance(result, dict) and "id" in result:
360
+ typer.echo(f"Created: {result['id']}")
361
+ elif not result or result == {}:
362
+ typer.echo("Created.")
363
+ else:
364
+ print_json(result)
365
+
366
+
367
+
368
+ @app.command("create-resume")
369
+ def create_resume(
370
+ task_id: str = typer.Argument(help="taskId"),
371
+ auto_resumed: bool = typer.Option(None, "--auto-resumed/--no-auto-resumed", help="(required) The setting to mention if the recording has to resume automa"),
372
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
373
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
374
+ debug: bool = typer.Option(False, "--debug"),
375
+ ):
376
+ """Resume Recording Task."""
377
+ api = get_api(debug=debug)
378
+ cc_base_url = get_cc_base_url()
379
+ url = f"{cc_base_url}/tasks/{task_id}/record/resume"
380
+ if json_body:
381
+ body = json.loads(json_body)
382
+ else:
383
+ body = {}
384
+ if auto_resumed is not None:
385
+ body["autoResumed"] = auto_resumed
386
+ _missing = [f for f in ['autoResumed'] if f not in body or body[f] is None]
387
+ if _missing:
388
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
389
+ raise typer.Exit(1)
390
+ try:
391
+ result = api.session.rest_post(url, json=body)
392
+ except WebexError as e:
393
+ handle_rest_error(e)
394
+ if output == "json":
395
+ print_json(result)
396
+ elif isinstance(result, dict) and "id" in result:
397
+ typer.echo(f"Created: {result['id']}")
398
+ elif not result or result == {}:
399
+ typer.echo("Created.")
400
+ else:
401
+ print_json(result)
402
+
403
+
404
+
405
+ @app.command("create-transfer-tasks")
406
+ def create_transfer_tasks(
407
+ task_id: str = typer.Argument(help="taskId"),
408
+ to: str = typer.Option(None, "--to", help="(required) The user destination ID or the entry point ID to transfer, m"),
409
+ destination_type: str = typer.Option(None, "--destination-type", help="(required) The user can transfer to another user in the team(```agent``"),
410
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
411
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
412
+ debug: bool = typer.Option(False, "--debug"),
413
+ ):
414
+ """Transfer Task."""
415
+ api = get_api(debug=debug)
416
+ cc_base_url = get_cc_base_url()
417
+ url = f"{cc_base_url}/tasks/{task_id}/transfer"
418
+ if json_body:
419
+ body = json.loads(json_body)
420
+ else:
421
+ body = {}
422
+ if to is not None:
423
+ body["to"] = to
424
+ if destination_type is not None:
425
+ body["destinationType"] = destination_type
426
+ _missing = [f for f in ['to', 'destinationType'] if f not in body or body[f] is None]
427
+ if _missing:
428
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
429
+ raise typer.Exit(1)
430
+ try:
431
+ result = api.session.rest_post(url, json=body)
432
+ except WebexError as e:
433
+ handle_rest_error(e)
434
+ if output == "json":
435
+ print_json(result)
436
+ elif isinstance(result, dict) and "id" in result:
437
+ typer.echo(f"Created: {result['id']}")
438
+ elif not result or result == {}:
439
+ typer.echo("Created.")
440
+ else:
441
+ print_json(result)
442
+
443
+
444
+
445
+ @app.command("create-consult")
446
+ def create_consult(
447
+ task_id: str = typer.Argument(help="taskId"),
448
+ to: str = typer.Option(None, "--to", help="(required) The destination ID to consult, maximum length 36 characters."),
449
+ destination_type: str = typer.Option(None, "--destination-type", help="(required) The user can consult to another user in the team(```agent```"),
450
+ hold_participants: bool = typer.Option(None, "--hold-participants/--no-hold-participants", help="This allows the caller to specify their preference for wheth"),
451
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
452
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
453
+ debug: bool = typer.Option(False, "--debug"),
454
+ ):
455
+ """Consult Task."""
456
+ api = get_api(debug=debug)
457
+ cc_base_url = get_cc_base_url()
458
+ url = f"{cc_base_url}/tasks/{task_id}/consult"
459
+ if json_body:
460
+ body = json.loads(json_body)
461
+ else:
462
+ body = {}
463
+ if to is not None:
464
+ body["to"] = to
465
+ if destination_type is not None:
466
+ body["destinationType"] = destination_type
467
+ if hold_participants is not None:
468
+ body["holdParticipants"] = hold_participants
469
+ _missing = [f for f in ['to', 'destinationType'] if f not in body or body[f] is None]
470
+ if _missing:
471
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
472
+ raise typer.Exit(1)
473
+ try:
474
+ result = api.session.rest_post(url, json=body)
475
+ except WebexError as e:
476
+ handle_rest_error(e)
477
+ if output == "json":
478
+ print_json(result)
479
+ elif isinstance(result, dict) and "id" in result:
480
+ typer.echo(f"Created: {result['id']}")
481
+ elif not result or result == {}:
482
+ typer.echo("Created.")
483
+ else:
484
+ print_json(result)
485
+
486
+
487
+
488
+ @app.command("create-conference")
489
+ def create_conference(
490
+ task_id: str = typer.Argument(help="taskId"),
491
+ agent_id: str = typer.Option(None, "--agent-id", help="The unique Id of the user logged in as an agent."),
492
+ to: str = typer.Option(None, "--to", help="(required) The destination ID to consult, maximum length 36 characters."),
493
+ destination_type: str = typer.Option(None, "--destination-type", help="The user can consult to another user in the team(```agent```"),
494
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
495
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
496
+ debug: bool = typer.Option(False, "--debug"),
497
+ ):
498
+ """Consult Conference Task."""
499
+ api = get_api(debug=debug)
500
+ cc_base_url = get_cc_base_url()
501
+ url = f"{cc_base_url}/tasks/{task_id}/consult/conference"
502
+ if json_body:
503
+ body = json.loads(json_body)
504
+ else:
505
+ body = {}
506
+ if agent_id is not None:
507
+ body["agentId"] = agent_id
508
+ if to is not None:
509
+ body["to"] = to
510
+ if destination_type is not None:
511
+ body["destinationType"] = destination_type
512
+ _missing = [f for f in ['to'] if f not in body or body[f] is None]
513
+ if _missing:
514
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
515
+ raise typer.Exit(1)
516
+ try:
517
+ result = api.session.rest_post(url, json=body)
518
+ except WebexError as e:
519
+ handle_rest_error(e)
520
+ if output == "json":
521
+ print_json(result)
522
+ elif isinstance(result, dict) and "id" in result:
523
+ typer.echo(f"Created: {result['id']}")
524
+ elif not result or result == {}:
525
+ typer.echo("Created.")
526
+ else:
527
+ print_json(result)
528
+
529
+
530
+
531
+ @app.command("create-transfer-consult")
532
+ def create_transfer_consult(
533
+ task_id: str = typer.Argument(help="taskId"),
534
+ to: str = typer.Option(None, "--to", help="(required) The consulted user destination ID to transfer, maximum lengt"),
535
+ destination_type: str = typer.Option(None, "--destination-type", help="(required) The user can transfer to another consulted user in the team("),
536
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
537
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
538
+ debug: bool = typer.Option(False, "--debug"),
539
+ ):
540
+ """Consult Transfer Task."""
541
+ api = get_api(debug=debug)
542
+ cc_base_url = get_cc_base_url()
543
+ url = f"{cc_base_url}/tasks/{task_id}/consult/transfer"
544
+ if json_body:
545
+ body = json.loads(json_body)
546
+ else:
547
+ body = {}
548
+ if to is not None:
549
+ body["to"] = to
550
+ if destination_type is not None:
551
+ body["destinationType"] = destination_type
552
+ _missing = [f for f in ['to', 'destinationType'] if f not in body or body[f] is None]
553
+ if _missing:
554
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
555
+ raise typer.Exit(1)
556
+ try:
557
+ result = api.session.rest_post(url, json=body)
558
+ except WebexError as e:
559
+ handle_rest_error(e)
560
+ if output == "json":
561
+ print_json(result)
562
+ elif isinstance(result, dict) and "id" in result:
563
+ typer.echo(f"Created: {result['id']}")
564
+ elif not result or result == {}:
565
+ typer.echo("Created.")
566
+ else:
567
+ print_json(result)
568
+
569
+
570
+
571
+ @app.command("create-accept-consult")
572
+ def create_accept_consult(
573
+ task_id: str = typer.Argument(help="taskId"),
574
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
575
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
576
+ debug: bool = typer.Option(False, "--debug"),
577
+ ):
578
+ """Consult Accept Task."""
579
+ api = get_api(debug=debug)
580
+ cc_base_url = get_cc_base_url()
581
+ url = f"{cc_base_url}/tasks/{task_id}/consult/accept"
582
+ if json_body:
583
+ body = json.loads(json_body)
584
+ else:
585
+ body = {}
586
+ try:
587
+ result = api.session.rest_post(url, json=body)
588
+ except WebexError as e:
589
+ handle_rest_error(e)
590
+ if output == "json":
591
+ print_json(result)
592
+ elif isinstance(result, dict) and "id" in result:
593
+ typer.echo(f"Created: {result['id']}")
594
+ elif not result or result == {}:
595
+ typer.echo("Created.")
596
+ else:
597
+ print_json(result)
598
+
599
+
600
+
601
+ @app.command("create-assign")
602
+ def create_assign(
603
+ task_id: str = typer.Argument(help="taskId"),
604
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
605
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
606
+ debug: bool = typer.Option(False, "--debug"),
607
+ ):
608
+ """Assign Task."""
609
+ api = get_api(debug=debug)
610
+ cc_base_url = get_cc_base_url()
611
+ url = f"{cc_base_url}/tasks/{task_id}/assign"
612
+ if json_body:
613
+ body = json.loads(json_body)
614
+ else:
615
+ body = {}
616
+ try:
617
+ result = api.session.rest_post(url, json=body)
618
+ except WebexError as e:
619
+ handle_rest_error(e)
620
+ if output == "json":
621
+ print_json(result)
622
+ elif isinstance(result, dict) and "id" in result:
623
+ typer.echo(f"Created: {result['id']}")
624
+ elif not result or result == {}:
625
+ typer.echo("Created.")
626
+ else:
627
+ print_json(result)
628
+
629
+
630
+
631
+ @app.command("create-end-consult")
632
+ def create_end_consult(
633
+ task_id: str = typer.Argument(help="taskId"),
634
+ queue_id: str = typer.Option(None, "--queue-id", help="The unique ID of a particular queue, maximum length 36 chara"),
635
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
636
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
637
+ debug: bool = typer.Option(False, "--debug"),
638
+ ):
639
+ """Consult End Task."""
640
+ api = get_api(debug=debug)
641
+ cc_base_url = get_cc_base_url()
642
+ url = f"{cc_base_url}/tasks/{task_id}/consult/end"
643
+ if json_body:
644
+ body = json.loads(json_body)
645
+ else:
646
+ body = {}
647
+ if queue_id is not None:
648
+ body["queueId"] = queue_id
649
+ try:
650
+ result = api.session.rest_post(url, json=body)
651
+ except WebexError as e:
652
+ handle_rest_error(e)
653
+ if output == "json":
654
+ print_json(result)
655
+ elif isinstance(result, dict) and "id" in result:
656
+ typer.echo(f"Created: {result['id']}")
657
+ elif not result or result == {}:
658
+ typer.echo("Created.")
659
+ else:
660
+ print_json(result)
661
+
662
+
663
+
664
+ @app.command("create-exit")
665
+ def create_exit(
666
+ task_id: str = typer.Argument(help="taskId"),
667
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
668
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
669
+ debug: bool = typer.Option(False, "--debug"),
670
+ ):
671
+ """Exit Conference Task."""
672
+ api = get_api(debug=debug)
673
+ cc_base_url = get_cc_base_url()
674
+ url = f"{cc_base_url}/tasks/{task_id}/conference/exit"
675
+ if json_body:
676
+ body = json.loads(json_body)
677
+ else:
678
+ body = {}
679
+ try:
680
+ result = api.session.rest_post(url, json=body)
681
+ except WebexError as e:
682
+ handle_rest_error(e)
683
+ if output == "json":
684
+ print_json(result)
685
+ elif isinstance(result, dict) and "id" in result:
686
+ typer.echo(f"Created: {result['id']}")
687
+ elif not result or result == {}:
688
+ typer.echo("Created.")
689
+ else:
690
+ print_json(result)
691
+
692
+
693
+
694
+ @app.command("create-accept-preview-task")
695
+ def create_accept_preview_task(
696
+ task_id: str = typer.Argument(help="taskId"),
697
+ campaign_id: str = typer.Argument(help="campaignId"),
698
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
699
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
700
+ debug: bool = typer.Option(False, "--debug"),
701
+ ):
702
+ """Accept Preview Task."""
703
+ api = get_api(debug=debug)
704
+ cc_base_url = get_cc_base_url()
705
+ url = f"{cc_base_url}/dialer/campaign/{campaign_id}/preview-task/{task_id}/accept"
706
+ if json_body:
707
+ body = json.loads(json_body)
708
+ else:
709
+ body = {}
710
+ try:
711
+ result = api.session.rest_post(url, json=body)
712
+ except WebexError as e:
713
+ handle_rest_error(e)
714
+ if output == "json":
715
+ print_json(result)
716
+ elif isinstance(result, dict) and "id" in result:
717
+ typer.echo(f"Created: {result['id']}")
718
+ elif not result or result == {}:
719
+ typer.echo("Created.")
720
+ else:
721
+ print_json(result)
722
+
723
+
724
+
725
+ @app.command("create-skip")
726
+ def create_skip(
727
+ task_id: str = typer.Argument(help="taskId"),
728
+ campaign_id: str = typer.Argument(help="campaignId"),
729
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
730
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
731
+ debug: bool = typer.Option(False, "--debug"),
732
+ ):
733
+ """Skip Preview Task."""
734
+ api = get_api(debug=debug)
735
+ cc_base_url = get_cc_base_url()
736
+ url = f"{cc_base_url}/dialer/campaign/{campaign_id}/preview-task/{task_id}/skip"
737
+ if json_body:
738
+ body = json.loads(json_body)
739
+ else:
740
+ body = {}
741
+ try:
742
+ result = api.session.rest_post(url, json=body)
743
+ except WebexError as e:
744
+ handle_rest_error(e)
745
+ if output == "json":
746
+ print_json(result)
747
+ elif isinstance(result, dict) and "id" in result:
748
+ typer.echo(f"Created: {result['id']}")
749
+ elif not result or result == {}:
750
+ typer.echo("Created.")
751
+ else:
752
+ print_json(result)
753
+
754
+
755
+
756
+ @app.command("create-remove")
757
+ def create_remove(
758
+ task_id: str = typer.Argument(help="taskId"),
759
+ campaign_id: str = typer.Argument(help="campaignId"),
760
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
761
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
762
+ debug: bool = typer.Option(False, "--debug"),
763
+ ):
764
+ """Remove Preview Task."""
765
+ api = get_api(debug=debug)
766
+ cc_base_url = get_cc_base_url()
767
+ url = f"{cc_base_url}/dialer/campaign/{campaign_id}/preview-task/{task_id}/remove"
768
+ if json_body:
769
+ body = json.loads(json_body)
770
+ else:
771
+ body = {}
772
+ try:
773
+ result = api.session.rest_post(url, json=body)
774
+ except WebexError as e:
775
+ handle_rest_error(e)
776
+ if output == "json":
777
+ print_json(result)
778
+ elif isinstance(result, dict) and "id" in result:
779
+ typer.echo(f"Created: {result['id']}")
780
+ elif not result or result == {}:
781
+ typer.echo("Created.")
782
+ else:
783
+ print_json(result)
784
+
785
+
786
+
787
+ @app.command("create-tasks")
788
+ def create_tasks(
789
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
790
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
791
+ debug: bool = typer.Option(False, "--debug"),
792
+ ):
793
+ """Create Task."""
794
+ api = get_api(debug=debug)
795
+ cc_base_url = get_cc_base_url()
796
+ url = f"{cc_base_url}/v2/tasks"
797
+ if json_body:
798
+ body = json.loads(json_body)
799
+ else:
800
+ body = {}
801
+ try:
802
+ result = api.session.rest_post(url, json=body)
803
+ except WebexError as e:
804
+ handle_rest_error(e)
805
+ if output == "json":
806
+ print_json(result)
807
+ elif isinstance(result, dict) and "id" in result:
808
+ typer.echo(f"Created: {result['id']}")
809
+ elif not result or result == {}:
810
+ typer.echo("Created.")
811
+ else:
812
+ print_json(result)
813
+
814
+
815
+
816
+ @app.command("create-messages")
817
+ def create_messages(
818
+ task_id: str = typer.Argument(help="taskId"),
819
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
820
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
821
+ debug: bool = typer.Option(False, "--debug"),
822
+ ):
823
+ """Append Task Message."""
824
+ api = get_api(debug=debug)
825
+ cc_base_url = get_cc_base_url()
826
+ url = f"{cc_base_url}/v2/tasks/{task_id}/messages"
827
+ if json_body:
828
+ body = json.loads(json_body)
829
+ else:
830
+ body = {}
831
+ try:
832
+ result = api.session.rest_post(url, json=body)
833
+ except WebexError as e:
834
+ handle_rest_error(e)
835
+ if output == "json":
836
+ print_json(result)
837
+ elif isinstance(result, dict) and "id" in result:
838
+ typer.echo(f"Created: {result['id']}")
839
+ elif not result or result == {}:
840
+ typer.echo("Created.")
841
+ else:
842
+ print_json(result)
843
+
844
+