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,458 @@
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-aux-code.")
10
+
11
+
12
+ @app.command("list")
13
+ def cmd_list(
14
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
15
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned.Default all attributes"),
16
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
17
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
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
+ """List Auxiliary Code(s)."""
24
+ api = get_api(debug=debug)
25
+ cc_base_url = get_cc_base_url()
26
+ orgid = get_cc_org_id(api.session)
27
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code"
28
+ params = {}
29
+ if filter_param is not None:
30
+ params["filter"] = filter_param
31
+ if attributes is not None:
32
+ params["attributes"] = attributes
33
+ if page is not None:
34
+ params["page"] = page
35
+ if page_size is not None:
36
+ params["pageSize"] = page_size
37
+ if limit > 0:
38
+ params["max"] = limit
39
+ if offset > 0:
40
+ params["start"] = offset
41
+ result = None
42
+ try:
43
+ result = api.session.rest_get(url, params=params)
44
+ except WebexError as e:
45
+ handle_rest_error(e)
46
+ result = result or []
47
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
48
+ if output == "json":
49
+ print_json(items)
50
+ else:
51
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
52
+
53
+
54
+
55
+ @app.command("create")
56
+ def create(
57
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. It is required to def"),
58
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
59
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
60
+ name: str = typer.Option(None, "--name", help="(required) A name for the code."),
61
+ description: str = typer.Option(None, "--description", help="A short description indicating the context of the code."),
62
+ default_code: bool = typer.Option(None, "--default-code/--no-default-code", help="(required) Indicates whether this is the default code(true) or not(fals"),
63
+ active: bool = typer.Option(None, "--active/--no-active", help="(required) Indicates whether the code is active(when true) or not activ"),
64
+ is_system_code: bool = typer.Option(None, "--is-system-code/--no-is-system-code", help="Indicates whether this is the system default code(true) or n"),
65
+ work_type_id: str = typer.Option(None, "--work-type-id", help="(required) Indicates the work type id associated with this code."),
66
+ work_type_code: str = typer.Option(None, "--work-type-code", help="(required) Choices: IDLE_CODE, WRAP_UP_CODE"),
67
+ burnout_inclusion: str = typer.Option(None, "--burnout-inclusion", help="Choices: NOT_APPLICABLE, EXCLUDED, INCLUDED"),
68
+ system_default: bool = typer.Option(None, "--system-default/--no-system-default", help="Indicates whether the created resource is system created or"),
69
+ created_time: str = typer.Option(None, "--created-time", help="Creation time(in epoch millis) of this resource."),
70
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="Time(in epoch millis) when this resource was last updated."),
71
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
72
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
73
+ debug: bool = typer.Option(False, "--debug"),
74
+ ):
75
+ """Create a new Auxiliary Code."""
76
+ api = get_api(debug=debug)
77
+ cc_base_url = get_cc_base_url()
78
+ orgid = get_cc_org_id(api.session)
79
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code"
80
+ if json_body:
81
+ body = json.loads(json_body)
82
+ else:
83
+ body = {}
84
+ if organization_id is not None:
85
+ body["organizationId"] = organization_id
86
+ if id_param is not None:
87
+ body["id"] = id_param
88
+ if version is not None:
89
+ body["version"] = version
90
+ if name is not None:
91
+ body["name"] = name
92
+ if description is not None:
93
+ body["description"] = description
94
+ if default_code is not None:
95
+ body["defaultCode"] = default_code
96
+ if active is not None:
97
+ body["active"] = active
98
+ if is_system_code is not None:
99
+ body["isSystemCode"] = is_system_code
100
+ if work_type_id is not None:
101
+ body["workTypeId"] = work_type_id
102
+ if work_type_code is not None:
103
+ body["workTypeCode"] = work_type_code
104
+ if burnout_inclusion is not None:
105
+ body["burnoutInclusion"] = burnout_inclusion
106
+ if system_default is not None:
107
+ body["systemDefault"] = system_default
108
+ if created_time is not None:
109
+ body["createdTime"] = created_time
110
+ if last_updated_time is not None:
111
+ body["lastUpdatedTime"] = last_updated_time
112
+ _missing = [f for f in ['name', 'defaultCode', 'active', 'workTypeId', 'workTypeCode'] if f not in body or body[f] is None]
113
+ if _missing:
114
+ typer.echo("Error: Missing required fields: " + ", ".join(_missing), err=True)
115
+ raise typer.Exit(1)
116
+ try:
117
+ result = api.session.rest_post(url, json=body)
118
+ except WebexError as e:
119
+ handle_rest_error(e)
120
+ if output == "json":
121
+ print_json(result)
122
+ elif isinstance(result, dict) and "id" in result:
123
+ typer.echo(f"Created: {result['id']}")
124
+ elif not result or result == {}:
125
+ typer.echo("Created.")
126
+ else:
127
+ print_json(result)
128
+
129
+
130
+
131
+ @app.command("create-bulk")
132
+ def create_bulk(
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
+ """Bulk save Auxiliary Code(s)\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
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}/auxiliary-code/bulk"
142
+ if json_body:
143
+ body = json.loads(json_body)
144
+ else:
145
+ body = {}
146
+ try:
147
+ result = api.session.rest_post(url, json=body)
148
+ except WebexError as e:
149
+ handle_rest_error(e)
150
+ if output == "json":
151
+ print_json(result)
152
+ elif isinstance(result, dict) and "id" in result:
153
+ typer.echo(f"Created: {result['id']}")
154
+ elif not result or result == {}:
155
+ typer.echo("Created.")
156
+ else:
157
+ print_json(result)
158
+
159
+
160
+
161
+ @app.command("update")
162
+ def update(
163
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
164
+ debug: bool = typer.Option(False, "--debug"),
165
+ ):
166
+ """Bulk partial update Auxiliary Code(s)\n\nExample --json-body:\n '{"items":[{"itemIdentifier":"...","item":"...","requestAction":"..."}]}'."""
167
+ api = get_api(debug=debug)
168
+ cc_base_url = get_cc_base_url()
169
+ orgid = get_cc_org_id(api.session)
170
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/bulk"
171
+ if json_body:
172
+ body = json.loads(json_body)
173
+ else:
174
+ body = {}
175
+ try:
176
+ result = api.session.rest_patch(url, json=body)
177
+ except WebexError as e:
178
+ handle_rest_error(e)
179
+ typer.echo(f"Updated.")
180
+
181
+
182
+
183
+ @app.command("list-bulk-export")
184
+ def list_bulk_export(
185
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
186
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
187
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
188
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
189
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
190
+ debug: bool = typer.Option(False, "--debug"),
191
+ ):
192
+ """Bulk export Auxiliary Code(s)."""
193
+ api = get_api(debug=debug)
194
+ cc_base_url = get_cc_base_url()
195
+ orgid = get_cc_org_id(api.session)
196
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/bulk-export"
197
+ params = {}
198
+ if page is not None:
199
+ params["page"] = page
200
+ if page_size is not None:
201
+ params["pageSize"] = page_size
202
+ if limit > 0:
203
+ params["max"] = limit
204
+ if offset > 0:
205
+ params["start"] = offset
206
+ result = None
207
+ try:
208
+ result = api.session.rest_get(url, params=params)
209
+ except WebexError as e:
210
+ handle_rest_error(e)
211
+ result = result or []
212
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
213
+ if output == "json":
214
+ print_json(items)
215
+ else:
216
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
217
+
218
+
219
+
220
+ @app.command("create-purge-inactive-entities")
221
+ def create_purge_inactive_entities(
222
+ next_start_id: str = typer.Option(None, "--next-start-id", help="This is the entity ID from which items for the next purge ba"),
223
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
224
+ output: str = typer.Option("id", "--output", "-o", help="Output format: id|json"),
225
+ debug: bool = typer.Option(False, "--debug"),
226
+ ):
227
+ """Purge inactive Auxiliary Code(s)."""
228
+ api = get_api(debug=debug)
229
+ cc_base_url = get_cc_base_url()
230
+ orgid = get_cc_org_id(api.session)
231
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/purge-inactive-entities"
232
+ params = {}
233
+ if next_start_id is not None:
234
+ params["nextStartId"] = next_start_id
235
+ if json_body:
236
+ body = json.loads(json_body)
237
+ else:
238
+ body = {}
239
+ try:
240
+ result = api.session.rest_post(url, json=body, params=params)
241
+ except WebexError as e:
242
+ handle_rest_error(e)
243
+ if output == "json":
244
+ print_json(result)
245
+ elif isinstance(result, dict) and "id" in result:
246
+ typer.echo(f"Created: {result['id']}")
247
+ elif not result or result == {}:
248
+ typer.echo("Created.")
249
+ else:
250
+ print_json(result)
251
+
252
+
253
+
254
+ @app.command("show")
255
+ def show(
256
+ id: str = typer.Argument(help="id"),
257
+ output: str = typer.Option("json", "--output", "-o", help="Output format: table|json"),
258
+ debug: bool = typer.Option(False, "--debug"),
259
+ ):
260
+ """Get specific Auxiliary Code by ID."""
261
+ api = get_api(debug=debug)
262
+ cc_base_url = get_cc_base_url()
263
+ orgid = get_cc_org_id(api.session)
264
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/{id}"
265
+ try:
266
+ result = api.session.rest_get(url)
267
+ except WebexError as e:
268
+ handle_rest_error(e)
269
+ if output == "json":
270
+ print_json(result)
271
+ else:
272
+ if isinstance(result, dict):
273
+ print_table([result], columns=[("Key", ""), ("Value", "")], limit=0)
274
+ elif isinstance(result, list):
275
+ print_table(result, columns=[("ID", "id"), ("Name", "name")], limit=0)
276
+ else:
277
+ print_json(result)
278
+
279
+
280
+
281
+ @app.command("update-auxiliary-code")
282
+ def update_auxiliary_code(
283
+ id: str = typer.Argument(help="id"),
284
+ organization_id: str = typer.Option(None, "--organization-id", help="ID of the contact center organization. It is required to def"),
285
+ id_param: str = typer.Option(None, "--id", help="ID of this contact center resource. It should not be specifi"),
286
+ version: str = typer.Option(None, "--version", help="The version of this resource. For a newly created resource,"),
287
+ name: str = typer.Option(None, "--name", help="A name for the code."),
288
+ description: str = typer.Option(None, "--description", help="A short description indicating the context of the code."),
289
+ default_code: bool = typer.Option(None, "--default-code/--no-default-code", help="Indicates whether this is the default code(true) or not(fals"),
290
+ active: bool = typer.Option(None, "--active/--no-active", help="Indicates whether the code is active(when true) or not activ"),
291
+ is_system_code: bool = typer.Option(None, "--is-system-code/--no-is-system-code", help="Indicates whether this is the system default code(true) or n"),
292
+ work_type_id: str = typer.Option(None, "--work-type-id", help="Indicates the work type id associated with this code."),
293
+ work_type_code: str = typer.Option(None, "--work-type-code", help="Choices: IDLE_CODE, WRAP_UP_CODE"),
294
+ burnout_inclusion: str = typer.Option(None, "--burnout-inclusion", help="Choices: NOT_APPLICABLE, EXCLUDED, INCLUDED"),
295
+ system_default: bool = typer.Option(None, "--system-default/--no-system-default", help="Indicates whether the created resource is system created or"),
296
+ created_time: str = typer.Option(None, "--created-time", help="Creation time(in epoch millis) of this resource."),
297
+ last_updated_time: str = typer.Option(None, "--last-updated-time", help="Time(in epoch millis) when this resource was last updated."),
298
+ json_body: str = typer.Option(None, "--json-body", help="Full JSON body (overrides other options)"),
299
+ debug: bool = typer.Option(False, "--debug"),
300
+ ):
301
+ """Update specific Auxiliary Code by ID."""
302
+ api = get_api(debug=debug)
303
+ cc_base_url = get_cc_base_url()
304
+ orgid = get_cc_org_id(api.session)
305
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/{id}"
306
+ if json_body:
307
+ body = json.loads(json_body)
308
+ else:
309
+ body = {}
310
+ if organization_id is not None:
311
+ body["organizationId"] = organization_id
312
+ if id_param is not None:
313
+ body["id"] = id_param
314
+ if version is not None:
315
+ body["version"] = version
316
+ if name is not None:
317
+ body["name"] = name
318
+ if description is not None:
319
+ body["description"] = description
320
+ if default_code is not None:
321
+ body["defaultCode"] = default_code
322
+ if active is not None:
323
+ body["active"] = active
324
+ if is_system_code is not None:
325
+ body["isSystemCode"] = is_system_code
326
+ if work_type_id is not None:
327
+ body["workTypeId"] = work_type_id
328
+ if work_type_code is not None:
329
+ body["workTypeCode"] = work_type_code
330
+ if burnout_inclusion is not None:
331
+ body["burnoutInclusion"] = burnout_inclusion
332
+ if system_default is not None:
333
+ body["systemDefault"] = system_default
334
+ if created_time is not None:
335
+ body["createdTime"] = created_time
336
+ if last_updated_time is not None:
337
+ body["lastUpdatedTime"] = last_updated_time
338
+ try:
339
+ result = api.session.rest_put(url, json=body)
340
+ except WebexError as e:
341
+ handle_rest_error(e)
342
+ typer.echo(f"Updated.")
343
+
344
+
345
+
346
+ @app.command("delete")
347
+ def delete(
348
+ id: str = typer.Argument(help="id"),
349
+ force: bool = typer.Option(False, "--force", help="Skip confirmation"),
350
+ debug: bool = typer.Option(False, "--debug"),
351
+ ):
352
+ """Delete specific Auxiliary Code by ID."""
353
+ if not force:
354
+ typer.confirm(f"Delete {id}?", abort=True)
355
+ api = get_api(debug=debug)
356
+ cc_base_url = get_cc_base_url()
357
+ orgid = get_cc_org_id(api.session)
358
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/{id}"
359
+ try:
360
+ api.session.rest_delete(url)
361
+ except WebexError as e:
362
+ handle_rest_error(e)
363
+ typer.echo(f"Deleted: {id}")
364
+
365
+
366
+
367
+ @app.command("list-incoming-references")
368
+ def list_incoming_references(
369
+ id: str = typer.Argument(help="id"),
370
+ type_param: str = typer.Option(None, "--type", help="Entity type of the other entity that has a reference to this"),
371
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
372
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
373
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
374
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
375
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
376
+ debug: bool = typer.Option(False, "--debug"),
377
+ ):
378
+ """List references for a specific Auxiliary Code."""
379
+ api = get_api(debug=debug)
380
+ cc_base_url = get_cc_base_url()
381
+ orgid = get_cc_org_id(api.session)
382
+ url = f"{cc_base_url}/organization/{orgid}/auxiliary-code/{id}/incoming-references"
383
+ params = {}
384
+ if type_param is not None:
385
+ params["type"] = type_param
386
+ if page is not None:
387
+ params["page"] = page
388
+ if page_size is not None:
389
+ params["pageSize"] = page_size
390
+ if limit > 0:
391
+ params["max"] = limit
392
+ if offset > 0:
393
+ params["start"] = offset
394
+ result = None
395
+ try:
396
+ result = api.session.rest_get(url, params=params)
397
+ except WebexError as e:
398
+ handle_rest_error(e)
399
+ result = result or []
400
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
401
+ if output == "json":
402
+ print_json(items)
403
+ else:
404
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
405
+
406
+
407
+
408
+ @app.command("list-auxiliary-code")
409
+ def list_auxiliary_code(
410
+ filter_param: str = typer.Option(None, "--filter", help="Specify a filter based on which the results will be fetched."),
411
+ attributes: str = typer.Option(None, "--attributes", help="Specify the attributes to be returned.Default all attributes"),
412
+ search: str = typer.Option(None, "--search", help="Filter data based on the search keyword.Supported search col"),
413
+ page: str = typer.Option(None, "--page", help="Defines the number of displayed page. The page number starts"),
414
+ page_size: str = typer.Option(None, "--page-size", help="Defines the number of items to be displayed on a page. If th"),
415
+ desktop_profile_filter: str = typer.Option(None, "--desktop-profile-filter", help="If set to true, the API will return only the data that the u"),
416
+ supervised_user_id: str = typer.Option(None, "--supervised-user-id", help="User Id of the Agent whose Agent Profile associated Idle Cod"),
417
+ output: str = typer.Option("table", "--output", "-o", help="Output format: table|json"),
418
+ limit: int = typer.Option(0, "--limit", help="Max results (0=all for paginated endpoints, API default for non-paginated)"),
419
+ offset: int = typer.Option(0, "--offset", help="Start offset"),
420
+ debug: bool = typer.Option(False, "--debug"),
421
+ ):
422
+ """List Auxiliary Code(s)."""
423
+ api = get_api(debug=debug)
424
+ cc_base_url = get_cc_base_url()
425
+ orgid = get_cc_org_id(api.session)
426
+ url = f"{cc_base_url}/organization/{orgid}/v2/auxiliary-code"
427
+ params = {}
428
+ if filter_param is not None:
429
+ params["filter"] = filter_param
430
+ if attributes is not None:
431
+ params["attributes"] = attributes
432
+ if search is not None:
433
+ params["search"] = search
434
+ if page is not None:
435
+ params["page"] = page
436
+ if page_size is not None:
437
+ params["pageSize"] = page_size
438
+ if desktop_profile_filter is not None:
439
+ params["desktopProfileFilter"] = desktop_profile_filter
440
+ if supervised_user_id is not None:
441
+ params["supervisedUserId"] = supervised_user_id
442
+ if limit > 0:
443
+ params["max"] = limit
444
+ if offset > 0:
445
+ params["start"] = offset
446
+ result = None
447
+ try:
448
+ result = api.session.rest_get(url, params=params)
449
+ except WebexError as e:
450
+ handle_rest_error(e)
451
+ result = result or []
452
+ items = result.get("items", result.get("data", result if isinstance(result, list) else [])) if isinstance(result, dict) else (result if isinstance(result, list) else [])
453
+ if output == "json":
454
+ print_json(items)
455
+ else:
456
+ print_table(items, columns=[("ID", "id"), ("Name", "name")], limit=limit)
457
+
458
+