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.
- {mistapi-0.63.2 → mistapi-0.63.3}/CHANGELOG.md +90 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/PKG-INFO +11 -6
- {mistapi-0.63.2 → mistapi-0.63.3}/README.md +10 -5
- {mistapi-0.63.2 → mistapi-0.63.3}/pyproject.toml +1 -1
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__version.py +1 -1
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sle.py +2 -2
- mistapi-0.63.3/src/mistapi/websockets/__ws_client.py +813 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/location.py +155 -45
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/orgs.py +93 -27
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/session.py +31 -9
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/sites.py +217 -63
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_websocket_client.py +322 -8
- {mistapi-0.63.2 → mistapi-0.63.3}/uv.lock +1 -1
- mistapi-0.63.2/src/mistapi/websockets/__ws_client.py +0 -445
- {mistapi-0.63.2 → mistapi-0.63.3}/.claude/settings.local.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.dccache +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.gitattributes +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.github/workflows/test.yml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.gitignore +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.gitmodules +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.idea/.gitignore +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.idea/modules.xml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.idea/python_package.iml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.idea/vcs.xml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.pre-commit-config.yaml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/.vscode/settings.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/LICENSE +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/Makefile +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/get.png +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/main.png +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/post.png +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_get.jpg +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_main.jpg +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/._readme/img/thumbnail_post.jpg +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/.github/copilot-instructions.md +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/.gitignore +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/CHANGELOG.md +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/LICENSE +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/README.md +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.openapi.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.openapi.yaml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman.v2.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/mist.postman_env.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/tools/README.md +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/tools/api-doc-diff.sh +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.apimaticvscodeignore +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/.gitignore +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/modules.xml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/vcs.xml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/.idea/workdir.iml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/APIMATIC-META.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a1_process.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a2_postman_postprocess.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a3_doc_xtags.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a4_check_tag_description.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a5_check_tag_response.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a6_check_response_header.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/a7_additionalProperties.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/add_enum_desc.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/audit_description_coherence.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/check_descriptions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/check_null.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/generate.sh +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/mist.postman_usage.json +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/openapi.yaml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/spec_references.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/spec_references.yaml +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/test_query_param_commas.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/validate.sh +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/mist_openapi/workdir/websocket_samples/show_route.md +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/scripts/generate.sh +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/scripts/generate_from_openapi.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_request.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_response.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__api_session.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__logger.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__models/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__models/privilege.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/__pagination.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/alarm_defs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_channels.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_esl_versions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/ap_led_status.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/app_categories.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/app_subcategories.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/applications.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/client_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/countries.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/default_gateway_config.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/device_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/device_models.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/fingerprint_types.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/gateway_applications.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/insight_metrics.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/languages.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/license_types.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/marvisclient_versions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/mxedge_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/mxedge_models.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/nac_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/otherdevice_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/otherdevice_models.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/states.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/system_events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/traffic_types.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/const/webhook_topics.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/alarmtemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/deviceprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/devices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/rftemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/sitegroups.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/orgs/sites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/sites/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/installer/sites/optimize.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/invite/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/invite/verify.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/login.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/lookup.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/oauth.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/login/two_factor.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/logout/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/logout/logout.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/mobile/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/mobile/verify.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/admins.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/claim.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/insights.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/inventory.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/invites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/licenses.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/logo.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/logs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/msps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/orggroups.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/orgs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/search.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/ssoroles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/ssos.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/stats.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/suggestion.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/msps/tickets.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aamwprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/admins.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/alarms.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/alarmtemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aos.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/apitokens.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/aptemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/assetfilters.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/assets.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/avprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/cert.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/claim.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/claims.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/clone.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/crl.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/deviceprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/devices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/evpn_topologies.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/exports.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/gatewaytemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/guests.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/idpprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/insights.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/inventory.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/invites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/jsi.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/licenses.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/logs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/maps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/marvisclients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/marvisinvites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mist_nac.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxclusters.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxedges.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/mxtunnels.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nac_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nacportals.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nacrules.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/nactags.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/networks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/networktemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ocdevices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/orgs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/otherdevices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pcaps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pma.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/pskportals.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/psks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/rftemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdkclients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdkinvites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sdktemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/secintelprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/secpolicies.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/servicepolicies.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/services.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/setting.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sitegroups.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/sitetemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssl_proxy_cert.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssoroles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssos.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/ssr.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/stats.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/subscriptions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/templates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/tickets.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/troubleshoot.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/uisettings.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/usermacs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/vars.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/vpns.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wan_client.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wan_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/webhooks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wired_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wlans.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxrules.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxtags.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/orgs/wxtunnels.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/recover.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/recover/verify.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/recaptcha.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/register.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/register/verify.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/apitokens.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/login_failures.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/logs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/oauth.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/self.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/subscriptions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/two_factor.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/update.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/self/usage.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/aamwprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/alarms.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/analyze_spectrum.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/anomaly.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/apply_auto_map_assignment.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/apps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/aptemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/assetfilters.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/assets.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/auto_map_assignment.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/avprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/beacons.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/clear_auto_map_assignment.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/count.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/deviceprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/devices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/events.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/evpn_topologies.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/gatewaytemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/guests.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/idpprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/insights.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/iotendpoints.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/licenses.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/location.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/maps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mapstacks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/marvis_configs.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mxedges.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/mxtunnels.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/nac_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/networks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/networktemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/otherdevices.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/pcaps.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/psks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rfdiags.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rftemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rogues.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rrm.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/rssizones.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/secintelprofiles.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/servicepolicies.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/services.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/setting.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sites.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/sitetemplates.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/skyatp.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/ssr.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/stats.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/subscriptions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/synthetic_test.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/uisettings.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/vbeacons.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/visits.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/vpns.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_client.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wan_usages.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/webhooks.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wired_clients.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wlans.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxrules.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxtags.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/wxtunnels.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/sites/zones.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_smsglobal.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_telstra.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/api/v1/utils/test_twilio.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/cli.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__common.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/__ws_wrapper.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/arp.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/bgp.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/bpdu.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dhcp.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dns.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/dot1x.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/mac.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/miscellaneous.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/ospf.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/policy.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/port.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/remote_capture.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/routes.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/service_path.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/sessions.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/__tools/shell.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ap.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ex.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/srx.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/device_utils/ssr.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/src/mistapi/websockets/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/conftest.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/mock_responses.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/fixtures/test_data.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/test_api_endpoints.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/integration/test_authentication_flow.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/__init__.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_request.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_response.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_api_session.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_cli.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_init.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_logger.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_models.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_pagination.py +0 -0
- {mistapi-0.63.2 → mistapi-0.63.3}/tests/unit/test_shell.py +0 -0
- {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.
|
|
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` | `
|
|
614
|
-
| `ping_timeout` | `int` | `
|
|
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
|
|
618
|
-
| `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal
|
|
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=
|
|
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` | `
|
|
587
|
-
| `ping_timeout` | `int` | `
|
|
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
|
|
591
|
-
| `queue_maxsize` | `int` | `0` | Maximum messages buffered in the internal
|
|
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=
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
767
|
+
current_version="0.63.3",
|
|
768
768
|
details="function replaced with getSiteSleSummaryTrend",
|
|
769
769
|
)
|
|
770
770
|
def getSiteSleSummary(
|