taegis-sdk-python 1.6.0__tar.gz → 1.6.2__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 (295) hide show
  1. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/PKG-INFO +3 -2
  2. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/pyproject.toml +2 -1
  3. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/_version.py +1 -1
  4. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/__init__.py +6 -0
  5. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/logging/__init__.py +5 -0
  6. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/logging/_default.py +31 -0
  7. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/retry/__init__.py +5 -0
  8. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/retry/_default.py +80 -0
  9. taegis_sdk_python-1.6.2/taegis_sdk_python/middlewares/utils.py +39 -0
  10. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/service_core.py +43 -20
  11. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/__init__.py +57 -1
  12. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets2/types.py +22 -0
  13. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/entity_context/types.py +1 -0
  14. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations2/types.py +73 -62
  15. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants4/types.py +3 -0
  16. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat/types.py +1 -0
  17. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/templates/_jinja2.py +5 -2
  18. taegis_sdk_python-1.6.0/taegis_sdk_python/transport/__init__.py +0 -0
  19. taegis_sdk_python-1.6.0/taegis_sdk_python/transport/aiohttp_websockets.py +0 -1224
  20. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/.gitignore +0 -0
  21. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/LICENSE +0 -0
  22. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/README.md +0 -0
  23. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/__init__.py +0 -0
  24. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/_consts.py +0 -0
  25. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/authentication.py +0 -0
  26. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/__init__.py +0 -0
  27. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/alerts/__init__.py +0 -0
  28. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/alerts/federated_search.py +0 -0
  29. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/alerts/search.py +0 -0
  30. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/cases/__init__.py +0 -0
  31. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/cases/federated_search.py +0 -0
  32. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/cases/search.py +0 -0
  33. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/events/__init__.py +0 -0
  34. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/events/search.py +0 -0
  35. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/investigations/__init__.py +0 -0
  36. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/investigations/federated_search.py +0 -0
  37. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/investigations/search.py +0 -0
  38. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/sharelinks/__init__.py +0 -0
  39. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/sharelinks/create.py +0 -0
  40. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/commons/sharelinks/unfurl.py +0 -0
  41. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/config.py +0 -0
  42. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/errors.py +0 -0
  43. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/access_points/__init__.py +0 -0
  44. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/access_points/mutations.py +0 -0
  45. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/access_points/queries.py +0 -0
  46. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/access_points/subscriptions.py +0 -0
  47. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/access_points/types.py +0 -0
  48. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/agent/__init__.py +0 -0
  49. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/agent/mutations.py +0 -0
  50. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/agent/queries.py +0 -0
  51. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/agent/subscriptions.py +0 -0
  52. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/agent/types.py +0 -0
  53. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts/__init__.py +0 -0
  54. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts/mutations.py +0 -0
  55. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts/queries.py +0 -0
  56. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts/subscriptions.py +0 -0
  57. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts/types.py +0 -0
  58. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts_history/__init__.py +0 -0
  59. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts_history/mutations.py +0 -0
  60. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts_history/queries.py +0 -0
  61. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts_history/subscriptions.py +0 -0
  62. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/alerts_history/types.py +0 -0
  63. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets/__init__.py +0 -0
  64. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets/mutations.py +0 -0
  65. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets/queries.py +0 -0
  66. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets/subscriptions.py +0 -0
  67. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets/types.py +0 -0
  68. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets2/__init__.py +0 -0
  69. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets2/mutations.py +0 -0
  70. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets2/queries.py +0 -0
  71. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/assets2/subscriptions.py +0 -0
  72. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/audits/__init__.py +0 -0
  73. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/audits/mutations.py +0 -0
  74. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/audits/queries.py +0 -0
  75. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/audits/subscriptions.py +0 -0
  76. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/audits/types.py +0 -0
  77. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/authz/__init__.py +0 -0
  78. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/authz/mutations.py +0 -0
  79. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/authz/queries.py +0 -0
  80. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/authz/subscriptions.py +0 -0
  81. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/authz/types.py +0 -0
  82. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/byoti/__init__.py +0 -0
  83. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/byoti/mutations.py +0 -0
  84. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/byoti/queries.py +0 -0
  85. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/byoti/subscriptions.py +0 -0
  86. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/byoti/types.py +0 -0
  87. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/clients/__init__.py +0 -0
  88. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/clients/mutations.py +0 -0
  89. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/clients/queries.py +0 -0
  90. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/clients/subscriptions.py +0 -0
  91. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/clients/types.py +0 -0
  92. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/collector/__init__.py +0 -0
  93. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/collector/mutations.py +0 -0
  94. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/collector/queries.py +0 -0
  95. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/collector/subscriptions.py +0 -0
  96. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/collector/types.py +0 -0
  97. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/comments/__init__.py +0 -0
  98. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/comments/mutations.py +0 -0
  99. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/comments/queries.py +0 -0
  100. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/comments/subscriptions.py +0 -0
  101. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/comments/types.py +0 -0
  102. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/contracted_endpoint/__init__.py +0 -0
  103. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/contracted_endpoint/mutations.py +0 -0
  104. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/contracted_endpoint/queries.py +0 -0
  105. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/contracted_endpoint/subscriptions.py +0 -0
  106. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/contracted_endpoint/types.py +0 -0
  107. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/cql_metadata/__init__.py +0 -0
  108. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/cql_metadata/mutations.py +0 -0
  109. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/cql_metadata/queries.py +0 -0
  110. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/cql_metadata/subscriptions.py +0 -0
  111. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/cql_metadata/types.py +0 -0
  112. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/datasources/__init__.py +0 -0
  113. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/datasources/mutations.py +0 -0
  114. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/datasources/queries.py +0 -0
  115. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/datasources/subscriptions.py +0 -0
  116. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/datasources/types.py +0 -0
  117. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/detector_registry/__init__.py +0 -0
  118. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/detector_registry/mutations.py +0 -0
  119. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/detector_registry/queries.py +0 -0
  120. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/detector_registry/subscriptions.py +0 -0
  121. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/detector_registry/types.py +0 -0
  122. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_command_manager/__init__.py +0 -0
  123. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_command_manager/mutations.py +0 -0
  124. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_command_manager/queries.py +0 -0
  125. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_command_manager/subscriptions.py +0 -0
  126. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_command_manager/types.py +0 -0
  127. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_management_service/__init__.py +0 -0
  128. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_management_service/mutations.py +0 -0
  129. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_management_service/queries.py +0 -0
  130. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_management_service/subscriptions.py +0 -0
  131. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/endpoint_management_service/types.py +0 -0
  132. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/entity_context/__init__.py +0 -0
  133. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/entity_context/mutations.py +0 -0
  134. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/entity_context/queries.py +0 -0
  135. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/entity_context/subscriptions.py +0 -0
  136. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/event_search/__init__.py +0 -0
  137. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/event_search/mutations.py +0 -0
  138. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/event_search/queries.py +0 -0
  139. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/event_search/subscriptions.py +0 -0
  140. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/event_search/types.py +0 -0
  141. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/events/__init__.py +0 -0
  142. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/events/mutations.py +0 -0
  143. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/events/queries.py +0 -0
  144. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/events/subscriptions.py +0 -0
  145. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/events/types.py +0 -0
  146. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/exports/__init__.py +0 -0
  147. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/exports/mutations.py +0 -0
  148. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/exports/queries.py +0 -0
  149. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/exports/subscriptions.py +0 -0
  150. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/exports/types.py +0 -0
  151. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/fast_ioc/__init__.py +0 -0
  152. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/fast_ioc/mutations.py +0 -0
  153. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/fast_ioc/queries.py +0 -0
  154. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/fast_ioc/subscriptions.py +0 -0
  155. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/fast_ioc/types.py +0 -0
  156. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/file_info/__init__.py +0 -0
  157. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/file_info/mutations.py +0 -0
  158. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/file_info/queries.py +0 -0
  159. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/file_info/subscriptions.py +0 -0
  160. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/file_info/types.py +0 -0
  161. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/ingest_stats/__init__.py +0 -0
  162. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/ingest_stats/mutations.py +0 -0
  163. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/ingest_stats/queries.py +0 -0
  164. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/ingest_stats/subscriptions.py +0 -0
  165. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/ingest_stats/types.py +0 -0
  166. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations/__init__.py +0 -0
  167. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations/mutations.py +0 -0
  168. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations/queries.py +0 -0
  169. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations/subscriptions.py +0 -0
  170. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations/types.py +0 -0
  171. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations2/__init__.py +0 -0
  172. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations2/mutations.py +0 -0
  173. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations2/queries.py +0 -0
  174. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/investigations2/subscriptions.py +0 -0
  175. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/isensor/__init__.py +0 -0
  176. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/isensor/mutations.py +0 -0
  177. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/isensor/queries.py +0 -0
  178. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/isensor/subscriptions.py +0 -0
  179. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/isensor/types.py +0 -0
  180. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/mitre_attack_info/__init__.py +0 -0
  181. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/mitre_attack_info/mutations.py +0 -0
  182. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/mitre_attack_info/queries.py +0 -0
  183. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/mitre_attack_info/subscriptions.py +0 -0
  184. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/mitre_attack_info/types.py +0 -0
  185. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_context/__init__.py +0 -0
  186. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_context/mutations.py +0 -0
  187. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_context/queries.py +0 -0
  188. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_context/subscriptions.py +0 -0
  189. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_context/types.py +0 -0
  190. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_ioc/__init__.py +0 -0
  191. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_ioc/mutations.py +0 -0
  192. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_ioc/queries.py +0 -0
  193. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_ioc/subscriptions.py +0 -0
  194. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/multi_tenant_ioc/types.py +0 -0
  195. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/nl_search/__init__.py +0 -0
  196. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/nl_search/mutations.py +0 -0
  197. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/nl_search/queries.py +0 -0
  198. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/nl_search/subscriptions.py +0 -0
  199. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/nl_search/types.py +0 -0
  200. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notebooks/__init__.py +0 -0
  201. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notebooks/mutations.py +0 -0
  202. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notebooks/queries.py +0 -0
  203. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notebooks/subscriptions.py +0 -0
  204. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notebooks/types.py +0 -0
  205. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notifications/__init__.py +0 -0
  206. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notifications/mutations.py +0 -0
  207. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notifications/queries.py +0 -0
  208. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notifications/subscriptions.py +0 -0
  209. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/notifications/types.py +0 -0
  210. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/preferences/__init__.py +0 -0
  211. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/preferences/mutations.py +0 -0
  212. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/preferences/queries.py +0 -0
  213. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/preferences/subscriptions.py +0 -0
  214. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/preferences/types.py +0 -0
  215. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/process_trees/__init__.py +0 -0
  216. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/process_trees/mutations.py +0 -0
  217. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/process_trees/queries.py +0 -0
  218. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/process_trees/subscriptions.py +0 -0
  219. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/process_trees/types.py +0 -0
  220. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/queries/__init__.py +0 -0
  221. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/queries/mutations.py +0 -0
  222. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/queries/queries.py +0 -0
  223. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/queries/subscriptions.py +0 -0
  224. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/queries/types.py +0 -0
  225. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/roadrunner/__init__.py +0 -0
  226. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/roadrunner/mutations.py +0 -0
  227. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/roadrunner/queries.py +0 -0
  228. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/roadrunner/subscriptions.py +0 -0
  229. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/roadrunner/types.py +0 -0
  230. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/rules/__init__.py +0 -0
  231. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/rules/mutations.py +0 -0
  232. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/rules/queries.py +0 -0
  233. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/rules/subscriptions.py +0 -0
  234. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/rules/types.py +0 -0
  235. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/sharelinks/__init__.py +0 -0
  236. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/sharelinks/mutations.py +0 -0
  237. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/sharelinks/queries.py +0 -0
  238. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/sharelinks/subscriptions.py +0 -0
  239. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/sharelinks/types.py +0 -0
  240. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/subjects/__init__.py +0 -0
  241. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/subjects/mutations.py +0 -0
  242. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/subjects/queries.py +0 -0
  243. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/subjects/subscriptions.py +0 -0
  244. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/subjects/types.py +0 -0
  245. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenant_profiles/__init__.py +0 -0
  246. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenant_profiles/mutations.py +0 -0
  247. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenant_profiles/queries.py +0 -0
  248. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenant_profiles/subscriptions.py +0 -0
  249. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenant_profiles/types.py +0 -0
  250. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants/__init__.py +0 -0
  251. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants/mutations.py +0 -0
  252. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants/queries.py +0 -0
  253. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants/subscriptions.py +0 -0
  254. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants/types.py +0 -0
  255. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants4/__init__.py +0 -0
  256. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants4/mutations.py +0 -0
  257. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants4/queries.py +0 -0
  258. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/tenants4/subscriptions.py +0 -0
  259. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat/__init__.py +0 -0
  260. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat/mutations.py +0 -0
  261. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat/queries.py +0 -0
  262. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat/subscriptions.py +0 -0
  263. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat_score/__init__.py +0 -0
  264. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat_score/mutations.py +0 -0
  265. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat_score/queries.py +0 -0
  266. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat_score/subscriptions.py +0 -0
  267. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/threat_score/types.py +0 -0
  268. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trigger_action/__init__.py +0 -0
  269. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trigger_action/mutations.py +0 -0
  270. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trigger_action/queries.py +0 -0
  271. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trigger_action/subscriptions.py +0 -0
  272. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trigger_action/types.py +0 -0
  273. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trip/__init__.py +0 -0
  274. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trip/mutations.py +0 -0
  275. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trip/queries.py +0 -0
  276. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trip/subscriptions.py +0 -0
  277. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/trip/types.py +0 -0
  278. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/users/__init__.py +0 -0
  279. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/users/mutations.py +0 -0
  280. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/users/queries.py +0 -0
  281. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/users/subscriptions.py +0 -0
  282. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/users/types.py +0 -0
  283. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/vdr/__init__.py +0 -0
  284. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/vdr/mutations.py +0 -0
  285. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/vdr/queries.py +0 -0
  286. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/vdr/subscriptions.py +0 -0
  287. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/vdr/types.py +0 -0
  288. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/xdr_central_connector/__init__.py +0 -0
  289. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/xdr_central_connector/mutations.py +0 -0
  290. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/xdr_central_connector/queries.py +0 -0
  291. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/xdr_central_connector/subscriptions.py +0 -0
  292. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/services/xdr_central_connector/types.py +0 -0
  293. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/templates/__init__.py +0 -0
  294. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/tokens.py +0 -0
  295. {taegis_sdk_python-1.6.0 → taegis_sdk_python-1.6.2}/taegis_sdk_python/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taegis-sdk-python
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: Taegis Python SDK
5
5
  Project-URL: Homepage, https://github.com/secureworks/taegis-sdk-python
