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,467 @@
1
+ # Device Platform Management (RoomOS Configurations, Personalization, xAPI)
2
+
3
+ ## Sources
4
+
5
+ - wxc_sdk v1.30.0
6
+ - OpenAPI spec: specs/webex-device.json
7
+ - developer.webex.com Device Platform APIs
8
+
9
+ This document covers three Webex APIs that manage **device software** on cloud-registered RoomOS devices: configuration key management, workspace personalization, and xAPI command execution / status queries.
10
+
11
+ These APIs operate on the software layer of a device that is already provisioned and cloud-registered. They do not create, delete, or activate devices — that is a separate concern.
12
+
13
+ > **For phone provisioning, activation codes, MAC registration, DECT networks, and telephony device settings** see [devices-core.md](devices-core.md).
14
+ >
15
+ > **For workspace creation and workspace call settings** see [devices-workspaces.md](devices-workspaces.md).
16
+ >
17
+ > **For DECT base stations and handsets** see [devices-dect.md](devices-dect.md).
18
+
19
+ ---
20
+
21
+ ## Prerequisites
22
+
23
+ Before using any of the three APIs documented here, you need:
24
+
25
+ 1. **A working auth token.** Verify with `wxcli whoami`. Token type (admin, user, service app) affects which scopes are available — see the Scopes section below.
26
+
27
+ 2. **At least one cloud-registered RoomOS device** (for device-configurations and xAPI). This means a Cisco Room, Board, or Desk series device registered to Webex cloud. MPP phones do not support device-configurations key management or xAPI.
28
+
29
+ 3. **At least one workspace with a device** (for workspace-personalization). The workspace must already exist and have a device assigned to it.
30
+
31
+ 4. **A device ID.** All three APIs require a device ID. To find one:
32
+
33
+ ```bash
34
+ wxcli devices list --output json
35
+ ```
36
+
37
+ This returns all devices in the org. Filter for the device you need and capture its `id` field. See [devices-core.md](devices-core.md) for details on device listing and filtering.
38
+
39
+ ---
40
+
41
+ ## Scopes
42
+
43
+ | API | Read Scope | Write Scope |
44
+ |-----|-----------|-------------|
45
+ | Device Configurations | `spark-admin:devices_read` | `spark-admin:devices_write` |
46
+ | Workspace Personalization | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
47
+ | xAPI Status | `spark:xapi_statuses` | — |
48
+ | xAPI Commands | — | `spark:xapi_commands` |
49
+
50
+ **Key distinction:** Device Configurations and Workspace Personalization use admin-level scopes (`spark-admin:`). xAPI uses user-level scopes (`spark:`). A token may have one set but not the other.
51
+
52
+ For full xAPI access (both status queries and command execution), ensure your token has both `spark:xapi_statuses` and `spark:xapi_commands`. The official Webex API documentation specifically requires these scopes and does not mention `spark-admin:devices_read/write` as a substitute.
53
+
54
+ ---
55
+
56
+ ## 1. Device Configurations
57
+
58
+ ### What It Does
59
+
60
+ The Device Configurations API reads and writes RoomOS configuration keys on a specific device. Configuration keys follow a hierarchical dot-notation namespace — `Audio.Ultrasound.MaxVolume`, `Conference.MaxReceiveCallRate`, `Video.Input.Connector[1].Name`, and so on. Each key has a current value, a source (default vs. configured), and editability rules.
61
+
62
+ Changes are applied via JSON Patch operations (`replace` to set a value, `remove` to revert to the schema default). The API supports filtering by key name, wildcard patterns, and index ranges.
63
+
64
+ This API targets RoomOS devices only (Room, Board, Desk series). MPP phones do not expose configuration keys through this interface.
65
+
66
+ ### CLI Commands
67
+
68
+ **List / read configurations:**
69
+
70
+ ```bash
71
+ wxcli device-configurations show --device-id DEVICE_ID
72
+ ```
73
+
74
+ With key filtering:
75
+
76
+ ```bash
77
+ wxcli device-configurations show --device-id DEVICE_ID --key "Audio.Ultrasound.*"
78
+ ```
79
+
80
+ | Flag | Required | Description |
81
+ |------|----------|-------------|
82
+ | `--device-id` | Yes | The device to read configurations from |
83
+ | `--key` | No | Filter expression — absolute key, wildcard, or range (see Key Filtering below) |
84
+ | `--output` / `-o` | No | Output format: `table` or `json` (default: `json`) |
85
+ | `--debug` | No | Print debug info |
86
+
87
+ **Update configurations:**
88
+
89
+ ```bash
90
+ wxcli device-configurations update --device-id DEVICE_ID \
91
+ --json-body '[{"op": "replace", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value", "value": 70}]'
92
+ ```
93
+
94
+ | Flag | Required | Description |
95
+ |------|----------|-------------|
96
+ | `--device-id` | Yes | The device to update configurations on |
97
+ | `--json-body` | Yes (effectively) | Full JSON Patch array — see note below |
98
+ | `--op` | No | **Non-functional** — see warning below |
99
+ | `--path` | No | **Non-functional** — see warning below |
100
+ | `--debug` | No | Print debug info |
101
+
102
+ > **WARNING:** The `--op` and `--path` flags exist on the `update` command but do NOT produce a valid JSON Patch array. They build a flat object `{"op": "...", "path": "..."}` instead of the required array `[{"op": "...", "path": "..."}]`, and provide no way to set a `value` field. **Always use `--json-body` for update operations.**
103
+
104
+ ### Key Filtering
105
+
106
+ The `--key` flag on the `show` command accepts several filter formats:
107
+
108
+ | Format | Example | Behavior |
109
+ |--------|---------|----------|
110
+ | Absolute key | `"Conference.MaxReceiveCallRate"` | Returns one specific configuration |
111
+ | Wildcard | `"Audio.Ultrasound.*"` | Returns all keys matching the pattern |
112
+ | Range | `"FacilityService.Service[1..3].Name"` | Returns keys for indices 1 through 3 |
113
+
114
+ Square brackets in filter expressions must be URL-encoded (`%5B` / `%5D`) when using raw HTTP. The CLI handles this encoding automatically.
115
+
116
+ ### Configuration Update Pattern
117
+
118
+ Updates use JSON Patch operations. The body is a JSON array of patch operations:
119
+
120
+ **Set a value (replace):**
121
+
122
+ ```bash
123
+ wxcli device-configurations update --device-id DEVICE_ID \
124
+ --json-body '[{"op": "replace", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value", "value": 70}]'
125
+ ```
126
+
127
+ **Revert to default (remove):**
128
+
129
+ ```bash
130
+ wxcli device-configurations update --device-id DEVICE_ID \
131
+ --json-body '[{"op": "remove", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value"}]'
132
+ ```
133
+
134
+ **Multiple operations in one request:**
135
+
136
+ ```bash
137
+ wxcli device-configurations update --device-id DEVICE_ID \
138
+ --json-body '[
139
+ {"op": "replace", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value", "value": 70},
140
+ {"op": "replace", "path": "Conference.MaxReceiveCallRate/sources/configured/value", "value": 6000}
141
+ ]'
142
+ ```
143
+
144
+ The `op` field accepts two values:
145
+ - `replace` — set the key to a specific value
146
+ - `remove` — clear the configured value and revert to the schema default
147
+
148
+ The `path` field must end in `/sources/configured/value`. The portion before that suffix is the configuration key name using dot-notation (e.g., `Audio.Ultrasound.MaxVolume`).
149
+
150
+ ### Raw HTTP
151
+
152
+ **Read configurations:**
153
+
154
+ ```
155
+ GET https://webexapis.com/v1/deviceConfigurations?deviceId={deviceId}
156
+ GET https://webexapis.com/v1/deviceConfigurations?deviceId={deviceId}&key=Audio.*
157
+ ```
158
+
159
+ **Update configurations:**
160
+
161
+ ```
162
+ PATCH https://webexapis.com/v1/deviceConfigurations?deviceId={deviceId}
163
+ Content-Type: application/json-patch+json
164
+
165
+ [
166
+ {
167
+ "op": "replace",
168
+ "path": "Audio.Ultrasound.MaxVolume/sources/configured/value",
169
+ "value": 70
170
+ }
171
+ ]
172
+ ```
173
+
174
+ Note the content type: `application/json-patch+json`, not `application/json`. The CLI handles this automatically. Raw HTTP callers must set the header correctly or the request will fail.
175
+
176
+ ---
177
+
178
+ ## 2. Workspace Personalization
179
+
180
+ ### What It Does
181
+
182
+ Workspace Personalization temporarily personalizes a shared workspace device for a specific user. When personalized, the user's speed dials, favorites, and call history appear on the workspace device. This is useful for hot-desk-like scenarios on RoomOS collaboration devices (Room, Board, Desk series).
183
+
184
+ Personalization is an **asynchronous operation**. The `create` command initiates personalization and returns immediately. You must poll the task endpoint with `show` to determine when personalization is complete.
185
+
186
+ ### CLI Commands
187
+
188
+ **Personalize a workspace for a user:**
189
+
190
+ ```bash
191
+ wxcli workspace-personalization create WORKSPACE_ID --email user@example.com
192
+ ```
193
+
194
+ | Flag / Argument | Required | Description |
195
+ |-----------------|----------|-------------|
196
+ | `WORKSPACE_ID` (positional) | Yes | The workspace to personalize |
197
+ | `--email` | Yes | Email address of the user whose preferences to apply |
198
+ | `--json-body` | No | Full JSON body (overrides `--email`) |
199
+ | `--debug` | No | Print debug info |
200
+
201
+ **Check personalization task status:**
202
+
203
+ ```bash
204
+ wxcli workspace-personalization show WORKSPACE_ID
205
+ ```
206
+
207
+ | Flag / Argument | Required | Description |
208
+ |-----------------|----------|-------------|
209
+ | `WORKSPACE_ID` (positional) | Yes | The workspace to check |
210
+ | `--output` / `-o` | No | Output format: `table` or `json` (default: `json`) |
211
+ | `--debug` | No | Print debug info |
212
+
213
+ ### Workflow
214
+
215
+ 1. **Get a workspace ID** (if you don't have one):
216
+ ```bash
217
+ wxcli workspaces list --output json
218
+ ```
219
+ If the workspace doesn't exist yet, create it first — see [devices-workspaces.md](devices-workspaces.md).
220
+
221
+ 2. **Personalize the workspace:**
222
+ ```bash
223
+ wxcli workspace-personalization create WORKSPACE_ID --email user@example.com
224
+ ```
225
+
226
+ 3. **Poll for completion** (personalization takes approximately 30 seconds):
227
+ ```bash
228
+ wxcli workspace-personalization show WORKSPACE_ID
229
+ ```
230
+ - Success: `{ "success": true }`
231
+ - Failure: `{ "success": false, "errorDescription": "..." }`
232
+
233
+ 4. **Common failure:** `"Device is offline"` — the workspace device must be powered on, online, and registered to Webex cloud.
234
+
235
+ ### Relationship to Hot Desking
236
+
237
+ Hot desking and workspace personalization both let a user temporarily use a shared device. They are **not the same mechanism**:
238
+
239
+ | Feature | Hot Desking | Workspace Personalization |
240
+ |---------|------------|--------------------------|
241
+ | Device type | MPP phones | RoomOS devices (Room, Board, Desk) |
242
+ | Mechanism | Voice portal login or app-based | API-driven user binding |
243
+ | Managed by | `manage-devices` skill / telephony settings | `device-platform` skill / personalization API |
244
+ | Scope | Calling features only | User preferences (speed dials, favorites, call history) |
245
+
246
+ ### Raw HTTP
247
+
248
+ **Personalize a workspace:**
249
+
250
+ ```
251
+ POST https://webexapis.com/v1/workspaces/{workspaceId}/personalize
252
+ Content-Type: application/json
253
+
254
+ {
255
+ "email": "user@example.com"
256
+ }
257
+ ```
258
+
259
+ **Check personalization task status:**
260
+
261
+ ```
262
+ GET https://webexapis.com/v1/workspaces/{workspaceId}/personalizationTask
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 3. xAPI (Device Command Execution & Status Queries)
268
+
269
+ ### What It Does
270
+
271
+ The xAPI interface lets you execute commands on RoomOS devices and query their real-time status. This is the same xAPI available on the device's local interface, but accessed through the Webex cloud — enabling remote programmatic control of devices anywhere in the org.
272
+
273
+ Use cases include:
274
+ - Room booking and digital signage integrations
275
+ - Remote volume, standby, and display control
276
+ - Real-time room analytics (people count, call state)
277
+ - Custom automations triggered by events or schedules
278
+
279
+ xAPI works **only with RoomOS devices** (Room, Board, Desk series). MPP phones do not support xAPI. The device must be online and cloud-registered for commands to reach it.
280
+
281
+ ### CLI Commands
282
+
283
+ **Query device status:**
284
+
285
+ ```bash
286
+ wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume"
287
+ ```
288
+
289
+ | Flag | Required | Description |
290
+ |------|----------|-------------|
291
+ | `--device-id` | Yes | The RoomOS device to query |
292
+ | `--name` | Yes | Status expression(s) — comma-separated, max 10 per request |
293
+ | `--output` / `-o` | No | Output format: `table` or `json` (default: `json`) |
294
+ | `--debug` | No | Print debug info |
295
+
296
+ **Execute a command (no arguments):**
297
+
298
+ ```bash
299
+ wxcli xapi create Standby.Activate --device-id DEVICE_ID
300
+ ```
301
+
302
+ When no `--json-body` is provided, the CLI automatically populates `deviceId` in the request body from the `--device-id` flag. This works for commands that take no arguments.
303
+
304
+ **Execute a command (with arguments):**
305
+
306
+ ```bash
307
+ wxcli xapi create Audio.Volume.Set --device-id DEVICE_ID \
308
+ --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Level": 50}}'
309
+ ```
310
+
311
+ | Flag / Argument | Required | Description |
312
+ |-----------------|----------|-------------|
313
+ | `COMMAND_NAME` (positional) | Yes | xAPI command name in dot-notation (e.g., `Audio.Volume.Set`) |
314
+ | `--device-id` | Yes | The RoomOS device to send the command to |
315
+ | `--json-body` | No | Full JSON body with arguments — see note below |
316
+ | `--debug` | No | Print debug info |
317
+
318
+ > **IMPORTANT:** When using `--json-body`, the CLI does NOT auto-inject `--device-id` into the body. You must include `"deviceId"` in the JSON body yourself. Without `--json-body`, the CLI auto-populates `deviceId` from `--device-id` (works for no-argument commands like `Standby.Activate`).
319
+
320
+ ### Status Queries
321
+
322
+ The `show` command queries real-time status values from a device. The `--name` flag accepts dot-notation status path expressions.
323
+
324
+ **Single status query:**
325
+
326
+ ```bash
327
+ wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume"
328
+ ```
329
+
330
+ **Multiple status queries (comma-separated, max 10):**
331
+
332
+ ```bash
333
+ wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume,SystemUnit.State.NumberOfActiveCalls"
334
+ ```
335
+
336
+ #### Common Status Queries
337
+
338
+ | Status Path | Returns |
339
+ |-------------|---------|
340
+ | `Audio.Volume` | Current volume level |
341
+ | `SystemUnit.State.NumberOfActiveCalls` | Active call count |
342
+ | `Network[1].IPv4.Address` | Device IP address |
343
+ | `RoomAnalytics.PeopleCount.Current` | Number of people detected in the room |
344
+ | `Peripherals.ConnectedDevice[*].Name` | Connected peripheral device names |
345
+ | `Standby.State` | Whether device is in standby or active |
346
+ | `SystemUnit.Software.DisplayName` | Current firmware version |
347
+ | `SystemUnit.ProductId` | Device model identifier |
348
+
349
+ ### Command Execution
350
+
351
+ Commands are sent via the `create` subcommand. The positional argument is the xAPI command name in dot-notation. Arguments to the command are passed via `--json-body`.
352
+
353
+ **No-argument command (deviceId auto-populated):**
354
+
355
+ ```bash
356
+ wxcli xapi create Standby.Activate --device-id DEVICE_ID
357
+ ```
358
+
359
+ **Command with arguments (deviceId must be in body):**
360
+
361
+ ```bash
362
+ wxcli xapi create Audio.Volume.Set --device-id DEVICE_ID \
363
+ --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Level": 50}}'
364
+ ```
365
+
366
+ ```bash
367
+ wxcli xapi create Call.Dial --device-id DEVICE_ID \
368
+ --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Number": "user@example.com"}}'
369
+ ```
370
+
371
+ ```bash
372
+ wxcli xapi create UserInterface.Message.Alert.Display --device-id DEVICE_ID \
373
+ --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Title": "Notice", "Text": "Meeting starts in 5 minutes", "Duration": 30}}'
374
+ ```
375
+
376
+ #### Common xAPI Commands
377
+
378
+ | Command | Arguments | Use Case |
379
+ |---------|-----------|----------|
380
+ | `Audio.Volume.Set` | `Level` (0-100) | Set volume |
381
+ | `Audio.Volume.Mute` | — | Mute microphone |
382
+ | `Audio.Volume.Unmute` | — | Unmute microphone |
383
+ | `Call.Dial` | `Number` | Initiate a call |
384
+ | `Call.Disconnect` | `CallId` | End a call |
385
+ | `Standby.Activate` | — | Put device in standby |
386
+ | `Standby.Deactivate` | — | Wake device from standby |
387
+ | `Bookings.List` | `Days`, `Offset` | Get calendar bookings |
388
+ | `Message.Send` | `Text` | Display on-screen message |
389
+ | `UserInterface.Message.Alert.Display` | `Title`, `Text`, `Duration` | Show alert popup on screen |
390
+
391
+ This table is representative, not exhaustive. The full xAPI command namespace is documented by Cisco at [roomos.cisco.com/xapi](https://roomos.cisco.com/xapi).
392
+
393
+ ### xAPI Command Reference
394
+
395
+ The cloud xAPI interface exposed by the Webex API mirrors the local xAPI available on RoomOS devices. Any command or status path documented in Cisco's RoomOS xAPI reference can be used through the CLI.
396
+
397
+ - **Full xAPI namespace:** [roomos.cisco.com/xapi](https://roomos.cisco.com/xapi)
398
+ - **Device Developers Guide:** [developer.webex.com](https://developer.webex.com) (xAPI section)
399
+
400
+ ### Raw HTTP
401
+
402
+ **Query status:**
403
+
404
+ ```
405
+ GET https://webexapis.com/v1/xapi/status?deviceId={deviceId}&name=Audio.Volume
406
+ ```
407
+
408
+ **Execute a command:**
409
+
410
+ ```
411
+ POST https://webexapis.com/v1/xapi/command/Audio.Volume.Set
412
+ Content-Type: application/json
413
+
414
+ {
415
+ "deviceId": "DEVICE_ID",
416
+ "arguments": {
417
+ "Level": 50
418
+ }
419
+ }
420
+ ```
421
+
422
+ **Execute a no-argument command:**
423
+
424
+ ```
425
+ POST https://webexapis.com/v1/xapi/command/Standby.Activate
426
+ Content-Type: application/json
427
+
428
+ {
429
+ "deviceId": "DEVICE_ID"
430
+ }
431
+ ```
432
+
433
+ ---
434
+
435
+ ## Gotchas
436
+
437
+ 1. **xAPI only works with RoomOS devices.** Room, Board, and Desk series devices support xAPI. MPP phones do not. If you need to manage MPP phone settings, use the telephony device settings API — see [devices-core.md](devices-core.md).
438
+
439
+ 2. **Device must be online and cloud-registered.** xAPI commands and device configuration reads/writes require the device to be reachable through Webex cloud. Offline devices will return errors or fail silently.
440
+
441
+ 3. **Device Configurations PATCH requires `application/json-patch+json`.** The content type for configuration updates is `application/json-patch+json`, not `application/json`. The CLI sets this automatically. Raw HTTP callers must set the `Content-Type` header correctly or the request will be rejected.
442
+
443
+ 4. **xAPI `--name` accepts comma-separated expressions, max 10 per request.** If you need more than 10 status values, make multiple requests.
444
+
445
+ 5. **Workspace personalization is asynchronous.** The `create` command returns immediately. Always poll with `show` until the task reports `success: true` or `success: false`. Do not assume instant completion — typical completion time is approximately 30 seconds.
446
+
447
+ 6. **xAPI scopes are user-level, not admin-level.** xAPI status queries need `spark:xapi_statuses` and command execution needs `spark:xapi_commands`. These are `spark:` scopes (user-level), not `spark-admin:` scopes. The official Webex API documentation does not indicate that `spark-admin:devices_read/write` can substitute for these scopes. Ensure your token explicitly includes the `spark:xapi_*` scopes for xAPI operations.
448
+
449
+ 7. **Configuration key paths use different separators in different contexts.** The key filter (for reading) uses dot-notation: `Audio.Ultrasound.MaxVolume`. The update path field uses dots for the key portion but forward slashes for the path suffix: `Audio.Ultrasound.MaxVolume/sources/configured/value`. Do not mix them up.
450
+
451
+ 8. **The `device-configurations update` command's `--op` and `--path` flags are non-functional.** They produce a flat JSON object instead of the required JSON Patch array, and provide no way to set a value. Always use `--json-body` for configuration updates.
452
+
453
+ 9. **xAPI `create` with `--json-body` does not auto-inject deviceId.** When you pass `--json-body`, the CLI uses the JSON body as-is without injecting the `--device-id` value. You must include `"deviceId"` in your JSON body manually. Without `--json-body`, the CLI correctly populates `deviceId` from `--device-id`.
454
+
455
+ 10. **Device configuration schema is device-reported and firmware-dependent.** The set of available config keys is not static — each device reports its own schema when it registers with Webex cloud. Newer PhoneOS/RoomOS firmware versions may expose keys that older versions do not. Offline or `offline_expired` devices retain a stale schema. A key visible in Control Hub's UI may not appear in the Device Configurations API if the device's firmware hasn't been updated to a version that includes it in the reported schema.
456
+
457
+ 11. **Per-line ringtone (`Lines.Line[N].CallFeatureSettings.Ringtone`) is available on PhoneOS 4.1+.** On PhoneOS 3.5.1 and 3.6.1 the key does not appear in the Device Configurations API schema — only `Lines.Line[N].CallFeatureSettings.MissedCallNotification` is present on those versions. On PhoneOS 4.1.1 (build 20260318), the `Ringtone` key is present and writable for all 16 line positions. Value space is `"No Ring"` or `"1"` through `"13"`. Set per-line ringtones with a single multi-operation PATCH: `[{"op": "replace", "path": "Lines.Line[1].CallFeatureSettings.Ringtone/sources/configured/value", "value": "2"}, ...]`. Revert a line to default with `"op": "remove"`.
458
+ 12. **Static device settings API and dynamic settings API are separate surfaces.** Static (`/telephony/config/devices/{id}/settings`) uses JSON objects under `customizations.mpp`. Dynamic (`/telephony/config/devices/{id}/dynamicSettings`) uses tag-based addressing (`%ENABLE_BLUETOOTH%`). Do not mix them — use static API for standard MPP/PhoneOS settings.
459
+
460
+ ---
461
+
462
+ ## See Also
463
+
464
+ - [devices-core.md](devices-core.md) — Device CRUD, activation codes, MAC provisioning, telephony device settings
465
+ - [devices-dect.md](devices-dect.md) — DECT networks, base stations, handsets
466
+ - [devices-workspaces.md](devices-workspaces.md) — Workspace creation, workspace call settings, workspace locations
467
+ - [authentication.md](authentication.md) — Token types, scopes, OAuth flows