mistapi 0.63.2__tar.gz → 0.63.3__tar.gz

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 (368) hide show
  1. {mistapi-0.63.2 → mistapi-0.63.3}/CHANGELOG.md +90 -0
  2. {mistapi-0.63.2 → mistapi-0.63.3}/PKG-INFO +11 -6
  3. {mistapi-0.63.2 → mistapi-0.63.3}/README.md +10 -5
  4. {mistapi-0.63.2 → mistapi-0.63.3}/pyproject.toml +1 -1
  5. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__version.py +1 -1
  6. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sle.py +2 -2
  7. mistapi-0.63.3/src/mistapi/websockets/__ws_client.py +813 -0
  8. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/location.py +155 -45
  9. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/orgs.py +93 -27
  10. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/session.py +31 -9
  11. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/sites.py +217 -63
  12. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_websocket_client.py +322 -8
  13. {mistapi-0.63.2 → mistapi-0.63.3}/uv.lock +1 -1
  14. mistapi-0.63.2/src/mistapi/websockets/__ws_client.py +0 -445
  15. {mistapi-0.63.2 → mistapi-0.63.3}/.claude/settings.local.json +0 -0
  16. {mistapi-0.63.2 → mistapi-0.63.3}/.dccache +0 -0
  17. {mistapi-0.63.2 → mistapi-0.63.3}/.gitattributes +0 -0
  18. {mistapi-0.63.2 → mistapi-0.63.3}/.github/workflows/test.yml +0 -0
  19. {mistapi-0.63.2 → mistapi-0.63.3}/.gitignore +0 -0
  20. {mistapi-0.63.2 → mistapi-0.63.3}/.gitmodules +0 -0
  21. {mistapi-0.63.2 → mistapi-0.63.3}/.idea/.gitignore +0 -0
  22. {mistapi-0.63.2 → mistapi-0.63.3}/.idea/modules.xml +0 -0
  23. {mistapi-0.63.2 → mistapi-0.63.3}/.idea/python_package.iml +0 -0
  24. {mistapi-0.63.2 → mistapi-0.63.3}/.idea/vcs.xml +0 -0
  25. {mistapi-0.63.2 → mistapi-0.63.3}/.pre-commit-config.yaml +0 -0
  26. {mistapi-0.63.2 → mistapi-0.63.3}/.vscode/settings.json +0 -0
  27. {mistapi-0.63.2 → mistapi-0.63.3}/LICENSE +0 -0
  28. {mistapi-0.63.2 → mistapi-0.63.3}/Makefile +0 -0
  29. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/get.png +0 -0
  30. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/main.png +0 -0
  31. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/post.png +0 -0
  32. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_get.jpg +0 -0
  33. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_main.jpg +0 -0
  34. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_post.jpg +0 -0
  35. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/.github/copilot-instructions.md +0 -0
  36. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/.gitignore +0 -0
  37. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/CHANGELOG.md +0 -0
  38. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/LICENSE +0 -0
  39. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/README.md +0 -0
  40. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.openapi.json +0 -0
  41. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.openapi.yaml +0 -0
  42. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman.json +0 -0
  43. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman.v2.json +0 -0
  44. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman_env.json +0 -0
  45. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/tools/README.md +0 -0
  46. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/tools/api-doc-diff.sh +0 -0
  47. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.apimaticvscodeignore +0 -0
  48. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/.gitignore +0 -0
  49. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/modules.xml +0 -0
  50. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/vcs.xml +0 -0
  51. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/workdir.iml +0 -0
  52. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/APIMATIC-META.json +0 -0
  53. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a1_process.py +0 -0
  54. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a2_postman_postprocess.py +0 -0
  55. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a3_doc_xtags.py +0 -0
  56. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a4_check_tag_description.py +0 -0
  57. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a5_check_tag_response.py +0 -0
  58. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a6_check_response_header.py +0 -0
  59. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a7_additionalProperties.py +0 -0
  60. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/add_enum_desc.py +0 -0
  61. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/audit_description_coherence.py +0 -0
  62. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/check_descriptions.py +0 -0
  63. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/check_null.py +0 -0
  64. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/generate.sh +0 -0
  65. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/mist.postman_usage.json +0 -0
  66. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/openapi.yaml +0 -0
  67. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/spec_references.py +0 -0
  68. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/spec_references.yaml +0 -0
  69. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/test_query_param_commas.py +0 -0
  70. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/validate.sh +0 -0
  71. {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/websocket_samples/show_route.md +0 -0
  72. {mistapi-0.63.2 → mistapi-0.63.3}/scripts/generate.sh +0 -0
  73. {mistapi-0.63.2 → mistapi-0.63.3}/scripts/generate_from_openapi.py +0 -0
  74. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_request.py +0 -0
  75. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_response.py +0 -0
  76. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_session.py +0 -0
  77. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__init__.py +0 -0
  78. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__logger.py +0 -0
  79. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__models/__init__.py +0 -0
  80. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__models/privilege.py +0 -0
  81. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__pagination.py +0 -0
  82. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/__init__.py +0 -0
  83. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/__init__.py +0 -0
  84. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/__init__.py +0 -0
  85. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/alarm_defs.py +0 -0
  86. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_channels.py +0 -0
  87. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_esl_versions.py +0 -0
  88. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_led_status.py +0 -0
  89. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/app_categories.py +0 -0
  90. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/app_subcategories.py +0 -0
  91. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/applications.py +0 -0
  92. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/client_events.py +0 -0
  93. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/countries.py +0 -0
  94. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/default_gateway_config.py +0 -0
  95. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/device_events.py +0 -0
  96. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/device_models.py +0 -0
  97. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/fingerprint_types.py +0 -0
  98. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/gateway_applications.py +0 -0
  99. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/insight_metrics.py +0 -0
  100. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/languages.py +0 -0
  101. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/license_types.py +0 -0
  102. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/marvisclient_versions.py +0 -0
  103. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/mxedge_events.py +0 -0
  104. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/mxedge_models.py +0 -0
  105. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/nac_events.py +0 -0
  106. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/otherdevice_events.py +0 -0
  107. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/otherdevice_models.py +0 -0
  108. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/states.py +0 -0
  109. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/system_events.py +0 -0
  110. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/traffic_types.py +0 -0
  111. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/webhook_topics.py +0 -0
  112. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/__init__.py +0 -0
  113. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/__init__.py +0 -0
  114. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/alarmtemplates.py +0 -0
  115. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/deviceprofiles.py +0 -0
  116. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/devices.py +0 -0
  117. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/rftemplates.py +0 -0
  118. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/sitegroups.py +0 -0
  119. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/sites.py +0 -0
  120. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/sites/__init__.py +0 -0
  121. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/sites/optimize.py +0 -0
  122. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/invite/__init__.py +0 -0
  123. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/invite/verify.py +0 -0
  124. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/__init__.py +0 -0
  125. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/login.py +0 -0
  126. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/lookup.py +0 -0
  127. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/oauth.py +0 -0
  128. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/two_factor.py +0 -0
  129. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/logout/__init__.py +0 -0
  130. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/logout/logout.py +0 -0
  131. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/mobile/__init__.py +0 -0
  132. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/mobile/verify.py +0 -0
  133. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/__init__.py +0 -0
  134. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/admins.py +0 -0
  135. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/claim.py +0 -0
  136. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/insights.py +0 -0
  137. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/inventory.py +0 -0
  138. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/invites.py +0 -0
  139. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/licenses.py +0 -0
  140. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/logo.py +0 -0
  141. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/logs.py +0 -0
  142. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/msps.py +0 -0
  143. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/orggroups.py +0 -0
  144. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/orgs.py +0 -0
  145. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/search.py +0 -0
  146. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/ssoroles.py +0 -0
  147. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/ssos.py +0 -0
  148. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/stats.py +0 -0
  149. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/suggestion.py +0 -0
  150. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/tickets.py +0 -0
  151. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/__init__.py +0 -0
  152. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aamwprofiles.py +0 -0
  153. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/admins.py +0 -0
  154. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/alarms.py +0 -0
  155. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/alarmtemplates.py +0 -0
  156. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aos.py +0 -0
  157. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/apitokens.py +0 -0
  158. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aptemplates.py +0 -0
  159. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/assetfilters.py +0 -0
  160. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/assets.py +0 -0
  161. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/avprofiles.py +0 -0
  162. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/cert.py +0 -0
  163. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/claim.py +0 -0
  164. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/claims.py +0 -0
  165. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/clients.py +0 -0
  166. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/clone.py +0 -0
  167. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/crl.py +0 -0
  168. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/deviceprofiles.py +0 -0
  169. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/devices.py +0 -0
  170. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/events.py +0 -0
  171. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/evpn_topologies.py +0 -0
  172. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/exports.py +0 -0
  173. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/gatewaytemplates.py +0 -0
  174. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/guests.py +0 -0
  175. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/idpprofiles.py +0 -0
  176. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/insights.py +0 -0
  177. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/inventory.py +0 -0
  178. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/invites.py +0 -0
  179. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/jsi.py +0 -0
  180. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/licenses.py +0 -0
  181. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/logs.py +0 -0
  182. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/maps.py +0 -0
  183. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/marvisclients.py +0 -0
  184. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/marvisinvites.py +0 -0
  185. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mist_nac.py +0 -0
  186. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxclusters.py +0 -0
  187. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxedges.py +0 -0
  188. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxtunnels.py +0 -0
  189. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nac_clients.py +0 -0
  190. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nacportals.py +0 -0
  191. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nacrules.py +0 -0
  192. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nactags.py +0 -0
  193. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/networks.py +0 -0
  194. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/networktemplates.py +0 -0
  195. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ocdevices.py +0 -0
  196. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/orgs.py +0 -0
  197. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/otherdevices.py +0 -0
  198. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pcaps.py +0 -0
  199. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pma.py +0 -0
  200. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pskportals.py +0 -0
  201. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/psks.py +0 -0
  202. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/rftemplates.py +0 -0
  203. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdkclients.py +0 -0
  204. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdkinvites.py +0 -0
  205. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdktemplates.py +0 -0
  206. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/secintelprofiles.py +0 -0
  207. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/secpolicies.py +0 -0
  208. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/servicepolicies.py +0 -0
  209. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/services.py +0 -0
  210. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/setting.py +0 -0
  211. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sitegroups.py +0 -0
  212. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sites.py +0 -0
  213. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sitetemplates.py +0 -0
  214. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssl_proxy_cert.py +0 -0
  215. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssoroles.py +0 -0
  216. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssos.py +0 -0
  217. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssr.py +0 -0
  218. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/stats.py +0 -0
  219. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/subscriptions.py +0 -0
  220. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/templates.py +0 -0
  221. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/tickets.py +0 -0
  222. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/troubleshoot.py +0 -0
  223. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/uisettings.py +0 -0
  224. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/usermacs.py +0 -0
  225. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/vars.py +0 -0
  226. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/vpns.py +0 -0
  227. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wan_client.py +0 -0
  228. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wan_clients.py +0 -0
  229. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/webhooks.py +0 -0
  230. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wired_clients.py +0 -0
  231. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wlans.py +0 -0
  232. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxrules.py +0 -0
  233. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxtags.py +0 -0
  234. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxtunnels.py +0 -0
  235. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/__init__.py +0 -0
  236. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/recover.py +0 -0
  237. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/verify.py +0 -0
  238. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/__init__.py +0 -0
  239. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/recaptcha.py +0 -0
  240. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/register.py +0 -0
  241. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/verify.py +0 -0
  242. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/__init__.py +0 -0
  243. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/apitokens.py +0 -0
  244. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/login_failures.py +0 -0
  245. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/logs.py +0 -0
  246. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/oauth.py +0 -0
  247. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/self.py +0 -0
  248. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/subscriptions.py +0 -0
  249. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/two_factor.py +0 -0
  250. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/update.py +0 -0
  251. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/usage.py +0 -0
  252. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/__init__.py +0 -0
  253. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/aamwprofiles.py +0 -0
  254. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/alarms.py +0 -0
  255. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/analyze_spectrum.py +0 -0
  256. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/anomaly.py +0 -0
  257. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/apply_auto_map_assignment.py +0 -0
  258. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/apps.py +0 -0
  259. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/aptemplates.py +0 -0
  260. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/assetfilters.py +0 -0
  261. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/assets.py +0 -0
  262. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/auto_map_assignment.py +0 -0
  263. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/avprofiles.py +0 -0
  264. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/beacons.py +0 -0
  265. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/clear_auto_map_assignment.py +0 -0
  266. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/clients.py +0 -0
  267. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/count.py +0 -0
  268. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/deviceprofiles.py +0 -0
  269. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/devices.py +0 -0
  270. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/events.py +0 -0
  271. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/evpn_topologies.py +0 -0
  272. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/gatewaytemplates.py +0 -0
  273. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/guests.py +0 -0
  274. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/idpprofiles.py +0 -0
  275. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/insights.py +0 -0
  276. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/iotendpoints.py +0 -0
  277. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/licenses.py +0 -0
  278. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/location.py +0 -0
  279. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/maps.py +0 -0
  280. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mapstacks.py +0 -0
  281. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/marvis_configs.py +0 -0
  282. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mxedges.py +0 -0
  283. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mxtunnels.py +0 -0
  284. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/nac_clients.py +0 -0
  285. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/networks.py +0 -0
  286. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/networktemplates.py +0 -0
  287. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/otherdevices.py +0 -0
  288. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/pcaps.py +0 -0
  289. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/psks.py +0 -0
  290. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rfdiags.py +0 -0
  291. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rftemplates.py +0 -0
  292. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rogues.py +0 -0
  293. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rrm.py +0 -0
  294. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rssizones.py +0 -0
  295. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/secintelprofiles.py +0 -0
  296. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/servicepolicies.py +0 -0
  297. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/services.py +0 -0
  298. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/setting.py +0 -0
  299. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sites.py +0 -0
  300. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sitetemplates.py +0 -0
  301. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/skyatp.py +0 -0
  302. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/ssr.py +0 -0
  303. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/stats.py +0 -0
  304. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/subscriptions.py +0 -0
  305. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/synthetic_test.py +0 -0
  306. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/uisettings.py +0 -0
  307. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/vbeacons.py +0 -0
  308. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/visits.py +0 -0
  309. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/vpns.py +0 -0
  310. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_client.py +0 -0
  311. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_clients.py +0 -0
  312. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_usages.py +0 -0
  313. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/webhooks.py +0 -0
  314. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wired_clients.py +0 -0
  315. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wlans.py +0 -0
  316. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxrules.py +0 -0
  317. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxtags.py +0 -0
  318. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxtunnels.py +0 -0
  319. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/zones.py +0 -0
  320. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/__init__.py +0 -0
  321. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_smsglobal.py +0 -0
  322. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_telstra.py +0 -0
  323. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_twilio.py +0 -0
  324. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/cli.py +0 -0
  325. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__init__.py +0 -0
  326. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__common.py +0 -0
  327. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__init__.py +0 -0
  328. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__ws_wrapper.py +0 -0
  329. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/arp.py +0 -0
  330. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/bgp.py +0 -0
  331. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/bpdu.py +0 -0
  332. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dhcp.py +0 -0
  333. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dns.py +0 -0
  334. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dot1x.py +0 -0
  335. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/mac.py +0 -0
  336. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/miscellaneous.py +0 -0
  337. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/ospf.py +0 -0
  338. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/policy.py +0 -0
  339. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/port.py +0 -0
  340. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/remote_capture.py +0 -0
  341. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/routes.py +0 -0
  342. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/service_path.py +0 -0
  343. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/sessions.py +0 -0
  344. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/shell.py +0 -0
  345. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ap.py +0 -0
  346. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ex.py +0 -0
  347. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/srx.py +0 -0
  348. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ssr.py +0 -0
  349. {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/__init__.py +0 -0
  350. {mistapi-0.63.2 → mistapi-0.63.3}/tests/__init__.py +0 -0
  351. {mistapi-0.63.2 → mistapi-0.63.3}/tests/conftest.py +0 -0
  352. {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/__init__.py +0 -0
  353. {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/mock_responses.py +0 -0
  354. {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/test_data.py +0 -0
  355. {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/__init__.py +0 -0
  356. {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/test_api_endpoints.py +0 -0
  357. {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/test_authentication_flow.py +0 -0
  358. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/__init__.py +0 -0
  359. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_request.py +0 -0
  360. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_response.py +0 -0
  361. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_session.py +0 -0
  362. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_cli.py +0 -0
  363. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_init.py +0 -0
  364. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_logger.py +0 -0
  365. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_models.py +0 -0
  366. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_pagination.py +0 -0
  367. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_shell.py +0 -0
  368. {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_ws_wrapper.py +0 -0
@@ -1,4 +1,94 @@
1
1
  # CHANGELOG
2
+
3
+ ## Version 0.63.3 (July 2026)
4
+
5
+ **Released**: July 14, 2026
6
+
7
+ This patch release improves WebSocket subscription reliability, isolates user callbacks from the receive loop, and adds stronger reconnect, rate-limit, and connection-health safeguards. (#26)
8
+
9
+ ---
10
+
11
+ ### 1. NEW FEATURES
12
+
13
+ #### **Subscription Acknowledgement Watchdog**
14
+ WebSocket clients now track `channel_subscribed` acknowledgements for every requested channel. The configurable `subscription_watchdog_timeout` closes an incomplete connection and reports a `TimeoutError` through `on_error`; when `auto_reconnect=True`, the client reconnects and retries the subscriptions. Explicit `subscribe_failed` events are also surfaced through `on_error` before reconnecting.
15
+
16
+ #### **Ping and Pong Hooks**
17
+ Added `on_ping()` and `on_pong()` callbacks for applications that need visibility into WebSocket keepalive frames.
18
+
19
+ ---
20
+
21
+ ### 2. IMPROVEMENTS
22
+
23
+ #### **Non-Blocking Callback Delivery**
24
+ Incoming frames are now placed on a dedicated callback-worker queue so slow user callbacks no longer block the WebSocket receive loop. Pending callback messages are drained during shutdown, and `queue_maxsize` bounds both generator and callback delivery queues.
25
+
26
+ #### **Reconnect and Rate-Limit Handling**
27
+ - HTTP 429 handshake failures use the configurable `rate_limit_backoff` as a minimum reconnect delay.
28
+ - Exponential reconnect state is reset only after all requested subscriptions are acknowledged, so persistent subscription failures respect `max_reconnect_attempts` and continue increasing the backoff.
29
+ - `SessionWithUrl` connections with no managed channels reset reconnect state when the transport opens.
30
+
31
+ #### **Connection Health and Observability**
32
+ - Updated keepalive defaults to `ping_interval=60` and a derived `ping_timeout` of up to 45 seconds.
33
+ - Added periodic, thread-safe throughput and queue-depth logging through `throughput_log_interval`.
34
+ - Duplicate channels are removed while preserving order, high channel counts produce a warning, and connections above the 2,000-channel limit are rejected.
35
+
36
+ ---
37
+
38
+ ### 3. BUG FIXES
39
+
40
+ #### **Subscription Completion Accounting**
41
+ Unexpected `channel_subscribed` acknowledgements are now ignored before updating subscription progress, preventing them from cancelling the watchdog while requested channels are still missing.
42
+
43
+ ---
44
+
45
+ ## Version 0.63.2 (July 2026)
46
+
47
+ **Released**: July 14, 2026
48
+
49
+ This patch release stabilizes EX/SRX remote shell sessions, improves interactive terminal input handling, and adds a convenience helper for sending command batches. (#32)
50
+
51
+ ---
52
+
53
+ ### 1. NEW FEATURES
54
+
55
+ #### **Remote Shell Command Batches (`send_commands`)**
56
+ `ShellSession` now supports `send_commands()` to send multiple shell commands without manually appending line endings:
57
+
58
+ ```python
59
+ from mistapi.device_utils import ex
60
+
61
+ with ex.createShellSession(apisession, site_id, device_id) as session:
62
+ session.send_commands(["configure", "show | display set | no-more", "exit"])
63
+ while data := session.recv(timeout=0.5):
64
+ print(data.decode("utf-8", errors="replace"), end="")
65
+ ```
66
+
67
+ ---
68
+
69
+ ### 2. IMPROVEMENTS
70
+
71
+ #### **Remote Shell Readiness Handling**
72
+ `ShellSession` now waits for the initial shell output before sending the first keystrokes, then buffers that initial output so callers still receive the banner or prompt on the next `recv()` call. This avoids losing early commands when the WebSocket is connected but the remote PTY is not yet ready.
73
+
74
+ #### **Interactive Shell Input Handling**
75
+ `interactiveShell()` now uses platform-specific terminal input loops instead of `sshkeyboard`:
76
+ - POSIX terminals use raw-mode input so keystrokes are forwarded directly to the device.
77
+ - Windows consoles map special keys, such as arrows and navigation keys, to terminal escape sequences.
78
+ - Non-interactive stdin now raises a clear `RuntimeError` instructing callers to use `ShellSession` / `createShellSession()` for programmatic access.
79
+
80
+ #### **Dependency Cleanup**
81
+ Removed the unused `sshkeyboard` dependency and updated the lockfile.
82
+
83
+ ---
84
+
85
+ ### 3. BUG FIXES
86
+
87
+ #### **Remote Shell Close Races**
88
+ `ShellSession.send()` now handles WebSocket close races during the readiness wait or `send_binary()` call, preventing teardown windows from surfacing as `WebSocketConnectionClosedException` crashes.
89
+
90
+ ---
91
+
2
92
  ## Version 0.63.1 (June 2026)
3
93
 
4
94
  **Released**: June 14, 2026
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mistapi
3
- Version: 0.63.2
3
+ Version: 0.63.3
4
4
  Summary: Python package to simplify the Mist System APIs usage
5
5
  Project-URL: Source, https://github.com/tmunzer/mistapi_python
6
6
  Project-URL: Bug Tracker, https://github.com/tmunzer/mistapi_python/issues
@@ -610,19 +610,22 @@ All channel classes accept the following optional keyword arguments:
610
610
 
611
611
  | Parameter | Type | Default | Description |
612
612
  |-----------|------|---------|-------------|
613
- | `ping_interval` | `int` | `30` | Seconds between automatic ping frames. Set to `0` to disable pings. |
614
- | `ping_timeout` | `int` | `10` | Seconds to wait for a pong response before treating the connection as dead. |
613
+ | `ping_interval` | `int` | `60` | Seconds between automatic ping frames. Set to `0` to disable pings. |
614
+ | `ping_timeout` | `int \| None` | `None` | Seconds to wait for a pong response before treating the connection as dead. Defaults to `min(45, ping_interval - 1)` when pings are enabled, or `45` when `ping_interval=0` (unused since pings are disabled). When `ping_interval > 0`, this must be lower than `ping_interval`. |
615
615
  | `auto_reconnect` | `bool` | `False` | Automatically reconnect on transient failures using exponential backoff. |
616
616
  | `max_reconnect_attempts` | `int` | `5` | Maximum number of reconnect attempts before giving up. |
617
- | `reconnect_backoff` | `float` | `2.0` | Base backoff delay in seconds. Doubles after each failed attempt (2s, 4s, 8s, ...). Resets on successful reconnection. |
618
- | `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal queue for `receive()`. `0` means unbounded. When set, incoming messages are dropped with a warning when the queue is full, preventing memory growth on high-frequency streams. |
617
+ | `reconnect_backoff` | `float` | `2.0` | Base backoff delay in seconds. Doubles after each failed attempt (2s, 4s, 8s, ...). Resets once the connection is fully established and all requested subscriptions are acknowledged. |
618
+ | `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal queues used for both `receive()` and callback delivery. `0` means unbounded. When set, incoming messages are dropped with a warning when either queue is full, preventing memory growth on high-frequency streams. |
619
+ | `subscription_watchdog_timeout` | `float` | `10.0` | Maximum time to wait for all `channel_subscribed` acknowledgements after connect. On timeout, the error is reported to `on_error` and the connection is closed; with `auto_reconnect=True` this triggers a clean reconnect. |
620
+ | `rate_limit_backoff` | `float` | `30.0` | Minimum reconnect delay after a 429 rate-limit response. |
621
+ | `throughput_log_interval` | `int` | `100` | Logs queue depth and processed counts every N messages. Set to `0` to disable periodic throughput logs. |
619
622
 
620
623
  ```python
621
624
  ws = mistapi.websockets.sites.DeviceStatsEvents(
622
625
  apisession,
623
626
  site_ids=["<site_id>"],
624
627
  ping_interval=60, # ping every 60 s
625
- ping_timeout=20, # wait up to 20 s for pong
628
+ ping_timeout=45, # wait up to 45 s for pong
626
629
  auto_reconnect=True, # reconnect on transient failures
627
630
  )
628
631
  ws.connect()
@@ -636,6 +639,8 @@ ws.connect()
636
639
  | `ws.on_message(cb)` | `cb(data: dict)` | Register callback for incoming messages. Mutually exclusive with `receive()`. |
637
640
  | `ws.on_error(cb)` | `cb(error: Exception)` | Register callback for WebSocket errors |
638
641
  | `ws.on_close(cb)` | `cb(code: int \| None, msg: str \| None)` | Register callback for connection close. Safe to call `connect()` from within. |
642
+ | `ws.on_ping(cb)` | `cb(message: str \| bytes \| None)` | Register callback for received ping frames. |
643
+ | `ws.on_pong(cb)` | `cb(message: str \| bytes \| None)` | Register callback for received pong frames. |
639
644
  | `ws.connect(run_in_background)` | | Open the connection. `True` (default) runs in a daemon thread; `False` blocks. |
640
645
  | `ws.disconnect(wait, timeout)` | | Close the connection. `wait=True` blocks until the background thread finishes. |
641
646
  | `ws.receive()` | `-> Generator[dict]` | Blocking generator yielding messages. Mutually exclusive with `on_message`. |
@@ -583,19 +583,22 @@ All channel classes accept the following optional keyword arguments:
583
583
 
584
584
  | Parameter | Type | Default | Description |
585
585
  |-----------|------|---------|-------------|
586
- | `ping_interval` | `int` | `30` | Seconds between automatic ping frames. Set to `0` to disable pings. |
587
- | `ping_timeout` | `int` | `10` | Seconds to wait for a pong response before treating the connection as dead. |
586
+ | `ping_interval` | `int` | `60` | Seconds between automatic ping frames. Set to `0` to disable pings. |
587
+ | `ping_timeout` | `int \| None` | `None` | Seconds to wait for a pong response before treating the connection as dead. Defaults to `min(45, ping_interval - 1)` when pings are enabled, or `45` when `ping_interval=0` (unused since pings are disabled). When `ping_interval > 0`, this must be lower than `ping_interval`. |
588
588
  | `auto_reconnect` | `bool` | `False` | Automatically reconnect on transient failures using exponential backoff. |
589
589
  | `max_reconnect_attempts` | `int` | `5` | Maximum number of reconnect attempts before giving up. |
590
- | `reconnect_backoff` | `float` | `2.0` | Base backoff delay in seconds. Doubles after each failed attempt (2s, 4s, 8s, ...). Resets on successful reconnection. |
591
- | `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal queue for `receive()`. `0` means unbounded. When set, incoming messages are dropped with a warning when the queue is full, preventing memory growth on high-frequency streams. |
590
+ | `reconnect_backoff` | `float` | `2.0` | Base backoff delay in seconds. Doubles after each failed attempt (2s, 4s, 8s, ...). Resets once the connection is fully established and all requested subscriptions are acknowledged. |
591
+ | `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal queues used for both `receive()` and callback delivery. `0` means unbounded. When set, incoming messages are dropped with a warning when either queue is full, preventing memory growth on high-frequency streams. |
592
+ | `subscription_watchdog_timeout` | `float` | `10.0` | Maximum time to wait for all `channel_subscribed` acknowledgements after connect. On timeout, the error is reported to `on_error` and the connection is closed; with `auto_reconnect=True` this triggers a clean reconnect. |
593
+ | `rate_limit_backoff` | `float` | `30.0` | Minimum reconnect delay after a 429 rate-limit response. |
594
+ | `throughput_log_interval` | `int` | `100` | Logs queue depth and processed counts every N messages. Set to `0` to disable periodic throughput logs. |
592
595
 
593
596
  ```python
594
597
  ws = mistapi.websockets.sites.DeviceStatsEvents(
595
598
  apisession,
596
599
  site_ids=["<site_id>"],
597
600
  ping_interval=60, # ping every 60 s
598
- ping_timeout=20, # wait up to 20 s for pong
601
+ ping_timeout=45, # wait up to 45 s for pong
599
602
  auto_reconnect=True, # reconnect on transient failures
600
603
  )
601
604
  ws.connect()
@@ -609,6 +612,8 @@ ws.connect()
609
612
  | `ws.on_message(cb)` | `cb(data: dict)` | Register callback for incoming messages. Mutually exclusive with `receive()`. |
610
613
  | `ws.on_error(cb)` | `cb(error: Exception)` | Register callback for WebSocket errors |
611
614
  | `ws.on_close(cb)` | `cb(code: int \| None, msg: str \| None)` | Register callback for connection close. Safe to call `connect()` from within. |
615
+ | `ws.on_ping(cb)` | `cb(message: str \| bytes \| None)` | Register callback for received ping frames. |
616
+ | `ws.on_pong(cb)` | `cb(message: str \| bytes \| None)` | Register callback for received pong frames. |
612
617
  | `ws.connect(run_in_background)` | | Open the connection. `True` (default) runs in a daemon thread; `False` blocks. |
613
618
  | `ws.disconnect(wait, timeout)` | | Close the connection. `wait=True` blocks until the background thread finishes. |
614
619
  | `ws.receive()` | `-> Generator[dict]` | Blocking generator yielding messages. Mutually exclusive with `on_message`. |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mistapi"
7
- version = "0.63.2"
7
+ version = "0.63.3"
8
8
  authors = [{ name = "Thomas Munzer", email = "tmunzer@juniper.net" }]
9
9
  description = "Python package to simplify the Mist System APIs usage"
10
10
  keywords = ["Mist", "Juniper", "API"]
@@ -1,2 +1,2 @@
1
- __version__ = "0.63.2"
1
+ __version__ = "0.63.3"
2
2
  __author__ = "Thomas Munzer <tmunzer@juniper.net>"
@@ -18,7 +18,7 @@ import deprecation
18
18
  @deprecation.deprecated(
19
19
  deprecated_in="0.59.2",
20
20
  removed_in="0.65.0",
21
- current_version="0.63.2",
21
+ current_version="0.63.3",
22
22
  details="function replaced with getSiteSleClassifierSummaryTrend",
23
23
  )
24
24
  def getSiteSleClassifierDetails(
@@ -764,7 +764,7 @@ def listSiteSleImpactedWirelessClients(
764
764
  @deprecation.deprecated(
765
765
  deprecated_in="0.59.2",
766
766
  removed_in="0.65.0",
767
- current_version="0.63.2",
767
+ current_version="0.63.3",
768
768
  details="function replaced with getSiteSleSummaryTrend",
769
769
  )
770
770
  def getSiteSleSummary(