6
6
  Project-URL: Bug Reports, https://github.com/secureworks/taegis-sdk-python/issues
@@ -194,9 +194,10 @@ Classifier: Programming Language :: Python :: 3.12
194
194
  Classifier: Programming Language :: Python :: 3.13
195
195
  Requires-Python: >=3.9
196
196
  Requires-Dist: aiohttp
197
+ Requires-Dist: backoff
197
198
  Requires-Dist: dataclasses-json
198
199
  Requires-Dist: filelock>=3.12.4
199
- Requires-Dist: gql<4,>=3.5.0
200
+ Requires-Dist: gql>=4
200
201
  Requires-Dist: graphql-core
201
202
  Requires-Dist: jinja2
202
203
  Requires-Dist: oauthlib
@@ -24,7 +24,7 @@ dependencies = [
24
24
  "aiohttp",
25
25
  "dataclasses-json",
26
26
  "filelock>=3.12.4",
27
- "gql>=3.5.0,<4",
27
+ "gql>=4",
28
28
  "graphql-core",
29
29
  "oauthlib",
30
30
  "pyjwt>=2.8.0",
@@ -34,6 +34,7 @@ dependencies = [
34
34
  "requests-toolbelt",
35
35
  "websockets",
36
36
  "jinja2",
37
+ "backoff",
37
38
  ]
38
39
 
39
40
  [project.optional-dependencies]
@@ -1,3 +1,3 @@
1
1
  """Version idenitier."""
2
2
 
3
- __version__ = "1.6.0"
3
+ __version__ = "1.6.2"
@@ -0,0 +1,6 @@
1
+ """Taegis SDK Middlewares."""
2
+
3
+ from taegis_sdk_python.middlewares.logging import headers_logging_middleware
4
+ from taegis_sdk_python.middlewares.retry import retry_middleware
5
+
6
+ __all__ = ["headers_logging_middleware", "retry_middleware"]
@@ -0,0 +1,5 @@
1
+ """Taegis SDK Logging Middlewares."""
2
+
3
+ from ._default import headers_logging_middleware
4
+
5
+ __all__ = ["headers_logging_middleware"]
@@ -0,0 +1,31 @@
1
+ """Taegis SDK Logging Middlewares."""
2
+
3
+ import logging
4
+
5
+ from aiohttp import ClientHandlerType, ClientRequest, ClientResponse
6
+
7
+ from taegis_sdk_python.middlewares.utils import scrub_dict
8
+
9
+ log = logging.getLogger(__name__)
10
+
11
+
12
+ async def headers_logging_middleware(
13
+ req: ClientRequest, handler: ClientHandlerType
14
+ ) -> ClientResponse:
15
+ """Debug Log AIOHTTP Request and Response Headers. Remove access tokens from headers and values.
16
+
17
+ Parameters
18
+ ----------
19
+ req : ClientRequest
20
+ handler : ClientHandlerType
21
+
22
+ Returns
23
+ -------
24
+ ClientResponse
25
+ """
26
+ headers = scrub_dict(req.headers)
27
+ log.debug(f"Request Headers: {headers}")
28
+ resp = await handler(req)
29
+ headers = scrub_dict(resp.headers)
30
+ log.debug(f"Response Headers: {headers}")
31
+ return resp
@@ -0,0 +1,5 @@
1
+ """Taegis SDK Retry Middlewares."""
2
+
3
+ from ._default import retry_middleware
4
+
5
+ __all__ = ["retry_middleware"]
@@ -0,0 +1,80 @@
1
+ """Taegis SDK Retry Middlewares."""
2
+
3
+ from http import HTTPStatus
4
+ from typing import Optional
5
+
6
+ import backoff
7
+ from aiohttp import ClientHandlerType, ClientRequest, ClientResponse
8
+
9
+ from taegis_sdk_python.config import get_config
10
+
11
+ SECTION = "backoff.retry"
12
+
13
+
14
+ def config_max_time() -> Optional[int]:
15
+ """Provide Max Time elapsed for retry.
16
+
17
+ Returns
18
+ -------
19
+ int
20
+ Seconds.
21
+ """
22
+ config = get_config()
23
+
24
+ return config.getint(SECTION, "max_time", fallback=10)
25
+
26
+
27
+ def config_max_tries() -> Optional[int]:
28
+ """Provide Max Tries for retry.
29
+
30
+ Returns
31
+ -------
32
+ Optional[int]
33
+ Max tries.
34
+ """
35
+ config = get_config()
36
+
37
+ return config.getint(SECTION, "max_tries", fallback=None)
38
+
39
+
40
+ @backoff.on_predicate(
41
+ backoff.runtime,
42
+ predicate=lambda r: r.status == HTTPStatus.TOO_MANY_REQUESTS,
43
+ value=lambda r: int(r.headers.get("Retry-After")),
44
+ max_time=config_max_time,
45
+ max_tries=config_max_tries,
46
+ )
47
+ @backoff.on_predicate(
48
+ backoff.expo,
49
+ lambda r: r.status
50
+ in (
51
+ HTTPStatus.REQUEST_TIMEOUT,
52
+ HTTPStatus.INTERNAL_SERVER_ERROR,
53
+ HTTPStatus.BAD_GATEWAY,
54
+ HTTPStatus.SERVICE_UNAVAILABLE,
55
+ HTTPStatus.GATEWAY_TIMEOUT,
56
+ ),
57
+ max_time=config_max_time,
58
+ max_tries=config_max_tries,
59
+ )
60
+ async def retry_middleware(
61
+ req: ClientRequest, handler: ClientHandlerType
62
+ ) -> ClientResponse:
63
+ """Retry HTTP requests middleware.
64
+
65
+ Retry on exponential backoff for REQUEST_TIMEOUT (408), INTERNAL_SERVER_ERROR (500),
66
+ BAD_GATEWAY (502), SERVICE_UNAVAILABLE (503), GATEWAY_TIMEOUT (504).
67
+
68
+ If TOO_MANY_REQUESTS (429) is encounted, the value in the "Retry-After" header
69
+ will be used as the backoff timer.
70
+
71
+ Parameters
72
+ ----------
73
+ req : ClientRequest
74
+ handler : ClientHandlerType
75
+
76
+ Returns
77
+ -------
78
+ ClientResponse
79
+ """
80
+ return await handler(req)
@@ -0,0 +1,39 @@
1
+ """Taegis SDK Python Middlewares Utilities."""
2
+
3
+ from collections.abc import Mapping
4
+ from typing import List
5
+
6
+ from taegis_sdk_python.config import get_config
7
+
8
+
9
+ def get_access_tokens() -> List[str]:
10
+ """Retrieve all cached access tokens."""
11
+ config = get_config()
12
+
13
+ tokens = []
14
+ for section in config.sections():
15
+ if token := config.get(section, "access_token", fallback=None):
16
+ tokens.append(token)
17
+
18
+ return tokens
19
+
20
+
21
+ def scrub_dict(d: Mapping):
22
+ """Remove sensitive data from dictionary keys and values."""
23
+ access_tokens = get_access_tokens()
24
+
25
+ if "authorization" in d:
26
+ token = d["Authorization"].replace("Bearer ", "")
27
+ access_tokens.append(token)
28
+
29
+ scrubbed = d.copy()
30
+ for k, v in d.items():
31
+ if isinstance(k, str):
32
+ for token in access_tokens:
33
+ k = k.replace(token, "<redacted>")
34
+ if isinstance(v, str):
35
+ for token in access_tokens:
36
+ v = v.replace(token, "<redacted>")
37
+ scrubbed[k] = v
38
+
39
+ return scrubbed
@@ -10,14 +10,14 @@ import threading
10
10
  from datetime import datetime, timedelta
11
11
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
12
12
 
13
- from gql import Client, gql
13
+ from gql import Client, GraphQLRequest
14
14
  from gql.transport import Transport
15
15
  from gql.transport.aiohttp import AIOHTTPTransport
16
+ from gql.transport.aiohttp_websockets import AIOHTTPWebsocketsTransport
16
17
  from graphql import GraphQLError, GraphQLField, GraphQLSchema
17
18
 
18
19
  from taegis_sdk_python._version import __version__
19
20
  from taegis_sdk_python.errors import InvalidGraphQLEndpoint
20
- from taegis_sdk_python.transport.aiohttp_websockets import AIOHTTPWebsocketsTransport
21
21
  from taegis_sdk_python.utils import async_block, prepare_variables, remove_node
22
22
 
23
23
  if TYPE_CHECKING: # pragma: no cover
@@ -209,7 +209,10 @@ class ServiceCore:
209
209
  @property
210
210
  def sync_client(self) -> Client:
211
211
  """GraphQL Synchronous Transport with Client."""
212
- client_session_args = {"trust_env": self.service.trust_env}
212
+ client_session_args = {
213
+ "trust_env": self.service.trust_env,
214
+ "middlewares": self.service.middlewares,
215
+ }
213
216
 
214
217
  transport = AIOHTTPTransport(
215
218
  f"{self.sync_url}{self.gateway}",
@@ -246,7 +249,10 @@ class ServiceCore:
246
249
  if self.service.tenant_id:
247
250
  subprotocols.append(f"x-tenant-context-{self.service.tenant_id}")
248
251
 
249
- client_session_args = {"trust_env": self.service.trust_env}
252
+ client_session_args = {
253
+ "trust_env": self.service.trust_env,
254
+ "middlewares": self.service.middlewares,
255
+ }
250
256
 
251
257
  transport = AIOHTTPWebsocketsTransport(
252
258
  f"{self.wss_url}{self.gateway}",
@@ -483,19 +489,30 @@ class ServiceCore:
483
489
  """
484
490
  extra_args = {}
485
491
  if self.service.proxy:
486
- extra_args = {
487
- "proxy": self.service.proxy,
488
- "proxy_auth": self.service.proxy_auth,
489
- "proxy_headers": self.service.proxy_headers,
490
- }
491
-
492
- query = gql(query_string)
493
- return await self.sync_client.execute_async(
494
- query,
492
+ extra_args.update(
493
+ {
494
+ "proxy": self.service.proxy,
495
+ "proxy_auth": self.service.proxy_auth,
496
+ "proxy_headers": self.service.proxy_headers,
497
+ }
498
+ )
499
+
500
+ graphql_request = GraphQLRequest(
501
+ request=query_string,
495
502
  variable_values=prepare_variables(variables),
503
+ )
504
+
505
+ client = self.sync_client
506
+
507
+ response = await client.execute_async(
508
+ graphql_request,
496
509
  extra_args=extra_args,
497
510
  )
498
511
 
512
+ self.service.response_headers = client.transport.response_headers
513
+
514
+ return response
515
+
499
516
  @async_block
500
517
  async def subscribe(
501
518
  self, query_string: str, variables: Optional[Dict[str, Any]] = None
@@ -514,15 +531,21 @@ class ServiceCore:
514
531
  List[Any]
515
532
  List of subscription results
516
533
  """
517
- query = gql(query_string)
534
+ graphql_request = GraphQLRequest(
535
+ request=query_string,
536
+ variable_values=prepare_variables(variables),
537
+ )
538
+
518
539
  results = []
519
- async with self.ws_client as session:
520
- async for result in session.subscribe(
521
- query,
522
- variable_values=prepare_variables(variables),
523
- ):
540
+
541
+ client = self.ws_client
542
+
543
+ async with client as session:
544
+ async for result in session.subscribe(graphql_request):
524
545
  results.append(result)
525
546
 
547
+ self.service.response_headers = client.transport.response_headers
548
+
526
549
  return results[:-1]
527
550
 
528
551
  @async_block
@@ -568,7 +591,7 @@ class ServiceCore:
568
591
  # output string is valid
569
592
  for _ in range(10000):
570
593
  try:
571
- session.client.validate(gql(query_string))
594
+ session.client.validate(GraphQLRequest(request=query_string))
572
595
  break
573
596
 
574
597
  except GraphQLError as exc:
@@ -4,12 +4,14 @@ Taegis SDK Python GraphQL Service manager.
4
4
 
5
5
  import logging
6
6
  import threading
7
+ from collections.abc import Mapping
7
8
  from ssl import SSLContext
8
9
  from typing import Any, Dict, Literal, Optional, Union
9
10
 
10
11
  import aiohttp
11
12
  from aiohttp.client_reqrep import Fingerprint
12
13
  from aiohttp.typedefs import LooseHeaders
14
+ from multidict import CIMultiDict, CIMultiDictProxy
13
15
 
14
16
  from taegis_sdk_python._consts import (
15
17
  TAEGIS_ENVIRONMENT_URLS,
@@ -84,7 +86,7 @@ log = logging.getLogger(__name__)
84
86
  class GraphQLService:
85
87
  """Taegis GraphQL Service manager."""
86
88
 
87
- def __init__(
89
+ def __init__( # pylint: disable=too-many-locals
88
90
  self,
89
91
  *,
90
92
  environment: Optional[str] = None,
@@ -101,6 +103,8 @@ class GraphQLService:
101
103
  execute_timeout: Optional[Union[int, float]] = 300,
102
104
  max_message_size: int = 0,
103
105
  use_universal_authentication: bool = False,
106
+ middlewares=None,
107
+ reuse_request_id=False,
104
108
  ): # pylint: disable=too-many-statements
105
109
  """
106
110
  GraphQLService
@@ -143,6 +147,8 @@ class GraphQLService:
143
147
  ValueError
144
148
  environment must be charlie, delta, echo, or foxtrot (or equivalent)
145
149
  """
150
+ self.response_headers: CIMultiDictProxy[str] = CIMultiDictProxy(CIMultiDict())
151
+
146
152
  self._environments = environments or TAEGIS_ENVIRONMENT_URLS
147
153
  self._environment = environment or list(self._environments)[0]
148
154
  self._use_universal_authentication = use_universal_authentication
@@ -175,6 +181,8 @@ class GraphQLService:
175
181
 
176
182
  self._execute_timeout = execute_timeout
177
183
  self._max_message_size = max_message_size
184
+ self._middlewares = middlewares or ()
185
+ self._reuse_request_id = reuse_request_id
178
186
 
179
187
  self._access_points = None
180
188
  self._agent = None
@@ -229,6 +237,37 @@ class GraphQLService:
229
237
  self._vdr = None
230
238
  self._xdr_central_connector = None
231
239
 
240
+ def __eq__(self, other):
241
+ """Compare equality of a GraphQLService.
242
+
243
+ As the GraphQService is a network service, equality is limited to the
244
+ context in which a request will be made.
245
+ """
246
+ if isinstance(other, GraphQLService):
247
+ return (
248
+ self.tenant_id == other.tenant_id
249
+ and self._environments[self.environment]
250
+ == other._environments[other.environment]
251
+ and self.url == other.url
252
+ and self.gateway == other.gateway
253
+ )
254
+ return NotImplemented
255
+
256
+ def __hash__(self):
257
+ """Hash of a GraphQLService.
258
+
259
+ As the GraphQService is a network service, hash values are limited to the
260
+ context in which a request will be made.
261
+ """
262
+ return hash(
263
+ (
264
+ self.tenant_id,
265
+ self._environments[self.environment],
266
+ self.url,
267
+ self.gateway,
268
+ )
269
+ )
270
+
232
271
  def __call__(self, **kwargs):
233
272
  if threading.get_ident() not in self._context_kwargs:
234
273
  self._context_kwargs[threading.get_ident()] = []
@@ -311,6 +350,11 @@ class GraphQLService:
311
350
  """Taegis Tenant Context."""
312
351
  return self._context_manager.get("tenant_id", self._tenant_id)
313
352
 
353
+ @property
354
+ def reuse_request_id(self):
355
+ """Reuse Previous Taegis X-Request-Id in response_headers."""
356
+ return self._context_manager.get("reuse_request_id", self._reuse_request_id)
357
+
314
358
  @property
315
359
  def access_token(self):
316
360
  """Taegis Access Token."""
@@ -355,6 +399,13 @@ class GraphQLService:
355
399
  if self.tenant_id:
356
400
  headers["X-Tenant-Context"] = self.tenant_id
357
401
 
402
+ if (
403
+ self.reuse_request_id
404
+ and isinstance(self.response_headers, Mapping)
405
+ and (x_request_id := self.response_headers.get("X-Request-Id"))
406
+ ):
407
+ headers["X-Amzn-Trace-Id"] = x_request_id
408
+
358
409
  headers.update(self.extra_headers)
359
410
 
360
411
  return headers
@@ -424,6 +475,11 @@ class GraphQLService:
424
475
  """GraphQL Execute Timeout."""
425
476
  return self._context_manager.get("execute_timeout", self._execute_timeout)
426
477
 
478
+ @property
479
+ def middlewares(self):
480
+ """Transport Middleware handlers."""
481
+ return self._context_manager.get("middlewares", self._middlewares)
482
+
427
483
  @property
428
484
  def access_points(self):
429
485
  """Access Points Service Endpoint."""
@@ -108,6 +108,8 @@ class AssetSearchOrderByInputV2(str, Enum):
108
108
  VULNERABILITY_STATUS_DESC = "vulnerability_status_desc"
109
109
  VENDOR_PROVIDED_HEALTH_ASC = "vendor_provided_health_asc"
110
110
  VENDOR_PROVIDED_HEALTH_DESC = "vendor_provided_health_desc"
111
+ VENDOR_PROVIDED_HEALTH_RAW_ASC = "vendor_provided_health_raw_asc"
112
+ VENDOR_PROVIDED_HEALTH_RAW_DESC = "vendor_provided_health_raw_desc"
111
113
  USERNAME_ASC = "username_asc"
112
114
  USERNAME_DESC = "username_desc"
113
115
  REBOOT_REQUIRED_ASC = "reboot_required_asc"
@@ -118,6 +120,8 @@ class AssetSearchOrderByInputV2(str, Enum):
118
120
  BIOS_SERIAL_DESC = "bios_serial_desc"
119
121
  FIRST_DISK_SERIAL_ASC = "first_disk_serial_asc"
120
122
  FIRST_DISK_SERIAL_DESC = "first_disk_serial_desc"
123
+ PENDING_UNINSTALL_ASC = "pending_uninstall_asc"
124
+ PENDING_UNINSTALL_DESC = "pending_uninstall_desc"
121
125
 
122
126
 
123
127
  class AssetHostnameSearchOrderByInput(str, Enum):
@@ -1208,6 +1212,9 @@ class AssetWhereInputV2:
1208
1212
  sensor_version: Optional[str] = field(
1209
1213
  default=None, metadata=config(field_name="sensorVersion")
1210
1214
  )
1215
+ vendor_provided_health_raw: Optional[str] = field(
1216
+ default=None, metadata=config(field_name="vendorProvidedHealthRaw")
1217
+ )
1211
1218
  system_type: Optional[str] = field(
1212
1219
  default=None, metadata=config(field_name="systemType")
1213
1220
  )
@@ -1250,6 +1257,12 @@ class AssetWhereInputV2:
1250
1257
  reboot_required: Optional[bool] = field(
1251
1258
  default=None, metadata=config(field_name="rebootRequired")
1252
1259
  )
1260
+ agent_mode: Optional[str] = field(
1261
+ default=None, metadata=config(field_name="agentMode")
1262
+ )
1263
+ pending_uninstall: Optional[bool] = field(
1264
+ default=None, metadata=config(field_name="pendingUninstall")
1265
+ )
1253
1266
  and_: Optional[List["AssetWhereInputV2"]] = field(
1254
1267
  default=None, metadata=config(field_name="and")
1255
1268
  )
@@ -1408,9 +1421,18 @@ class AssetV2:
1408
1421
  uninstall: Optional[bool] = field(
1409
1422
  default=None, metadata=config(field_name="uninstall")
1410
1423
  )
1424
+ vendor_provided_health_raw: Optional[str] = field(
1425
+ default=None, metadata=config(field_name="vendorProvidedHealthRaw")
1426
+ )
1411
1427
  reboot_required: Optional[bool] = field(
1412
1428
  default=None, metadata=config(field_name="rebootRequired")
1413
1429
  )
1430
+ agent_mode: Optional[str] = field(
1431
+ default=None, metadata=config(field_name="agentMode")
1432
+ )
1433
+ pending_uninstall: Optional[bool] = field(
1434
+ default=None, metadata=config(field_name="pendingUninstall")
1435
+ )
1414
1436
  hostnames: Optional[List[HostnameV2]] = field(
1415
1437
  default=None, metadata=config(field_name="hostnames")
1416
1438
  )
@@ -955,6 +955,7 @@ class EntityContextEntity:
955
955
 
956
956
  id: Optional[str] = field(default=None, metadata=config(field_name="id"))
957
957
  type: Optional[str] = field(default=None, metadata=config(field_name="type"))
958
+ subtype: Optional[str] = field(default=None, metadata=config(field_name="subtype"))
958
959
  first_seen: Optional[str] = field(
959
960
  default=None, metadata=config(field_name="firstSeen")
960
961
  )
@@ -2431,68 +2431,6 @@ class CommentsV2Arguments:
2431
2431
  )
2432
2432
 
2433
2433
 
2434
- @dataclass_json
2435
- @dataclass(order=True, eq=True, frozen=True)
2436
- class CaseTemplate:
2437
- """CaseTemplate."""
2438
-
2439
- id: Optional[str] = field(default=None, metadata=config(field_name="id"))
2440
- created_by_id: Optional[str] = field(
2441
- default=None, metadata=config(field_name="createdById")
2442
- )
2443
- created_at: Optional[str] = field(
2444
- default=None, metadata=config(field_name="createdAt")
2445
- )
2446
- updated_by_id: Optional[str] = field(
2447
- default=None, metadata=config(field_name="updatedById")
2448
- )
2449
- updated_at: Optional[str] = field(
2450
- default=None, metadata=config(field_name="updatedAt")
2451
- )
2452
- tenant_id: Optional[str] = field(
2453
- default=None, metadata=config(field_name="tenantId")
2454
- )
2455
- name: Optional[str] = field(default=None, metadata=config(field_name="name"))
2456
- title: Optional[str] = field(default=None, metadata=config(field_name="title"))
2457
- description: Optional[str] = field(
2458
- default=None, metadata=config(field_name="description")
2459
- )
2460
- tags: Optional[List[str]] = field(default=None, metadata=config(field_name="tags"))
2461
- case_type: Optional[str] = field(
2462
- default=None, metadata=config(field_name="caseType")
2463
- )
2464
- case_priority: Optional[str] = field(
2465
- default=None, metadata=config(field_name="casePriority")
2466
- )
2467
- case_title: Optional[str] = field(
2468
- default=None, metadata=config(field_name="caseTitle")
2469
- )
2470
- case_tags: Optional[List[str]] = field(
2471
- default=None, metadata=config(field_name="caseTags")
2472
- )
2473
- case_key_findings: Optional[str] = field(
2474
- default=None, metadata=config(field_name="caseKeyFindings")
2475
- )
2476
- case_key_findings_prompts: Optional[List[str]] = field(
2477
- default=None, metadata=config(field_name="caseKeyFindingsPrompts")
2478
- )
2479
- case_assignee: Optional[str] = field(
2480
- default=None, metadata=config(field_name="caseAssignee")
2481
- )
2482
- case_secondary_status: Optional[str] = field(
2483
- default=None, metadata=config(field_name="caseSecondaryStatus")
2484
- )
2485
- created_by_subject: Optional[Subject] = field(
2486
- default=None, metadata=config(field_name="createdBySubject")
2487
- )
2488
- updated_by_subject: Optional[Subject] = field(
2489
- default=None, metadata=config(field_name="updatedBySubject")
2490
- )
2491
- case_assignee_subject: Optional[Subject] = field(
2492
- default=None, metadata=config(field_name="caseAssigneeSubject")
2493
- )
2494
-
2495
-
2496
2434
  @dataclass_json
2497
2435
  @dataclass(order=True, eq=True, frozen=True)
2498
2436
  class CaseProcessingStatus:
@@ -2793,6 +2731,79 @@ class CaseEvidence:
2793
2731
  )
2794
2732
 
2795
2733
 
2734
+ @dataclass_json
2735
+ @dataclass(order=True, eq=True, frozen=True)
2736
+ class CaseTemplate:
2737
+ """CaseTemplate."""
2738
+
2739
+ id: Optional[str] = field(default=None, metadata=config(field_name="id"))
2740
+ created_by_id: Optional[str] = field(
2741
+ default=None, metadata=config(field_name="createdById")
2742
+ )
2743
+ created_at: Optional[str] = field(
2744
+ default=None, metadata=config(field_name="createdAt")
2745
+ )
2746
+ updated_by_id: Optional[str] = field(
2747
+ default=None, metadata=config(field_name="updatedById")
2748
+ )
2749
+ updated_at: Optional[str] = field(
2750
+ default=None, metadata=config(field_name="updatedAt")
2751
+ )
2752
+ tenant_id: Optional[str] = field(
2753
+ default=None, metadata=config(field_name="tenantId")
2754
+ )
2755
+ name: Optional[str] = field(default=None, metadata=config(field_name="name"))
2756
+ title: Optional[str] = field(default=None, metadata=config(field_name="title"))
2757
+ description: Optional[str] = field(
2758
+ default=None, metadata=config(field_name="description")
2759
+ )
2760
+ tags: Optional[List[str]] = field(default=None, metadata=config(field_name="tags"))
2761
+ case_type: Optional[str] = field(
2762
+ default=None, metadata=config(field_name="caseType")
2763
+ )
2764
+ case_priority: Optional[str] = field(
2765
+ default=None, metadata=config(field_name="casePriority")
2766
+ )
2767
+ case_title: Optional[str] = field(
2768
+ default=None, metadata=config(field_name="caseTitle")
2769
+ )
2770
+ case_tags: Optional[List[str]] = field(
2771
+ default=None, metadata=config(field_name="caseTags")
2772
+ )
2773
+ case_key_findings: Optional[str] = field(
2774
+ default=None, metadata=config(field_name="caseKeyFindings")
2775
+ )
2776
+ case_key_findings_prompts: Optional[List[str]] = field(
2777
+ default=None, metadata=config(field_name="caseKeyFindingsPrompts")
2778
+ )
2779
+ case_assignee: Optional[str] = field(
2780
+ default=None, metadata=config(field_name="caseAssignee")
2781
+ )
2782
+ case_secondary_status: Optional[str] = field(
2783
+ default=None, metadata=config(field_name="caseSecondaryStatus")
2784
+ )
2785
+ is_shared_with_child_tenants: Optional[bool] = field(
2786
+ default=None, metadata=config(field_name="isSharedWithChildTenants")
2787
+ )
2788
+ created_by_subject: Optional[Subject] = field(
2789
+ default=None, metadata=config(field_name="createdBySubject")
2790
+ )
2791
+ updated_by_subject: Optional[Subject] = field(
2792
+ default=None, metadata=config(field_name="updatedBySubject")
2793
+ )
2794
+ case_assignee_subject: Optional[Subject] = field(
2795
+ default=None, metadata=config(field_name="caseAssigneeSubject")
2796
+ )
2797
+ usages: Optional[List[Union[TemplateUsage, TaegisEnum]]] = field(
2798
+ default=None,
2799
+ metadata=config(
2800
+ encoder=encode_enum,
2801
+ decoder=lambda x: decode_enum(TemplateUsage, x),
2802
+ field_name="usages",
2803
+ ),
2804
+ )
2805
+
2806
+
2796
2807
  @dataclass_json
2797
2808
  @dataclass(order=True, eq=True, frozen=True)
2798
2809
  class CaseRule:
@@ -133,6 +133,9 @@ class MappedTenant:
133
133
  xdr_ownership: Optional[str] = field(
134
134
  default=None, metadata=config(field_name="xdrOwnership")
135
135
  )
136
+ hydrate_to: Optional[str] = field(
137
+ default=None, metadata=config(field_name="hydrateTo")
138
+ )
136
139
  last_refresh: Optional[str] = field(
137
140
  default=None, metadata=config(field_name="lastRefresh")
138
141
  )