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,1150 @@
1
+ <!-- Updated by playbook session 2026-03-18 -->
2
+
3
+ # DECT Devices & Hot Desking Reference
4
+
5
+ ## Sources
6
+
7
+ - wxc_sdk v1.30.0
8
+ - OpenAPI spec: specs/webex-device.json
9
+ - developer.webex.com DECT Device APIs
10
+
11
+ DECT network management (networks, base stations, handsets, line assignment) and hot desk session management via the `wxc_sdk` Python SDK.
12
+
13
+ **Not supported for Webex for Government (FedRAMP).** See [authentication.md → FedRAMP](authentication.md#webex-for-government-fedramp) for all FedRAMP restrictions.
14
+
15
+ ---
16
+
17
+ ## Table of Contents
18
+
19
+ 1. [Required Scopes](#required-scopes)
20
+ 2. [API Access Path](#api-access-path)
21
+ 3. [DECT Network Management](#dect-network-management)
22
+ 4. [Base Station Management](#base-station-management)
23
+ 5. [Handset Management](#handset-management)
24
+ 6. [Association Queries](#association-queries)
25
+ 7. [Available Members Search](#available-members-search)
26
+ 8. [Serviceability Password](#serviceability-password)
27
+ 9. [Hot Desking](#hot-desking)
28
+ 10. [Data Models](#data-models)
29
+ 11. [Raw HTTP](#raw-http)
30
+ 12. [Common Gotchas](#common-gotchas)
31
+
32
+ ---
33
+
34
+ ## Required Scopes
35
+
36
+ | Operation | Scope(s) Required |
37
+ |-----------|-------------------|
38
+ | List/view DECT networks, base stations, handsets | `spark-admin:telephony_config_read` |
39
+ | Create/update/delete DECT networks, base stations, handsets | `spark-admin:telephony_config_write` |
40
+ | Generate serviceability password | `spark-admin:telephony_config_write` **or** `spark-admin:devices_write` |
41
+ | Get serviceability password status | `spark-admin:telephony_config_read` **or** `spark-admin:devices_read` |
42
+ | Update serviceability password status | `spark-admin:telephony_config_write` **or** `spark-admin:devices_write` |
43
+ | List/delete hot desk sessions | Admin token required (scopes not explicitly documented in OpenAPI spec, but the endpoints work with a full admin token). The hot desk session endpoints are at `/v1/hotdesk/sessions`, separate from the DECT/telephony config scope. |
44
+
45
+ All DECT operations require a **full or read-only administrator auth token**.
46
+
47
+ ---
48
+
49
+ ## API Access Path
50
+
51
+ ```python
52
+ from wxc_sdk import WebexSimpleApi
53
+
54
+ api = WebexSimpleApi(tokens='<token>')
55
+
56
+ # DECT devices API
57
+ dect = api.telephony.dect_devices
58
+
59
+ # Hot desk API
60
+ hotdesk = api.telephony.hotdesk #
61
+ ```
62
+
63
+ ---
64
+
65
+ ## DECT Network Management
66
+
67
+ DECT networks provide roaming voice services via base stations and wireless handsets. A network can be provisioned with up to 1000 lines across up to 254 base stations.
68
+
69
+ ### Supported Device Models
70
+
71
+ | Enum Value | Display Name | Base Stations | Line Ports |
72
+ |------------|-------------|---------------|------------|
73
+ | `DECTNetworkModel.dms_cisco_dbs110` | DMS Cisco DBS110 | 1 | 30 |
74
+ | `DECTNetworkModel.cisco_dect_110_base` | Cisco DECT 110 Base | 1 | 30 |
75
+ | `DECTNetworkModel.dms_cisco_dbs210` | DMS Cisco DBS210 | 250 | 1000 |
76
+ | `DECTNetworkModel.cisco_dect_210_base` | Cisco DECT 210 Base | 250 | 1000 |
77
+
78
+ Only Cisco DECT device models are currently supported.
79
+
80
+ ### List Supported Device Types
81
+
82
+ ```python
83
+ def device_type_list(
84
+ self,
85
+ org_id: str = None
86
+ ) -> list[DectDevice]
87
+ ```
88
+
89
+ Returns a static list of DECT device types with base station and line port counts.
90
+
91
+ ### Create a DECT Network
92
+
93
+ ```python
94
+ def create_dect_network(
95
+ self,
96
+ location_id: str,
97
+ name: str,
98
+ model: DECTNetworkModel,
99
+ default_access_code_enabled: bool,
100
+ default_access_code: str,
101
+ display_name: str = None,
102
+ org_id: str = None
103
+ ) -> str # returns dect_network_id
104
+ ```
105
+
106
+ | Parameter | Notes |
107
+ |-----------|-------|
108
+ | `name` | Must be unique across the location. 1-40 characters. |
109
+ | `display_name` | Shown on handsets. 11 characters max. If omitted, defaults to indexed number + network name. |
110
+ | `default_access_code_enabled` | `True` = shared 4-digit access code for all users. `False` = auto-generated per-handset codes. |
111
+ | `default_access_code` | Required when `default_access_code_enabled` is `True`. Must be 4 numeric digits, unique within the location. |
112
+
113
+ **Note:** There is currently no public API to retrieve auto-generated access codes for handsets when `default_access_code_enabled` is `False`. Use Control Hub instead.
114
+
115
+ ### List DECT Networks
116
+
117
+ ```python
118
+ def list_dect_networks(
119
+ self,
120
+ name: str = None,
121
+ location_id: str = None,
122
+ org_id: str = None
123
+ ) -> list[DECTNetworkDetail]
124
+ ```
125
+
126
+ Lists all DECT networks in an organization. Both `name` and `location_id` are optional filters.
127
+
128
+ ### Get DECT Network Details
129
+
130
+ ```python
131
+ def dect_network_details(
132
+ self,
133
+ location_id: str,
134
+ dect_network_id: str,
135
+ org_id: str = None
136
+ ) -> DECTNetworkDetail
137
+ ```
138
+
139
+ ### Update a DECT Network
140
+
141
+ ```python
142
+ def update_dect_network(
143
+ self,
144
+ location_id: str,
145
+ dect_network_id: str,
146
+ name: str,
147
+ default_access_code_enabled: bool,
148
+ default_access_code: str = None,
149
+ display_name: str = None,
150
+ org_id: str = None
151
+ ) -> None
152
+ ```
153
+
154
+ `name` and `default_access_code_enabled` are required. `default_access_code` is mandatory when `default_access_code_enabled` is `True`.
155
+
156
+ ### Update DECT Network from Settings Object
157
+
158
+ ```python
159
+ def update_dect_network_settings(
160
+ self,
161
+ settings: DECTNetworkDetail,
162
+ org_id: str = None
163
+ ) -> None
164
+ ```
165
+
166
+ Convenience method. Uses `settings.location.id` and `settings.id` to address the network. Only `name`, `display_name`, `default_access_code_enabled`, and `default_access_code` fields are sent in the update.
167
+
168
+ ### Delete a DECT Network
169
+
170
+ ```python
171
+ def delete_dect_network(
172
+ self,
173
+ location_id: str,
174
+ dect_network_id: str,
175
+ org_id: str = None
176
+ ) -> None
177
+ ```
178
+
179
+ ### CLI Examples
180
+
181
+ ```bash
182
+ # List all DECT networks in the org
183
+ wxcli dect-devices list
184
+
185
+ # List DECT networks filtered by location
186
+ wxcli dect-devices list --location-id <location_id>
187
+
188
+ # List DECT networks filtered by name
189
+ wxcli dect-devices list --name "Building A"
190
+
191
+ # Show details of a specific DECT network
192
+ wxcli dect-devices show <location_id> <dect_network_id>
193
+
194
+ # Show details as JSON
195
+ wxcli dect-devices show <location_id> <dect_network_id> -o json
196
+
197
+ # Create a DECT network (DBS-210 multi-cell with shared access code)
198
+ wxcli dect-devices create <location_id> \
199
+ --name "Building A DECT" \
200
+ --model "DMS Cisco DBS210" \
201
+ --default-access-code-enabled \
202
+ --default-access-code "1234"
203
+
204
+ # Create a DECT network (DBS-110 single-cell with display name)
205
+ wxcli dect-devices create <location_id> \
206
+ --name "Lobby DECT" \
207
+ --model "DMS Cisco DBS110" \
208
+ --default-access-code-enabled \
209
+ --default-access-code "5678" \
210
+ --display-name "Lobby"
211
+
212
+ # Update a DECT network name and access code
213
+ wxcli dect-devices update <location_id> <dect_network_id> \
214
+ --name "Building A DECT v2" \
215
+ --default-access-code-enabled \
216
+ --default-access-code "9999"
217
+
218
+ # Disable shared access code (switches to per-handset auto-generated codes)
219
+ wxcli dect-devices update <location_id> <dect_network_id> \
220
+ --no-default-access-code-enabled
221
+
222
+ # Delete a DECT network (with confirmation prompt)
223
+ wxcli dect-devices delete <location_id> <dect_network_id>
224
+
225
+ # Delete a DECT network (skip confirmation)
226
+ wxcli dect-devices delete <location_id> <dect_network_id> --force
227
+ ```
228
+
229
+ ---
230
+
231
+ ## Base Station Management
232
+
233
+ Two types of base stations:
234
+ - **DBS-110 (Single-Cell):** 1 base station, up to 30 line registrations
235
+ - **DBS-210 (Multi-Cell):** Up to 254 base stations, up to 1000 line registrations
236
+
237
+ ### Create Multiple Base Stations
238
+
239
+ ```python
240
+ def create_base_stations(
241
+ self,
242
+ location_id: str,
243
+ dect_id: str,
244
+ base_station_macs: list[str],
245
+ org_id: str = None
246
+ ) -> list[BaseStationResponse]
247
+ ```
248
+
249
+ Pass a list of MAC addresses. Returns a list of `BaseStationResponse` objects, each containing the MAC and a result with HTTP status code and base station ID.
250
+
251
+ ### List Base Stations
252
+
253
+ ```python
254
+ def list_base_stations(
255
+ self,
256
+ location_id: str,
257
+ dect_network_id: str,
258
+ org_id: str = None
259
+ ) -> list[BaseStationsResponse]
260
+ ```
261
+
262
+ Returns base station IDs, MACs, and registered line counts.
263
+
264
+ ### Get Base Station Details
265
+
266
+ ```python
267
+ def base_station_details(
268
+ self,
269
+ location_id: str,
270
+ dect_network_id: str,
271
+ base_station_id: str,
272
+ org_id: str = None
273
+ ) -> BaseStationDetail
274
+ ```
275
+
276
+ Returns the base station with its registered handsets and their line member details.
277
+
278
+ ### Delete All Base Stations
279
+
280
+ ```python
281
+ def delete_bulk_base_stations(
282
+ self,
283
+ location_id: str,
284
+ dect_network_id: str,
285
+ org_id: str = None
286
+ ) -> None
287
+ ```
288
+
289
+ Deletes **all** base stations in the specified DECT network.
290
+
291
+ ### Delete a Specific Base Station
292
+
293
+ ```python
294
+ def delete_base_station(
295
+ self,
296
+ location_id: str,
297
+ dect_network_id: str,
298
+ base_station_id: str,
299
+ org_id: str = None
300
+ ) -> None
301
+ ```
302
+
303
+ ### CLI Examples
304
+
305
+ ```bash
306
+ # List base stations in a DECT network
307
+ wxcli dect-devices list-base-stations <location_id> <dect_network_id>
308
+
309
+ # List base stations as JSON
310
+ wxcli dect-devices list-base-stations <location_id> <dect_network_id> -o json
311
+
312
+ # Show details of a specific base station
313
+ wxcli dect-devices show-base-stations <location_id> <dect_network_id> <base_station_id>
314
+
315
+ # Create base stations (bulk by MAC, requires --json-body)
316
+ wxcli dect-devices create-base-stations <location_id> <dect_network_id> \
317
+ --json-body '{"baseStationMacs":["AABBCCDDEEFF","112233445566"]}'
318
+
319
+ # Delete a specific base station
320
+ wxcli dect-devices delete-base-stations-dect-networks-1 <location_id> <dect_network_id> <base_station_id>
321
+
322
+ # Delete a specific base station (skip confirmation)
323
+ wxcli dect-devices delete-base-stations-dect-networks-1 <location_id> <dect_network_id> <base_station_id> --force
324
+
325
+ # Delete ALL base stations in a DECT network
326
+ wxcli dect-devices delete-base-stations-dect-networks <location_id> <dect_network_id>
327
+
328
+ # Delete ALL base stations (skip confirmation)
329
+ wxcli dect-devices delete-base-stations-dect-networks <location_id> <dect_network_id> --force
330
+ ```
331
+
332
+ ---
333
+
334
+ ## Handset Management
335
+
336
+ Each handset supports up to **2 lines**. A DECT network supports a total of 120 lines across all handsets.
337
+
338
+ - **Line 1:** Member type can be PEOPLE or PLACE
339
+ - **Line 2:** Member type can be PEOPLE, PLACE, or VIRTUAL_LINE
340
+
341
+ ### Add a Single Handset
342
+
343
+ ```python
344
+ def add_a_handset(
345
+ self,
346
+ location_id: str,
347
+ dect_network_id: str,
348
+ line1_member_id: str,
349
+ line2_member_id: str = None,
350
+ custom_display_name: str = None,
351
+ org_id: str = None
352
+ ) -> None
353
+ ```
354
+
355
+ `custom_display_name` is mandatory (1-16 characters). Raises `ValueError` if `None`.
356
+
357
+ ### Add a List of Handsets (Bulk)
358
+
359
+ ```python
360
+ def add_list_of_handsets(
361
+ self,
362
+ location_id: str,
363
+ dect_network_id: str,
364
+ items: list[AddDECTHandset],
365
+ org_id: str = None
366
+ ) -> list[AddDECTHandsetBulkResponse]
367
+ ```
368
+
369
+ Add up to **50 handsets** in a single call. Each `AddDECTHandset` contains `line1_member_id`, `line2_member_id` (optional), and `custom_display_name` (optional).
370
+
371
+ Returns per-item results with status codes and error details if any failed.
372
+
373
+ ### List Handsets
374
+
375
+ ```python
376
+ def list_handsets(
377
+ self,
378
+ location_id: str,
379
+ dect_network_id: str,
380
+ basestation_id: str = None,
381
+ member_id: str = None,
382
+ org_id: str = None
383
+ ) -> DECTHandsetList
384
+ ```
385
+
386
+ Returns a `DECTHandsetList` containing `number_of_handsets_assigned`, `number_of_lines_assigned`, and the list of `DECTHandsetItem` objects. Filter by `basestation_id` or `member_id`.
387
+
388
+ ### Get Handset Details
389
+
390
+ ```python
391
+ def handset_details(
392
+ self,
393
+ location_id: str,
394
+ dect_network_id: str,
395
+ handset_id: str,
396
+ org_id: str = None
397
+ ) -> DECTHandsetItem
398
+ ```
399
+
400
+ ### Update Handset (Line Assignment)
401
+
402
+ ```python
403
+ def update_handset(
404
+ self,
405
+ location_id: str,
406
+ dect_network_id: str,
407
+ handset_id: str,
408
+ line1_member_id: str,
409
+ custom_display_name: str,
410
+ line2_member_id: str = None,
411
+ org_id: str = None
412
+ ) -> None
413
+ ```
414
+
415
+ Updates the line assignment on a handset. `line1_member_id` and `custom_display_name` are required.
416
+
417
+ ### Delete a Single Handset
418
+
419
+ ```python
420
+ def delete_handset(
421
+ self,
422
+ location_id: str,
423
+ dect_network_id: str,
424
+ handset_id: str,
425
+ org_id: str = None
426
+ ) -> None
427
+ ```
428
+
429
+ ### Delete Multiple Handsets
430
+
431
+ ```python
432
+ def delete_handsets(
433
+ self,
434
+ location_id: str,
435
+ dect_network_id: str,
436
+ handset_ids: list[str],
437
+ delete_all: bool = None,
438
+ org_id: str = None
439
+ ) -> None
440
+ ```
441
+
442
+ If `delete_all` is `True`, the `handset_ids` array is ignored and all handsets in the network are deleted.
443
+
444
+ ### CLI Examples
445
+
446
+ ```bash
447
+ # List all handsets in a DECT network
448
+ wxcli dect-devices list-handsets <location_id> <dect_network_id>
449
+
450
+ # List handsets as JSON
451
+ wxcli dect-devices list-handsets <location_id> <dect_network_id> -o json
452
+
453
+ # List handsets filtered by base station
454
+ wxcli dect-devices list-handsets <location_id> <dect_network_id> \
455
+ --basestation-id <base_station_id>
456
+
457
+ # List handsets filtered by member (person, workspace, or virtual line)
458
+ wxcli dect-devices list-handsets <location_id> <dect_network_id> \
459
+ --member-id <person_id>
460
+
461
+ # Show details of a specific handset
462
+ wxcli dect-devices show-handsets <location_id> <dect_network_id> <handset_id>
463
+
464
+ # Add a single handset with one line
465
+ wxcli dect-devices create-handsets <location_id> <dect_network_id> \
466
+ --line1-member-id <person_id> \
467
+ --custom-display-name "Reception"
468
+
469
+ # Add a single handset with two lines (line 2 can be a virtual line)
470
+ wxcli dect-devices create-handsets <location_id> <dect_network_id> \
471
+ --line1-member-id <person_id> \
472
+ --line2-member-id <virtual_line_id> \
473
+ --custom-display-name "Front Desk"
474
+
475
+ # Update handset line assignment and display name
476
+ wxcli dect-devices update-handsets <location_id> <dect_network_id> <handset_id> \
477
+ --line1-member-id <new_person_id> \
478
+ --custom-display-name "Updated Name"
479
+
480
+ # Update handset to add a second line
481
+ wxcli dect-devices update-handsets <location_id> <dect_network_id> <handset_id> \
482
+ --line2-member-id <virtual_line_id>
483
+
484
+ # Delete a single handset
485
+ wxcli dect-devices delete-handsets-dect-networks <location_id> <dect_network_id> <handset_id>
486
+
487
+ # Delete a single handset (skip confirmation)
488
+ wxcli dect-devices delete-handsets-dect-networks <location_id> <dect_network_id> <handset_id> --force
489
+
490
+ # Delete multiple handsets (bulk)
491
+ wxcli dect-devices delete-handsets-dect-networks-1 <location_id> <dect_network_id>
492
+
493
+ # Delete multiple handsets (skip confirmation)
494
+ wxcli dect-devices delete-handsets-dect-networks-1 <location_id> <dect_network_id> --force
495
+
496
+ # Bulk add handsets (up to 50, requires --json-body)
497
+ wxcli dect-devices create-bulk <location_id> <dect_network_id> \
498
+ --json-body '{"items":[{"line1MemberId":"<person_id_1>","customDisplayName":"User 1"},{"line1MemberId":"<person_id_2>","line2MemberId":"<vl_id>","customDisplayName":"User 2"}]}'
499
+ ```
500
+
501
+ ---
502
+
503
+ ## Association Queries
504
+
505
+ Query which DECT networks are associated with a specific person, workspace, or virtual line.
506
+
507
+ ### DECT Networks for a Person
508
+
509
+ ```python
510
+ def dect_networks_associated_with_person(
511
+ self,
512
+ person_id: str,
513
+ org_id: str = None
514
+ ) -> list[AssignedDectNetwork]
515
+ ```
516
+
517
+ ### DECT Networks for a Workspace
518
+
519
+ ```python
520
+ def dect_networks_associated_with_workspace(
521
+ self,
522
+ workspace_id: str,
523
+ org_id: str = None
524
+ ) -> list[AssignedDectNetwork]
525
+ ```
526
+
527
+ ### DECT Networks for a Virtual Line
528
+
529
+ ```python
530
+ def dect_networks_associated_with_virtual_line(
531
+ self,
532
+ virtual_line_id: str,
533
+ org_id: str = None
534
+ ) -> list[AssignedDectNetwork]
535
+ ```
536
+
537
+ ### CLI Examples
538
+
539
+ ```bash
540
+ # List DECT networks associated with a person
541
+ wxcli dect-devices list-dect-networks-people <person_id>
542
+
543
+ # List DECT networks associated with a workspace
544
+ wxcli dect-devices list-dect-networks-workspaces <workspace_id>
545
+
546
+ # Output as JSON
547
+ wxcli dect-devices list-dect-networks-people <person_id> -o json
548
+ ```
549
+
550
+ ---
551
+
552
+ ## Available Members Search
553
+
554
+ Search for members that can be assigned to DECT handset lines.
555
+
556
+ ```python
557
+ def available_members(
558
+ self,
559
+ member_name: str = None,
560
+ phone_number: str = None,
561
+ extension: str = None,
562
+ location_id: str = None,
563
+ order: str = None,
564
+ exclude_virtual_line: bool = None,
565
+ usage_type: UsageType = None,
566
+ org_id: str = None,
567
+ **params
568
+ ) -> Generator[AvailableMember, None, None]
569
+ ```
570
+
571
+ | Parameter | Notes |
572
+ |-----------|-------|
573
+ | `member_name` | Contains-match on member name |
574
+ | `phone_number` | Contains-match on number |
575
+ | `extension` | Contains-match on extension |
576
+ | `order` | Sort by `lname` (last name, default) or `fname` (first name), ascending |
577
+ | `exclude_virtual_line` | If `True`, virtual lines are excluded. Virtual lines cannot be the primary line. |
578
+ | `usage_type` | Filter by `UsageType` -- eligible as device owner or shared line |
579
+
580
+ Returns a **Generator** (paginated). Yields `AvailableMember` instances.
581
+
582
+ ### CLI Examples
583
+
584
+ ```bash
585
+ # Search all available members for DECT line assignment
586
+ wxcli dect-devices list-available-members
587
+
588
+ # Search by member name
589
+ wxcli dect-devices list-available-members --member-name "Jane"
590
+
591
+ # Search by phone number
592
+ wxcli dect-devices list-available-members --phone-number "+1555"
593
+
594
+ # Search by extension
595
+ wxcli dect-devices list-available-members --extension "1001"
596
+
597
+ # Filter by location
598
+ wxcli dect-devices list-available-members --location-id <location_id>
599
+
600
+ # Exclude virtual lines (for line 1 assignment — virtual lines can only be line 2)
601
+ wxcli dect-devices list-available-members --exclude-virtual-line true
602
+
603
+ # Filter by usage type (device owner vs shared line)
604
+ wxcli dect-devices list-available-members --usage-type DEVICE_OWNER
605
+
606
+ # Sort by first name instead of last name (default)
607
+ wxcli dect-devices list-available-members --order fname
608
+
609
+ # Output as JSON
610
+ wxcli dect-devices list-available-members --member-name "Jane" -o json
611
+ ```
612
+
613
+ ---
614
+
615
+ ## Serviceability Password
616
+
617
+ The DECT serviceability password (also called the admin override password) provides read/write access to DECT base stations for system serviceability and troubleshooting.
618
+
619
+ ### Generate and Enable Password
620
+
621
+ ```python
622
+ def generate_and_enable_dect_serviceability_password(
623
+ self,
624
+ location_id: str,
625
+ dect_network_id: str,
626
+ org_id: str = None
627
+ ) -> str # returns the 16-character password
628
+ ```
629
+
630
+ **Warning:** Generating a new password and transmitting it to the DECT network can **reboot the entire network**. Choose an appropriate maintenance window.
631
+
632
+ ### Get Password Status
633
+
634
+ ```python
635
+ def get_dect_serviceability_password_status(
636
+ self,
637
+ location_id: str,
638
+ dect_network_id: str,
639
+ org_id: str = None
640
+ ) -> bool # True if enabled
641
+ ```
642
+
643
+ Note: If the password is enabled but has not been generated, status still returns `True` even though there is no active password.
644
+
645
+ ### Update Password Status (Enable/Disable)
646
+
647
+ ```python
648
+ def update_dect_serviceability_password_status(
649
+ self,
650
+ location_id: str,
651
+ dect_network_id: str,
652
+ enabled: bool,
653
+ org_id: str = None
654
+ ) -> None
655
+ ```
656
+
657
+ When `enabled` is `False`, the Cisco-owned password is required for serviceability access instead.
658
+
659
+ **Warning:** Enabling or disabling the password can **reboot the entire network**.
660
+
661
+ ### CLI Examples
662
+
663
+ ```bash
664
+ # Generate and enable a serviceability password (WARNING: may reboot DECT network)
665
+ wxcli dect-devices generate-and-enable <location_id> <dect_network_id>
666
+
667
+ # Check serviceability password status (enabled/disabled)
668
+ wxcli dect-devices show-serviceability-password <location_id> <dect_network_id>
669
+
670
+ # Enable serviceability password (WARNING: may reboot DECT network)
671
+ wxcli dect-devices update-serviceability-password <location_id> <dect_network_id> --enabled
672
+
673
+ # Disable serviceability password (WARNING: may reboot DECT network)
674
+ wxcli dect-devices update-serviceability-password <location_id> <dect_network_id> --no-enabled
675
+ ```
676
+
677
+ ---
678
+
679
+ ## Hot Desking
680
+
681
+ Hot desking allows users to temporarily sign into a shared workspace device and use it as their own phone. The `HotDeskApi` manages active hot desk sessions.
682
+
683
+ ### API Access
684
+
685
+ ```python
686
+ hotdesk = api.telephony.hotdesk #
687
+ ```
688
+
689
+ ### Data Model
690
+
691
+ ```python
692
+ class HotDesk(ApiModel):
693
+ session_id: Optional[str] = None # Unique session identifier
694
+ workspace_id: Optional[str] = None # Workspace where session is active
695
+ person_id: Optional[str] = None # Person who initiated the session
696
+ booking_start_time: Optional[datetime] = None
697
+ booking_end_time: Optional[datetime] = None
698
+ ```
699
+
700
+ ### List Sessions
701
+
702
+ ```python
703
+ def list_sessions(
704
+ self,
705
+ person_id: str = None,
706
+ workspace_id: str = None,
707
+ org_id: str = None
708
+ ) -> list[HotDesk]
709
+ ```
710
+
711
+ Both `person_id` and `workspace_id` are optional filters. When used together, they act as an AND filter. The `org_id` parameter is for partner administrators acting on a managed organization.
712
+
713
+ ### Delete Session
714
+
715
+ ```python
716
+ def delete_session(
717
+ self,
718
+ session_id: str
719
+ ) -> None
720
+ ```
721
+
722
+ Ends a hot desk session by its unique session ID.
723
+
724
+ ---
725
+
726
+ ## Data Models
727
+
728
+ ### DECT Network Models
729
+
730
+ #### `DECTNetworkModel` (Enum)
731
+
732
+ | Value | String |
733
+ |-------|--------|
734
+ | `dms_cisco_dbs110` | `'DMS Cisco DBS110'` |
735
+ | `cisco_dect_110_base` | `'Cisco DECT 110 Base'` |
736
+ | `dms_cisco_dbs210` | `'DMS Cisco DBS210'` |
737
+ | `cisco_dect_210_base` | `'Cisco DECT 210 Base'` |
738
+
739
+ #### `DECTNetworkDetail`
740
+
741
+ | Field | Type | Description |
742
+ |-------|------|-------------|
743
+ | `id` | `str` | Unique identifier |
744
+ | `name` | `str` | Network name (unique per location) |
745
+ | `display_name` | `str` | Name shown on handsets |
746
+ | `chain_id` | `int` | Chain ID of the network |
747
+ | `model` | `DECTNetworkModel` | Base station model deployed |
748
+ | `default_access_code_enabled` | `bool` | Whether a shared access code is used |
749
+ | `default_access_code` | `str` | 4-digit shared access code (if enabled) |
750
+ | `number_of_base_stations` | `int` | Count of base stations |
751
+ | `number_of_handsets_assigned` | `int` | Count of assigned handsets |
752
+ | `number_of_lines` | `int` | Count of lines |
753
+ | `location` | `IdAndName` | Location id and name |
754
+
755
+ #### `DectDevice`
756
+
757
+ | Field | Type | Description |
758
+ |-------|------|-------------|
759
+ | `model` | `str` | Model name |
760
+ | `display_name` | `str` | Display name |
761
+ | `number_of_base_stations` | `int` | Supported base station count |
762
+ | `number_of_line_ports` | `int` | Supported line port count |
763
+ | `number_of_registrations_supported` | `int` | Supported registration count |
764
+
765
+ ### Base Station Models
766
+
767
+ #### `BaseStationResponse` (creation result)
768
+
769
+ | Field | Type | Description |
770
+ |-------|------|-------------|
771
+ | `mac` | `str` | MAC address added |
772
+ | `result` | `BaseStationResult` | Contains `status` (int) and `id` (str) |
773
+
774
+ #### `BaseStationsResponse` (list item)
775
+
776
+ | Field | Type | Description |
777
+ |-------|------|-------------|
778
+ | `id` | `str` | Base station ID |
779
+ | `mac` | `str` | MAC address |
780
+ | `number_of_lines_registered` | `int` | Registered handset line count |
781
+
782
+ #### `BaseStationDetail`
783
+
784
+ | Field | Type | Description |
785
+ |-------|------|-------------|
786
+ | `id` | `str` | Base station ID |
787
+ | `mac` | `str` | MAC address |
788
+ | `handsets` | `list[Handset]` | Registered handsets with line details |
789
+
790
+ ### Handset Models
791
+
792
+ #### `DECTHandsetLine`
793
+
794
+ | Field | Type | Description |
795
+ |-------|------|-------------|
796
+ | `member_id` | `str` | Member ID (PEOPLE or PLACE) |
797
+ | `first_name` | `str` | Member's first name |
798
+ | `last_name` | `str` | Member's last name |
799
+ | `external` | `str` | Primary phone number |
800
+ | `extension` | `str` | Extension |
801
+ | `routing_prefix` | `str` | Location routing prefix |
802
+ | `esn` | `str` | Routing prefix + extension |
803
+ | `last_registration_time` | `str` | Last registration timestamp |
804
+ | `host_ip` | `str` | Registration host IP (JSON alias: `hostIP`) |
805
+ | `remote_ip` | `str` | Registration remote IP (JSON alias: `remoteIP`) |
806
+ | `location` | `IdAndName` | Location id and name |
807
+ | `member_type` | `UserType` | Member type indicator |
808
+
809
+ #### `Handset`
810
+
811
+ | Field | Type | Description |
812
+ |-------|------|-------------|
813
+ | `id` | `str` | Handset unique identifier |
814
+ | `display_name` | `str` | Display name |
815
+ | `access_code` | `str` | Access code for pairing |
816
+ | `lines` | `list[DECTHandsetLine]` | Up to 2 line members |
817
+
818
+ #### `DECTHandsetItem`
819
+
820
+ | Field | Type | Description |
821
+ |-------|------|-------------|
822
+ | `id` | `str` | Handset unique identifier |
823
+ | `index` | `int` | Handset index |
824
+ | `default_display_name` | `str` | Default display name |
825
+ | `custom_display_name` | `str` | Custom display name set by admin |
826
+ | `base_station_id` | `str` | Associated base station ID |
827
+ | `mac` | `str` | MAC address |
828
+ | `access_code` | `str` | Access code for pairing |
829
+ | `primary_enabled` | `bool` | Whether this is a primary line |
830
+ | `lines` | `list[DECTHandsetLine]` | Up to 2 line members |
831
+
832
+ #### `DECTHandsetList`
833
+
834
+ | Field | Type | Description |
835
+ |-------|------|-------------|
836
+ | `number_of_handsets_assigned` | `int` | Total handsets |
837
+ | `number_of_lines_assigned` | `int` | Total lines |
838
+ | `handsets` | `list[DECTHandsetItem]` | Handset details |
839
+
840
+ #### `AddDECTHandset` (for bulk add)
841
+
842
+ | Field | Type | Description |
843
+ |-------|------|-------------|
844
+ | `line1_member_id` | `str` | Line 1 member (PEOPLE or PLACE) |
845
+ | `line2_member_id` | `str` | Line 2 member (PEOPLE, PLACE, or VIRTUAL_LINE) |
846
+ | `custom_display_name` | `str` | Custom name (1-16 characters) |
847
+
848
+ #### `AddDECTHandsetBulkResponse`
849
+
850
+ | Field | Type | Description |
851
+ |-------|------|-------------|
852
+ | `custom_display_name` | `str` | The custom display name submitted |
853
+ | `result` | `AddDECTHandsetBulkResult` | Contains `status` (int) and `error` (`AddDECTHandsetBulkError` with `message` and `error_code`) |
854
+
855
+ ---
856
+
857
+ ## Raw HTTP
858
+
859
+ All examples use:
860
+
861
+ ```python
862
+ from wxc_sdk import WebexSimpleApi
863
+ api = WebexSimpleApi()
864
+ BASE = "https://webexapis.com/v1"
865
+ ```
866
+
867
+ No auto-pagination -- pass `max=1000` explicitly. All responses are JSON dicts. Errors raise `RestError`.
868
+
869
+ ### DECT Networks
870
+
871
+ #### Create a DECT network
872
+
873
+ ```python
874
+ body = {
875
+ "name": "Building A DECT",
876
+ "model": "DMS Cisco DBS210",
877
+ "defaultAccessCodeEnabled": True,
878
+ "defaultAccessCode": "1234",
879
+ "displayName": "Bldg A" # max 11 chars
880
+ }
881
+ result = api.session.rest_post(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks", json=body)
882
+ network_id = result.get("dectNetworkId") # NOTE: key is "dectNetworkId", not "id"
883
+ ```
884
+
885
+ #### List DECT networks (org-wide)
886
+
887
+ ```python
888
+ result = api.session.rest_get(f"{BASE}/telephony/config/dectNetworks", params={
889
+ "max": 1000,
890
+ "name": "Building A", # optional filter
891
+ "locationId": location_id, # optional filter
892
+ })
893
+ networks = result.get("dectNetworks", [])
894
+ # Each: {id, name, displayName, model, defaultAccessCodeEnabled, numberOfBaseStations, numberOfHandsetsAssigned, numberOfLines, location: {id, name}}
895
+ ```
896
+
897
+ #### Get DECT network details
898
+
899
+ ```python
900
+ result = api.session.rest_get(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}")
901
+ # Returns full DECTNetworkDetail object
902
+ ```
903
+
904
+ #### Update a DECT network
905
+
906
+ ```python
907
+ body = {
908
+ "name": "Building A DECT Updated",
909
+ "defaultAccessCodeEnabled": True,
910
+ "defaultAccessCode": "5678",
911
+ "displayName": "Bldg A v2"
912
+ }
913
+ api.session.rest_put(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}", json=body)
914
+ ```
915
+
916
+ #### Delete a DECT network
917
+
918
+ ```python
919
+ api.session.rest_delete(f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}")
920
+ ```
921
+
922
+ ### Base Stations
923
+
924
+ #### Create base stations (bulk by MAC)
925
+
926
+ ```python
927
+ body = {"baseStationMacs": ["AABBCCDDEEFF", "112233445566"]}
928
+ result = api.session.rest_post(
929
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations",
930
+ json=body
931
+ )
932
+ # Returns list of results: [{mac, result: {status, id}}, ...]
933
+ ```
934
+
935
+ #### List base stations
936
+
937
+ ```python
938
+ result = api.session.rest_get(
939
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations"
940
+ )
941
+ stations = result.get("baseStations", [])
942
+ # Each: {id, mac, numberOfLinesRegistered}
943
+ ```
944
+
945
+ #### Get base station details
946
+
947
+ ```python
948
+ result = api.session.rest_get(
949
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations/{base_station_id}"
950
+ )
951
+ # Returns: {id, mac, handsets: [{id, displayName, accessCode, lines: [...]}]}
952
+ ```
953
+
954
+ #### Delete a specific base station
955
+
956
+ ```python
957
+ api.session.rest_delete(
958
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations/{base_station_id}"
959
+ )
960
+ ```
961
+
962
+ #### Delete all base stations in a network
963
+
964
+ ```python
965
+ api.session.rest_delete(
966
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/baseStations"
967
+ )
968
+ ```
969
+
970
+ ### Handsets
971
+
972
+ #### Add a single handset
973
+
974
+ ```python
975
+ body = {
976
+ "line1MemberId": person_id,
977
+ "line2MemberId": virtual_line_id, # optional
978
+ "customDisplayName": "Reception" # 1-16 chars, required
979
+ }
980
+ api.session.rest_post(
981
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets",
982
+ json=body
983
+ )
984
+ ```
985
+
986
+ #### Add handsets in bulk (up to 50)
987
+
988
+ ```python
989
+ body = {
990
+ "items": [
991
+ {"line1MemberId": person_id_1, "customDisplayName": "User 1"},
992
+ {"line1MemberId": person_id_2, "line2MemberId": vl_id, "customDisplayName": "User 2"}
993
+ ]
994
+ }
995
+ result = api.session.rest_post(
996
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/bulk",
997
+ json=body
998
+ )
999
+ # Returns per-item results: [{customDisplayName, result: {status, error: {message, errorCode}}}]
1000
+ ```
1001
+
1002
+ #### List handsets
1003
+
1004
+ ```python
1005
+ result = api.session.rest_get(
1006
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets",
1007
+ params={
1008
+ "basestationId": base_station_id, # optional filter
1009
+ "memberId": person_id, # optional filter
1010
+ }
1011
+ )
1012
+ handsets = result.get("handsets", [])
1013
+ # Also: result["numberOfHandsetsAssigned"], result["numberOfLinesAssigned"]
1014
+ ```
1015
+
1016
+ #### Get handset details
1017
+
1018
+ ```python
1019
+ result = api.session.rest_get(
1020
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}"
1021
+ )
1022
+ # Returns: {id, index, defaultDisplayName, customDisplayName, baseStationId, mac, accessCode, primaryEnabled, lines: [...]}
1023
+ ```
1024
+
1025
+ #### Update handset
1026
+
1027
+ ```python
1028
+ body = {
1029
+ "line1MemberId": new_person_id,
1030
+ "customDisplayName": "Updated Name",
1031
+ "line2MemberId": new_vl_id # optional
1032
+ }
1033
+ api.session.rest_put(
1034
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}",
1035
+ json=body
1036
+ )
1037
+ ```
1038
+
1039
+ #### Delete a single handset
1040
+
1041
+ ```python
1042
+ api.session.rest_delete(
1043
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/{handset_id}"
1044
+ )
1045
+ ```
1046
+
1047
+ #### Delete multiple handsets
1048
+
1049
+ ```python
1050
+ body = {
1051
+ "handsetIds": [handset_id_1, handset_id_2],
1052
+ "deleteAll": False # set True to delete all handsets (ignores handsetIds)
1053
+ }
1054
+ api.session.rest_delete(
1055
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/handsets/",
1056
+ json=body
1057
+ )
1058
+ ```
1059
+
1060
+ ### Association Queries
1061
+
1062
+ ```python
1063
+ # DECT networks for a person
1064
+ result = api.session.rest_get(f"{BASE}/telephony/config/people/{person_id}/dectNetworks")
1065
+ networks = result.get("dectNetworks", [])
1066
+
1067
+ # DECT networks for a workspace
1068
+ result = api.session.rest_get(f"{BASE}/telephony/config/workspaces/{workspace_id}/dectNetworks")
1069
+ networks = result.get("dectNetworks", [])
1070
+ ```
1071
+
1072
+ ### Available Members
1073
+
1074
+ ```python
1075
+ result = api.session.rest_get(f"{BASE}/telephony/config/devices/availableMembers", params={
1076
+ "max": 1000,
1077
+ "memberName": "Jane",
1078
+ "locationId": location_id,
1079
+ "excludeVirtualLine": True, # virtual lines can't be line 1
1080
+ })
1081
+ members = result.get("members", [])
1082
+ # Each: {id, firstName, lastName, phoneNumber, extension, memberType}
1083
+ ```
1084
+
1085
+ ### Serviceability Password
1086
+
1087
+ ```python
1088
+ # Generate and enable password (WARNING: may reboot entire DECT network)
1089
+ result = api.session.rest_post(
1090
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword/actions/generate/invoke"
1091
+ )
1092
+ password = result.get("password") # 16-character string
1093
+
1094
+ # Get password status
1095
+ result = api.session.rest_get(
1096
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword"
1097
+ )
1098
+ enabled = result.get("enabled") # bool
1099
+
1100
+ # Update password status (WARNING: may reboot entire DECT network)
1101
+ api.session.rest_put(
1102
+ f"{BASE}/telephony/config/locations/{location_id}/dectNetworks/{network_id}/serviceabilityPassword",
1103
+ json={"enabled": False}
1104
+ )
1105
+ ```
1106
+
1107
+ ### Raw HTTP Gotchas
1108
+
1109
+ 1. **`dectNetworkId` not `id` in create response.** The create network response returns `{"dectNetworkId": "..."}`, not `{"id": "..."}`. Parse accordingly.
1110
+ 2. **`list_dect_networks` is org-wide.** The list endpoint is `GET /telephony/config/dectNetworks` (no location in path). Pass `locationId` as a query param to filter.
1111
+ 3. **90-second cooldown on handset changes.** Adding or removing handsets within 90 seconds may leave base stations out of sync until rebooted.
1112
+ 4. **Bulk handset add uses `/handsets/bulk`**, not `/handsets`. The single-add endpoint is `POST /handsets` (no `/bulk` suffix).
1113
+ 5. **Delete multiple handsets uses trailing slash.** The URL is `.../handsets/` (with trailing slash), taking a JSON body with `handsetIds` array.
1114
+ 6. **Serviceability password operations can reboot the network.** Both generating a new password and toggling enabled status trigger a network-wide reboot.
1115
+ 7. **No API for auto-generated access codes.** When `defaultAccessCodeEnabled` is `false`, per-handset codes are auto-generated but cannot be retrieved via API.
1116
+
1117
+ ---
1118
+
1119
+ ## Common Gotchas
1120
+
1121
+ 1. **Adding a DECT handset to a person with a Webex Calling Standard license disables Webex Calling** across their mobile, tablet, desktop, and browser applications. Deleting the handset re-enables it.
1122
+
1123
+ 2. **90-second cooldown on handset changes.** Adding or removing handsets in less than 90 seconds may result in the base station not having the latest configuration until it is rebooted.
1124
+
1125
+ 3. **No API for auto-generated access codes.** When `default_access_code_enabled` is `False`, per-handset access codes are auto-generated but cannot be retrieved via API. Use Control Hub.
1126
+
1127
+ 4. **Access code uniqueness.** The default access code must be unique within the same location to prevent handsets from accidentally registering with base stations on different DECT networks in range.
1128
+
1129
+ 5. **Serviceability password reboots the network.** Both generating a new password and toggling the enabled status can reboot the entire DECT network.
1130
+
1131
+ 6. **Display name limits differ.** Network `display_name` is 11 characters max. Handset `custom_display_name` is 1-16 characters.
1132
+
1133
+ 7. **Line 1 vs Line 2 member types.** Line 1 supports only PEOPLE and PLACE. Line 2 also supports VIRTUAL_LINE. Virtual lines cannot be the primary (line 1) member.
1134
+
1135
+ 8. **Hot desk scopes not documented.** The source code for `HotDeskApi` does not include scope documentation in the docstrings, and the OpenAPI specs also omit security/scope blocks for the Hot Desk endpoints.
1136
+
1137
+ 9. **`DECTNetworkModel` has alternate names.** `dms_cisco_dbs110` and `cisco_dect_110_base` both refer to the same physical hardware (DBS-110). Same for the 210 variants. Choose either enum value.
1138
+
1139
+ 10. **`list_dect_networks` is org-wide.** Unlike most DECT methods that require `location_id`, `list_dect_networks` searches across the entire org and accepts `location_id` as an optional filter.
1140
+
1141
+ 11. **DECT network create returns `dectNetworkId`, not `id`, in response body.**
1142
+ The `create_dect_network` API response body returns the new network's identifier under the key `dectNetworkId`, not `id`. Code that parses the raw JSON response as `response['id']` will get a `KeyError`. The wxc_sdk method handles this internally and returns the ID as a string.
1143
+
1144
+ ---
1145
+
1146
+ ## See Also
1147
+
1148
+ - **[devices-core.md](devices-core.md)** — Cloud device CRUD, activation codes, MAC provisioning, and telephony device settings. DECT devices are excluded from `device_settings` / `update_device_settings` in that API.
1149
+ - **[devices-workspaces.md](devices-workspaces.md)** — Workspace management including `HotdeskingStatus` enum and workspace hot desk creation constraints.
1150
+ - **[virtual-lines.md](virtual-lines.md)** — Virtual line management. DECT handset Line 2 supports VIRTUAL_LINE member type; see that doc for virtual line CRUD and call settings.