scalekit-sdk-python 2.6.0__tar.gz → 2.7.1__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 (241) hide show
  1. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/PKG-INFO +3 -3
  2. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/_version.py +1 -1
  3. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/__init__.py +0 -1
  4. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/actions.py +50 -14
  5. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/requests/create_connected_account_request.py +1 -10
  6. scalekit_sdk_python-2.7.1/scalekit/actions/models/responses/verify_connected_account_user_response.py +41 -0
  7. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/types.py +2 -0
  8. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/client.py +28 -31
  9. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/connected_accounts.py +54 -4
  10. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/core.py +2 -1
  11. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/directory.py +8 -14
  12. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/organization.py +19 -1
  13. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/role.py +46 -1
  14. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/token.py +43 -0
  15. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/users.py +77 -2
  16. scalekit_sdk_python-2.7.1/scalekit/v1/auditlogs/auditlogs_pb2.py +51 -0
  17. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +1 -0
  18. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/totp_pb2.py +6 -6
  19. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/clients/clients_pb2.py +87 -87
  20. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +72 -56
  21. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +22 -2
  22. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +34 -0
  23. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connections/connections_pb2.py +142 -120
  24. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connections/connections_pb2.pyi +30 -2
  25. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connections/connections_pb2_grpc.py +66 -0
  26. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/directories/directories_pb2.py +29 -11
  27. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/directories/directories_pb2.pyi +24 -0
  28. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/directories/directories_pb2_grpc.py +66 -0
  29. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/emails/emails_pb2.py +16 -16
  30. scalekit_sdk_python-2.7.1/scalekit/v1/environments/environments_pb2.py +408 -0
  31. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/environments/environments_pb2.pyi +90 -2
  32. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/environments/environments_pb2_grpc.py +132 -0
  33. scalekit_sdk_python-2.7.1/scalekit/v1/keys/keys_pb2.py +111 -0
  34. scalekit_sdk_python-2.7.1/scalekit/v1/keys/keys_pb2.pyi +178 -0
  35. scalekit_sdk_python-2.7.1/scalekit/v1/keys/keys_pb2_grpc.py +386 -0
  36. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/members/members_pb2.py +8 -8
  37. scalekit_sdk_python-2.7.1/scalekit/v1/migrations/migrations_pb2.py +90 -0
  38. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/migrations/migrations_pb2.pyi +12 -0
  39. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/migrations/migrations_pb2_grpc.py +33 -0
  40. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/organizations/organizations_pb2.py +4 -2
  41. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/organizations/organizations_pb2_grpc.py +33 -0
  42. scalekit_sdk_python-2.7.1/scalekit/v1/providers/providers_pb2.py +160 -0
  43. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/providers/providers_pb2.pyi +65 -4
  44. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/providers/providers_pb2_grpc.py +99 -0
  45. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tools/tools_pb2.py +42 -24
  46. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tools/tools_pb2.pyi +22 -0
  47. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tools/tools_pb2_grpc.py +33 -0
  48. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/users/users_pb2.py +63 -63
  49. scalekit_sdk_python-2.7.1/scalekit/v1/workspaces/__init__.py +0 -0
  50. scalekit_sdk_python-2.7.1/scalekit/v1/workspaces/workspaces_pb2.py +269 -0
  51. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/workspaces/workspaces_pb2.pyi +48 -2
  52. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +133 -0
  53. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit_sdk_python.egg-info/PKG-INFO +3 -3
  54. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit_sdk_python.egg-info/SOURCES.txt +6 -19
  55. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit_sdk_python.egg-info/requires.txt +2 -2
  56. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/setup.py +3 -3
  57. scalekit_sdk_python-2.6.0/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -50
  58. scalekit_sdk_python-2.6.0/scalekit/v1/environments/environments_pb2.py +0 -347
  59. scalekit_sdk_python-2.6.0/scalekit/v1/migrations/migrations_pb2.py +0 -84
  60. scalekit_sdk_python-2.6.0/scalekit/v1/providers/providers_pb2.py +0 -110
  61. scalekit_sdk_python-2.6.0/scalekit/v1/workspaces/workspaces_pb2.py +0 -243
  62. scalekit_sdk_python-2.6.0/tests/basetest.py +0 -17
  63. scalekit_sdk_python-2.6.0/tests/test_actions.py +0 -1923
  64. scalekit_sdk_python-2.6.0/tests/test_connected_accounts.py +0 -417
  65. scalekit_sdk_python-2.6.0/tests/test_connection.py +0 -100
  66. scalekit_sdk_python-2.6.0/tests/test_directory.py +0 -133
  67. scalekit_sdk_python-2.6.0/tests/test_domain.py +0 -195
  68. scalekit_sdk_python-2.6.0/tests/test_m2m_client.py +0 -404
  69. scalekit_sdk_python-2.6.0/tests/test_mcp.py +0 -156
  70. scalekit_sdk_python-2.6.0/tests/test_org_roles.py +0 -121
  71. scalekit_sdk_python-2.6.0/tests/test_organization.py +0 -183
  72. scalekit_sdk_python-2.6.0/tests/test_passwordless.py +0 -242
  73. scalekit_sdk_python-2.6.0/tests/test_permissions.py +0 -331
  74. scalekit_sdk_python-2.6.0/tests/test_roles.py +0 -384
  75. scalekit_sdk_python-2.6.0/tests/test_sessions.py +0 -192
  76. scalekit_sdk_python-2.6.0/tests/test_tokens.py +0 -234
  77. scalekit_sdk_python-2.6.0/tests/test_tools.py +0 -117
  78. scalekit_sdk_python-2.6.0/tests/test_users.py +0 -557
  79. scalekit_sdk_python-2.6.0/tests/test_webauthn_credentials.py +0 -113
  80. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/LICENSE +0 -0
  81. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/README.md +0 -0
  82. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/__init__.py +0 -0
  83. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/__init__.py +0 -0
  84. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/expression_pb2.py +0 -0
  85. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/expression_pb2.pyi +0 -0
  86. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/expression_pb2_grpc.py +0 -0
  87. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/priv/__init__.py +0 -0
  88. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/priv/private_pb2.py +0 -0
  89. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/priv/private_pb2.pyi +0 -0
  90. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/priv/private_pb2_grpc.py +0 -0
  91. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/validate_pb2.py +0 -0
  92. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/validate_pb2.pyi +0 -0
  93. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/buf/validate/validate_pb2_grpc.py +0 -0
  94. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/pyproject.toml +0 -0
  95. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/__init__.py +0 -0
  96. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/__init__.py +0 -0
  97. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/google_adk.py +0 -0
  98. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/langchain.py +0 -0
  99. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/types/__init__.py +0 -0
  100. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
  101. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/frameworks/util.py +0 -0
  102. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/__init__.py +0 -0
  103. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/mcp_config.py +0 -0
  104. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/mcp_instance.py +0 -0
  105. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/requests/__init__.py +0 -0
  106. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/requests/mcp_request.py +0 -0
  107. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/requests/tool_request.py +0 -0
  108. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
  109. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/__init__.py +0 -0
  110. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
  111. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
  112. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
  113. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
  114. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
  115. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
  116. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
  117. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
  118. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
  119. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
  120. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
  121. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
  122. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
  123. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
  124. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
  125. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/magic_link_response.py +0 -0
  126. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
  127. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
  128. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
  129. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/tool_input_output.py +0 -0
  130. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/models/tool_mapping.py +0 -0
  131. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/actions/modifier.py +0 -0
  132. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/auth.py +0 -0
  133. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/common/__init__.py +0 -0
  134. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/common/exceptions.py +0 -0
  135. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/common/scalekit.py +0 -0
  136. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/common/user.py +0 -0
  137. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/connection.py +0 -0
  138. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/constants/__init__.py +0 -0
  139. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/constants/user.py +0 -0
  140. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/domain.py +0 -0
  141. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/m2m_client.py +0 -0
  142. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/mcp.py +0 -0
  143. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/passwordless.py +0 -0
  144. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/permissions.py +0 -0
  145. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/sessions.py +0 -0
  146. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/tools.py +0 -0
  147. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/utils/__init__.py +0 -0
  148. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/utils/directory.py +0 -0
  149. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/__init__.py +0 -0
  150. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auditlogs/__init__.py +0 -0
  151. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
  152. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/__init__.py +0 -0
  153. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/auth_pb2.py +0 -0
  154. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/auth_pb2.pyi +0 -0
  155. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/auth_pb2_grpc.py +0 -0
  156. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/passwordless_pb2.py +0 -0
  157. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
  158. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
  159. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/totp_pb2.pyi +0 -0
  160. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
  161. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/webauthn_pb2.py +0 -0
  162. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
  163. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
  164. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/clients/__init__.py +0 -0
  165. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/clients/clients_pb2.pyi +0 -0
  166. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/clients/clients_pb2_grpc.py +0 -0
  167. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/commons/__init__.py +0 -0
  168. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/commons/commons_pb2.py +0 -0
  169. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/commons/commons_pb2.pyi +0 -0
  170. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
  171. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connected_accounts/__init__.py +0 -0
  172. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/connections/__init__.py +0 -0
  173. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/directories/__init__.py +0 -0
  174. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/domains/__init__.py +0 -0
  175. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/domains/domains_pb2.py +0 -0
  176. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/domains/domains_pb2.pyi +0 -0
  177. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
  178. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/emails/__init__.py +0 -0
  179. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/emails/emails_pb2.pyi +0 -0
  180. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
  181. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/environments/__init__.py +0 -0
  182. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/errdetails/__init__.py +0 -0
  183. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
  184. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
  185. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
  186. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/events/__init__.py +0 -0
  187. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/events/events_pb2.py +0 -0
  188. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/events/events_pb2.pyi +0 -0
  189. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/events/events_pb2_grpc.py +0 -0
  190. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/interceptors/__init__.py +0 -0
  191. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/interceptors/interceptors_pb2.py +0 -0
  192. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
  193. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
  194. {scalekit_sdk_python-2.6.0/scalekit/v1/mcp → scalekit_sdk_python-2.7.1/scalekit/v1/keys}/__init__.py +0 -0
  195. {scalekit_sdk_python-2.6.0/scalekit/v1/members → scalekit_sdk_python-2.7.1/scalekit/v1/mcp}/__init__.py +0 -0
  196. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/mcp/mcp_pb2.py +0 -0
  197. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
  198. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
  199. {scalekit_sdk_python-2.6.0/scalekit/v1/migrations → scalekit_sdk_python-2.7.1/scalekit/v1/members}/__init__.py +0 -0
  200. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/members/members_pb2.pyi +0 -0
  201. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/members/members_pb2_grpc.py +0 -0
  202. {scalekit_sdk_python-2.6.0/scalekit/v1/options → scalekit_sdk_python-2.7.1/scalekit/v1/migrations}/__init__.py +0 -0
  203. {scalekit_sdk_python-2.6.0/scalekit/v1/organizations → scalekit_sdk_python-2.7.1/scalekit/v1/options}/__init__.py +0 -0
  204. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/options/options_pb2.py +0 -0
  205. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/options/options_pb2.pyi +0 -0
  206. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/options/options_pb2_grpc.py +0 -0
  207. {scalekit_sdk_python-2.6.0/scalekit/v1/providers → scalekit_sdk_python-2.7.1/scalekit/v1/organizations}/__init__.py +0 -0
  208. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
  209. {scalekit_sdk_python-2.6.0/scalekit/v1/roles → scalekit_sdk_python-2.7.1/scalekit/v1/providers}/__init__.py +0 -0
  210. {scalekit_sdk_python-2.6.0/scalekit/v1/secrets → scalekit_sdk_python-2.7.1/scalekit/v1/roles}/__init__.py +0 -0
  211. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/roles/roles_pb2.py +0 -0
  212. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/roles/roles_pb2.pyi +0 -0
  213. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
  214. {scalekit_sdk_python-2.6.0/scalekit/v1/sessions → scalekit_sdk_python-2.7.1/scalekit/v1/secrets}/__init__.py +0 -0
  215. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/secrets/secrets_pb2.py +0 -0
  216. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
  217. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
  218. {scalekit_sdk_python-2.6.0/scalekit/v1/tokens → scalekit_sdk_python-2.7.1/scalekit/v1/sessions}/__init__.py +0 -0
  219. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/sessions/sessions_pb2.py +0 -0
  220. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
  221. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
  222. {scalekit_sdk_python-2.6.0/scalekit/v1/tools → scalekit_sdk_python-2.7.1/scalekit/v1/tokens}/__init__.py +0 -0
  223. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tokens/tokens_pb2.py +0 -0
  224. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
  225. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
  226. {scalekit_sdk_python-2.6.0/scalekit/v1/user_attributes → scalekit_sdk_python-2.7.1/scalekit/v1/tools}/__init__.py +0 -0
  227. {scalekit_sdk_python-2.6.0/scalekit/v1/users → scalekit_sdk_python-2.7.1/scalekit/v1/user_attributes}/__init__.py +0 -0
  228. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/user_attributes/user_attributes_pb2.py +0 -0
  229. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
  230. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
  231. {scalekit_sdk_python-2.6.0/scalekit/v1/webhooks → scalekit_sdk_python-2.7.1/scalekit/v1/users}/__init__.py +0 -0
  232. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/users/users_pb2.pyi +0 -0
  233. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/users/users_pb2_grpc.py +0 -0
  234. {scalekit_sdk_python-2.6.0/scalekit/v1/workspaces → scalekit_sdk_python-2.7.1/scalekit/v1/webhooks}/__init__.py +0 -0
  235. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/webhooks/webhooks_pb2.py +0 -0
  236. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
  237. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
  238. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit/webauthn.py +0 -0
  239. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
  240. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
  241. {scalekit_sdk_python-2.6.0 → scalekit_sdk_python-2.7.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.6.0
3
+ Version: 2.7.1
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -15,9 +15,9 @@ Requires-Dist: grpcio>=1.64.1
15
15
  Requires-Dist: protobuf<7.0.0,>=5.29.5
16
16
  Requires-Dist: google>=3.0
17
17
  Requires-Dist: requests>=2.32.3
18
- Requires-Dist: PyJWT<2.11,>=2.8
18
+ Requires-Dist: PyJWT>=2.12.0
19
19
  Requires-Dist: cffi>=1.15.1
20
- Requires-Dist: cryptography<47,==46.0.5
20
+ Requires-Dist: cryptography<47,==46.0.6
21
21
  Requires-Dist: setuptools<81.0,>=78.1.1
22
22
  Requires-Dist: grpcio-status<1.67,>=1.64
23
23
  Requires-Dist: protoc-gen-openapiv2>=0.0.1
@@ -1,3 +1,3 @@
1
1
  # Single source of truth for the SDK version.
2
2
  # Import this in setup.py and scalekit/core.py — never hardcode the version elsewhere.
3
- __version__ = "2.6.0"
3
+ __version__ = "2.7.1"
@@ -1,5 +1,4 @@
1
1
  from .actions import ActionClient
2
- from .models import *
3
2
 
4
3
  __all__ = [
5
4
  'ActionClient',
@@ -3,7 +3,7 @@ import requests
3
3
  from scalekit.actions.types import ToolRequest,ExecuteToolResponse,MagicLinkResponse,ListConnectedAccountsResponse,DeleteConnectedAccountResponse,GetConnectedAccountAuthResponse,ToolInput, \
4
4
  UpdateConnectedAccountResponse,CreateMcpConfigResponse,ListMcpConfigsResponse,UpdateMcpConfigResponse,DeleteMcpConfigResponse, \
5
5
  EnsureMcpInstanceResponse,UpdateMcpInstanceResponse,GetMcpInstanceResponse,ListMcpInstancesResponse,DeleteMcpInstanceResponse,GetMcpInstanceAuthStateResponse, \
6
- McpConfig,McpConfigConnectionToolMapping
6
+ McpConfig,McpConfigConnectionToolMapping,VerifyConnectedAccountUserResponse
7
7
  from scalekit.actions.models.responses.create_connected_account_response import CreateConnectedAccountResponse
8
8
  from scalekit.actions.models.requests.create_connected_account_request import CreateConnectedAccountRequest
9
9
  from scalekit.actions.models.requests.update_connected_account_request import UpdateConnectedAccountRequest
@@ -143,18 +143,24 @@ class ActionClient:
143
143
  identifier: Optional[str] = None,
144
144
  connection_name: Optional[str] = None,
145
145
  connected_account_id: Optional[str] = None,
146
+ state: Optional[str] = None,
147
+ user_verify_url: Optional[str] = None,
146
148
  **kwargs
147
149
  ) -> MagicLinkResponse:
148
150
  """
149
151
  Get authorization magic link for a connected account
150
-
152
+
151
153
  :param connection_name: Connector identifier
152
154
  :type: str
153
155
  :param identifier: Connected account identifier
154
156
  :type: str
155
157
  :param connected_account_id: Connected account ID (optional)
156
158
  :type: str
157
-
159
+ :param state: Opaque state value passed through to the user verify redirect URL query params (optional)
160
+ :type: str
161
+ :param user_verify_url: B2B app's user verify redirect URL (optional)
162
+ :type: str
163
+
158
164
  :returns:
159
165
  MagicLinkResponse containing magic link and expiry
160
166
  """
@@ -162,14 +168,47 @@ class ActionClient:
162
168
  result_tuple = self.connected_accounts.get_magic_link_for_connected_account(
163
169
  connector=connection_name,
164
170
  identifier=identifier,
165
- connected_account_id=connected_account_id
171
+ connected_account_id=connected_account_id,
172
+ state=state,
173
+ user_verify_url=user_verify_url
166
174
  )
167
-
175
+
168
176
  # Extract the response[0] (the actual GetMagicLinkForConnectedAccountResponse proto object)
169
177
  proto_response = result_tuple[0]
170
-
178
+
171
179
  # Convert proto to our MagicLinkResponse class
172
180
  return MagicLinkResponse.from_proto(proto_response)
181
+
182
+ def verify_connected_account_user(
183
+ self,
184
+ auth_request_id: str,
185
+ identifier: str,
186
+ ) -> VerifyConnectedAccountUserResponse:
187
+ """
188
+ Verify a connected account user after OAuth callback
189
+
190
+ :param auth_request_id: Auth request ID as base64url-encoded opaque token from the
191
+ user verify redirect URL query params
192
+ :type: str
193
+ :param identifier: Current logged in user's connected account identifier
194
+ :type: str
195
+
196
+ :returns:
197
+ VerifyConnectedAccountUserResponse containing the post-verification redirect URL
198
+ """
199
+ if not auth_request_id:
200
+ raise ValueError("auth_request_id is required")
201
+ if not identifier:
202
+ raise ValueError("identifier is required")
203
+
204
+ result_tuple = self.connected_accounts.verify_connected_account_user(
205
+ auth_request_id=auth_request_id,
206
+ identifier=identifier
207
+ )
208
+
209
+ proto_response = result_tuple[0]
210
+
211
+ return VerifyConnectedAccountUserResponse.from_proto(proto_response)
173
212
 
174
213
  def list_connected_accounts(
175
214
  self,
@@ -565,7 +604,7 @@ class ActionClient:
565
604
  self,
566
605
  connection_name: str,
567
606
  identifier: str,
568
- authorization_details: Dict[str, Any],
607
+ authorization_details: Optional[Dict[str, Any]] = None,
569
608
  organization_id: Optional[str] = None,
570
609
  user_id: Optional[str] = None,
571
610
  api_config: Optional[Dict[str, Any]] = None,
@@ -578,8 +617,8 @@ class ActionClient:
578
617
  :type: str
579
618
  :param identifier: Connected account identifier (required)
580
619
  :type: str
581
- :param authorization_details: Authorization details (OAuth token or static auth) (required)
582
- :type: Dict[str, Any]
620
+ :param authorization_details: Authorization details (OAuth token or static auth) (optional)
621
+ :type: Optional[Dict[str, Any]]
583
622
  :param organization_id: Organization ID (optional)
584
623
  :type: str
585
624
  :param user_id: User ID (optional)
@@ -641,7 +680,7 @@ class ActionClient:
641
680
  :type: str
642
681
  :param identifier: Connected account identifier (required)
643
682
  :type: str
644
- :param authorization_details: Authorization details (OAuth token or static auth) (optional, empty auth will be used if not provided)
683
+ :param authorization_details: Authorization details (OAuth token or static auth) (optional)
645
684
  :type: Optional[Dict[str, Any]]
646
685
  :param organization_id: Organization ID (optional)
647
686
  :type: str
@@ -672,13 +711,10 @@ class ActionClient:
672
711
 
673
712
  except ScalekitNotFoundException:
674
713
  # Connected account doesn't exist, create a new one
675
- # Use empty authorization details if none provided
676
- auth_details = authorization_details if authorization_details is not None else {}
677
-
678
714
  return self.create_connected_account(
679
715
  connection_name=connection_name,
680
716
  identifier=identifier,
681
- authorization_details=auth_details,
717
+ authorization_details=authorization_details,
682
718
  organization_id=organization_id,
683
719
  user_id=user_id,
684
720
  api_config=api_config
@@ -14,7 +14,7 @@ class CreateConnectedAccountRequest(BaseModel):
14
14
 
15
15
  connection_name: str = Field(..., description="Connector identifier")
16
16
  identifier: str = Field(..., description="Connected account identifier")
17
- authorization_details: Dict[str, Any] = Field(default_factory=dict, description="Authorization details (OAuth token or static auth)")
17
+ authorization_details: Optional[Dict[str, Any]] = Field(None, description="Authorization details (OAuth token or static auth)")
18
18
  organization_id: Optional[str] = Field(None, description="Organization ID")
19
19
  user_id: Optional[str] = Field(None, description="User ID")
20
20
  api_config: Optional[Dict[str, Any]] = Field(None, description="Optional API configuration for the connected account")
@@ -45,15 +45,6 @@ class CreateConnectedAccountRequest(BaseModel):
45
45
  static_auth = StaticAuth(details=struct_details)
46
46
  auth_details = AuthorizationDetails(static_auth=static_auth)
47
47
 
48
- elif not self.authorization_details:
49
- # Create empty OAuth token for empty authorization details
50
- oauth_token = OauthToken(
51
- access_token="",
52
- refresh_token="",
53
- scopes=[]
54
- )
55
- auth_details = AuthorizationDetails(oauth_token=oauth_token)
56
-
57
48
  # Handle api_config if provided
58
49
  api_config_struct = None
59
50
  if self.api_config:
@@ -0,0 +1,41 @@
1
+ from typing import Optional
2
+ from pydantic import BaseModel, Field
3
+
4
+
5
+ class VerifyConnectedAccountUserResponse(BaseModel):
6
+ """Verify connected account user response with one-to-one mapping to proto VerifyConnectedAccountUserResponse"""
7
+
8
+ post_user_verify_redirect_url: Optional[str] = Field(
9
+ None,
10
+ description="URL to redirect the user to after successful verification"
11
+ )
12
+
13
+ @classmethod
14
+ def from_proto(cls, proto_response) -> 'VerifyConnectedAccountUserResponse':
15
+ """
16
+ Create VerifyConnectedAccountUserResponse from protobuf VerifyConnectedAccountUserResponse
17
+
18
+ :param proto_response: The protobuf VerifyConnectedAccountUserResponse object
19
+ :type proto_response: VerifyConnectedAccountUserResponse (from connected_accounts_pb2)
20
+
21
+ :returns:
22
+ VerifyConnectedAccountUserResponse instance
23
+ """
24
+ return cls(
25
+ post_user_verify_redirect_url=proto_response.post_user_verify_redirect_url or None
26
+ )
27
+
28
+ def to_dict(self) -> dict:
29
+ """
30
+ Convert to dictionary representation
31
+
32
+ :returns:
33
+ Dictionary representation of the response
34
+ """
35
+ return {
36
+ "post_user_verify_redirect_url": self.post_user_verify_redirect_url
37
+ }
38
+
39
+ class Config:
40
+ """Pydantic configuration"""
41
+ validate_assignment = True
@@ -21,6 +21,7 @@ from .models.responses.update_mcp_config_response import UpdateMcpConfigResponse
21
21
  from .models.responses.update_mcp_instance_response import UpdateMcpInstanceResponse
22
22
  from .models.responses.delete_mcp_config_response import DeleteMcpConfigResponse
23
23
  from .models.responses.delete_mcp_instance_response import DeleteMcpInstanceResponse
24
+ from .models.responses.verify_connected_account_user_response import VerifyConnectedAccountUserResponse
24
25
  from .models.tool_input_output import ToolInput, ToolOutput
25
26
  from .models.tool_mapping import ToolMapping
26
27
  from .models.mcp_config import McpConfig, McpConfigConnectionToolMapping
@@ -58,4 +59,5 @@ __all__ = [
58
59
  'McpConfigConnectionToolMapping',
59
60
  'McpInstance',
60
61
  'McpInstanceConnectionAuthState',
62
+ 'VerifyConnectedAccountUserResponse',
61
63
  ]
@@ -83,8 +83,8 @@ class ScalekitClient:
83
83
  self.auth = AuthClient(self.core_client)
84
84
  self.webauthn = WebAuthnClient(self.core_client)
85
85
  self.tokens = TokenClient(self.core_client)
86
- except Exception as exp:
87
- raise exp
86
+ except Exception:
87
+ raise
88
88
 
89
89
  def get_authorization_url(
90
90
  self, redirect_uri: str, options: AuthorizationUrlOptions | None
@@ -123,8 +123,8 @@ class ScalekitClient:
123
123
  query_string = urlencode(valid_auth_params)
124
124
 
125
125
  return f"{self.core_client.env_url}/{AUTHORIZE_ENDPOINT}?{query_string}"
126
- except Exception as exp:
127
- raise exp
126
+ except Exception:
127
+ raise
128
128
 
129
129
  def authenticate_with_code(
130
130
  self, code, redirect_uri, options: CodeAuthenticationOptions
@@ -181,8 +181,8 @@ class ScalekitClient:
181
181
 
182
182
  except jwt.exceptions.InvalidTokenError as exp:
183
183
  raise ScalekitValidateTokenFailureException(exp)
184
- except Exception as exp:
185
- raise exp
184
+ except Exception:
185
+ raise
186
186
 
187
187
  def validate_access_token(self, token: str, options: Optional[TokenValidationOptions] = None, audience = None) -> bool:
188
188
  """
@@ -217,20 +217,17 @@ class ScalekitClient:
217
217
  :returns:
218
218
  access token
219
219
  """
220
- try:
221
- payload = {
222
- "grant_type": GrantType.ClientCredentials.value,
223
- "client_id": client_id,
224
- "client_secret": client_secret,
225
- }
226
- if scopes:
227
- payload["scope"] = " ".join(scopes)
220
+ payload = {
221
+ "grant_type": GrantType.ClientCredentials.value,
222
+ "client_id": client_id,
223
+ "client_secret": client_secret,
224
+ }
225
+ if scopes:
226
+ payload["scope"] = " ".join(scopes)
228
227
 
229
- response = self.core_client.authenticate(payload)
230
- response = json.loads(response.content)
231
- return response['access_token']
232
- except Exception as exp:
233
- raise exp
228
+ response = self.core_client.authenticate(payload)
229
+ response = json.loads(response.content)
230
+ return response['access_token']
234
231
 
235
232
  def get_client_access_token(self) -> str:
236
233
  """
@@ -266,8 +263,8 @@ class ScalekitClient:
266
263
  return claims
267
264
  except jwt.exceptions.InvalidTokenError as exp:
268
265
  raise ScalekitValidateTokenFailureException(exp)
269
- except Exception as exp:
270
- raise exp
266
+ except Exception:
267
+ raise
271
268
 
272
269
  def get_idp_initiated_login_claims(self, idp_initiated_login_token: str, options: Optional[TokenValidationOptions] = None, audience = None) -> IdpInitiatedLoginClaims:
273
270
  """
@@ -288,8 +285,8 @@ class ScalekitClient:
288
285
  return claims
289
286
  except jwt.exceptions.InvalidTokenError as exp:
290
287
  raise ScalekitValidateTokenFailureException(exp)
291
- except Exception as exp:
292
- raise exp
288
+ except Exception:
289
+ raise
293
290
 
294
291
  def validate_token(
295
292
  self, token: str, options: Optional[TokenValidationOptions] = None, audience: Optional[str] = None
@@ -411,13 +408,13 @@ class ScalekitClient:
411
408
 
412
409
  try:
413
410
  secret_bytes = base64.b64decode(secret_parts[1])
414
- except Exception as exp:
415
- raise exp
411
+ except Exception:
412
+ raise
416
413
 
417
414
  try:
418
415
  timestamp = self.__verify_timestamp(webhook_timestamp)
419
- except Exception as exp:
420
- raise exp
416
+ except Exception:
417
+ raise
421
418
 
422
419
  timestamp_str = str(floor(timestamp.replace(tzinfo=timezone.utc).timestamp()))
423
420
  data = f"{webhook_id}.{timestamp_str}.{payload}"
@@ -549,8 +546,8 @@ class ScalekitClient:
549
546
  "refresh_token": response["refresh_token"]
550
547
  }
551
548
 
552
- except Exception as exp:
553
- raise exp
549
+ except Exception:
550
+ raise
554
551
 
555
552
  def get_logout_url(self, options: LogoutUrlOptions) -> str:
556
553
  """
@@ -573,5 +570,5 @@ class ScalekitClient:
573
570
  query_string = urlencode(valid_params)
574
571
 
575
572
  return f"{self.core_client.env_url}/{LOGOUT_ENDPOINT}?{query_string}"
576
- except Exception as exp:
577
- raise exp
573
+ except Exception:
574
+ raise
@@ -1,7 +1,24 @@
1
1
  from typing import Optional
2
2
 
3
3
  from scalekit.core import CoreClient
4
- from scalekit.v1.connected_accounts.connected_accounts_pb2 import *
4
+ from scalekit.v1.connected_accounts.connected_accounts_pb2 import (
5
+ CreateConnectedAccount,
6
+ CreateConnectedAccountRequest,
7
+ CreateConnectedAccountResponse,
8
+ DeleteConnectedAccountRequest,
9
+ DeleteConnectedAccountResponse,
10
+ GetConnectedAccountByIdentifierRequest,
11
+ GetConnectedAccountByIdentifierResponse,
12
+ GetMagicLinkForConnectedAccountRequest,
13
+ GetMagicLinkForConnectedAccountResponse,
14
+ ListConnectedAccountsRequest,
15
+ ListConnectedAccountsResponse,
16
+ UpdateConnectedAccount,
17
+ UpdateConnectedAccountRequest,
18
+ UpdateConnectedAccountResponse,
19
+ VerifyConnectedAccountUserRequest,
20
+ VerifyConnectedAccountUserResponse,
21
+ )
5
22
  from scalekit.v1.connected_accounts.connected_accounts_pb2_grpc import ConnectedAccountServiceStub
6
23
 
7
24
 
@@ -184,7 +201,9 @@ class ConnectedAccountsClient:
184
201
  identifier: str,
185
202
  organization_id: Optional[str] = None,
186
203
  user_id: Optional[str] = None,
187
- connected_account_id: Optional[str] = None
204
+ connected_account_id: Optional[str] = None,
205
+ state: Optional[str] = None,
206
+ user_verify_url: Optional[str] = None
188
207
  ) -> GetMagicLinkForConnectedAccountResponse:
189
208
  """
190
209
  Method to get magic link for a connected account
@@ -199,6 +218,10 @@ class ConnectedAccountsClient:
199
218
  :type : ``` str ```
200
219
  :param connected_account_id : ID of the connected account
201
220
  :type : ``` str ```
221
+ :param state : Opaque state value passed through to the user verify redirect URL query params
222
+ :type : ``` str ```
223
+ :param user_verify_url : B2B app's user verify redirect URL
224
+ :type : ``` str ```
202
225
 
203
226
  :returns:
204
227
  Get Magic Link For Connected Account Response
@@ -210,7 +233,9 @@ class ConnectedAccountsClient:
210
233
  user_id=user_id,
211
234
  connector=connector,
212
235
  identifier=identifier,
213
- id=connected_account_id
236
+ id=connected_account_id,
237
+ state=state,
238
+ user_verify_url=user_verify_url
214
239
  ),
215
240
  )
216
241
 
@@ -248,4 +273,29 @@ class ConnectedAccountsClient:
248
273
  identifier=identifier,
249
274
  id=connected_account_id
250
275
  ),
251
- )
276
+ )
277
+
278
+ def verify_connected_account_user(
279
+ self,
280
+ auth_request_id: str,
281
+ identifier: str
282
+ ) -> VerifyConnectedAccountUserResponse:
283
+ """
284
+ Method to verify a connected account user after OAuth callback
285
+
286
+ :param auth_request_id : Auth request ID as base64url-encoded opaque token from the
287
+ user verify redirect URL query params
288
+ :type : ``` str ```
289
+ :param identifier : Current logged in user's connected account identifier
290
+ :type : ``` str ```
291
+
292
+ :returns:
293
+ Verify Connected Account User Response
294
+ """
295
+ return self.core_client.grpc_exec(
296
+ self.connected_accounts_service.VerifyConnectedAccountUser.with_call,
297
+ VerifyConnectedAccountUserRequest(
298
+ auth_request_id=auth_request_id,
299
+ identifier=identifier
300
+ ),
301
+ )
@@ -28,7 +28,8 @@ class CoreClient:
28
28
  """Class definition for Core Client"""
29
29
 
30
30
  sdk_version = f"Scalekit-Python/{_sdk_version}"
31
- api_version = "20260310"
31
+ # YYYYMMDD
32
+ api_version = "20260403"
32
33
  user_agent = f"{sdk_version} Python/{platform.python_version()} ({platform.system()}; {platform.architecture()}"
33
34
 
34
35
  def __init__(self, env_url, client_id, client_secret):
@@ -117,14 +117,11 @@ class DirectoryClient:
117
117
  dir_user.emails = user.emails
118
118
  dir_user.groups = user.groups
119
119
  dir_user.user_detail = MessageToJson(user.user_detail)
120
+ user_response[0].users.append(dir_user)
120
121
 
121
- if not hasattr(user_response[0], 'users'):
122
- user_response[0].users = [dir_user]
123
- else:
124
- user_response[0].users.append(dir_user)
125
- user_response[0].total_size = response[0].total_size
126
- user_response[0].next_page_token = response[0].next_page_token
127
- user_response[0].prev_page_token = response[0].prev_page_token
122
+ user_response[0].total_size = response[0].total_size
123
+ user_response[0].next_page_token = response[0].next_page_token
124
+ user_response[0].prev_page_token = response[0].prev_page_token
128
125
 
129
126
  return user_response
130
127
 
@@ -177,14 +174,11 @@ class DirectoryClient:
177
174
  dir_group.updated_at = group.updated_at
178
175
  dir_group.group_detail = MessageToJson(group.group_detail)
179
176
 
180
- if not hasattr(group_response, 'users'):
181
- group_response[0].groups = [dir_group]
182
- else:
183
- group_response[0].groups.append(dir_group)
177
+ group_response[0].groups.append(dir_group)
184
178
 
185
- group_response[0].total_size = response[0].total_size
186
- group_response[0].next_page_token = response[0].next_page_token
187
- group_response[0].prev_page_token = response[0].prev_page_token
179
+ group_response[0].total_size = response[0].total_size
180
+ group_response[0].next_page_token = response[0].next_page_token
181
+ group_response[0].prev_page_token = response[0].prev_page_token
188
182
 
189
183
  return group_response
190
184
 
@@ -2,7 +2,25 @@ from typing import Optional, List, Dict
2
2
 
3
3
  from google.protobuf import wrappers_pb2
4
4
  from scalekit.core import CoreClient
5
- from scalekit.v1.organizations.organizations_pb2 import *
5
+ from scalekit.v1.organizations.organizations_pb2 import (
6
+ ListOrganizationsRequest,
7
+ ListOrganizationsResponse,
8
+ CreateOrganization,
9
+ CreateOrganizationRequest,
10
+ CreateOrganizationResponse,
11
+ UpdateOrganization,
12
+ UpdateOrganizationRequest,
13
+ UpdateOrganizationResponse,
14
+ GetOrganizationRequest,
15
+ GetOrganizationResponse,
16
+ DeleteOrganizationRequest,
17
+ Feature,
18
+ GeneratePortalLinkRequest,
19
+ GeneratePortalLinkResponse,
20
+ UpdateOrganizationSettingsRequest,
21
+ OrganizationUserManagementSettings,
22
+ UpsertUserManagementSettingsRequest,
23
+ )
6
24
  from scalekit.v1.organizations.organizations_pb2_grpc import OrganizationServiceStub
7
25
 
8
26
 
@@ -329,7 +329,7 @@ class RoleClient:
329
329
  )
330
330
 
331
331
  def delete_organization_role_base(
332
- self,
332
+ self,
333
333
  org_id: str,
334
334
  role_name: str
335
335
  ):
@@ -351,3 +351,48 @@ class RoleClient:
351
351
  role_name=role_name
352
352
  ),
353
353
  )
354
+
355
+ def update_default_roles(
356
+ self,
357
+ default_creator_role: Optional[str] = None,
358
+ default_member_role: Optional[str] = None,
359
+ ) -> UpdateDefaultRolesResponse:
360
+ """
361
+ Method to update default environment-level roles
362
+
363
+ Both default_creator_role and default_member_role must be provided.
364
+
365
+ :param default_creator_role : Name of the role to set as default creator role
366
+ :type : ``` str ```
367
+ :param default_member_role : Name of the role to set as default member role
368
+ :type : ``` str ```
369
+
370
+ :returns:
371
+ Update Default Roles Response
372
+ """
373
+ if not default_creator_role:
374
+ raise ValueError("default_creator_role is required")
375
+ if not default_member_role:
376
+ raise ValueError("default_member_role is required")
377
+ req = UpdateDefaultRolesRequest()
378
+ req.default_creator_role = default_creator_role
379
+ req.default_member_role = default_member_role
380
+ return self.core_client.grpc_exec(
381
+ self.role_service.UpdateDefaultRoles.with_call,
382
+ req,
383
+ )
384
+
385
+ def list_dependent_roles(self, role_name: str) -> ListDependentRolesResponse:
386
+ """
387
+ Method to list roles that directly extend (depend on) the specified base role
388
+
389
+ :param role_name : Name of the base role
390
+ :type : ``` str ```
391
+
392
+ :returns:
393
+ List Dependent Roles Response
394
+ """
395
+ return self.core_client.grpc_exec(
396
+ self.role_service.ListDependentRoles.with_call,
397
+ ListDependentRolesRequest(role_name=role_name),
398
+ )
@@ -13,6 +13,8 @@ from scalekit.v1.tokens.tokens_pb2 import (
13
13
  InvalidateTokenRequest,
14
14
  ListTokensRequest,
15
15
  ListTokensResponse,
16
+ UpdateTokenRequest,
17
+ UpdateTokenResponse,
16
18
  )
17
19
  from scalekit.v1.tokens.tokens_pb2_grpc import ApiTokenServiceStub
18
20
 
@@ -121,6 +123,47 @@ class TokenClient:
121
123
  InvalidateTokenRequest(token=token),
122
124
  )
123
125
 
126
+ def update_token(
127
+ self,
128
+ token: str,
129
+ custom_claims: Optional[Dict[str, str]] = None,
130
+ description: Optional[str] = None,
131
+ ) -> UpdateTokenResponse:
132
+ """
133
+ Method to update the custom claims and/or description of an existing API token
134
+
135
+ Custom claims are merged into the existing set. To remove a claim, set its value to an empty string.
136
+
137
+ :param token : Opaque token string or token_id (apit_xxxxx)
138
+ :type : ``` str ```
139
+ :param custom_claims : Claims to merge; set value to "" to remove a claim
140
+ :type : ``` dict[str, str] ```
141
+ :param description : Replacement description; empty string clears it
142
+ :type : ``` str ```
143
+ :returns:
144
+ UpdateTokenResponse with updated token_info
145
+ """
146
+ if not token:
147
+ raise ValueError("Invalid token")
148
+ request = UpdateTokenRequest(token=token)
149
+ if custom_claims is not None:
150
+ # Fetch current token to get existing claims for merge
151
+ current = self.validate_token(token)
152
+ merged_claims = dict(current.token_info.custom_claims)
153
+ # Apply updates and removals (empty string means remove)
154
+ for key, value in custom_claims.items():
155
+ if value == "":
156
+ merged_claims.pop(key, None)
157
+ else:
158
+ merged_claims[key] = value
159
+ request.custom_claims.update(merged_claims)
160
+ if description is not None:
161
+ request.description = description
162
+ return self.core_client.grpc_exec(
163
+ self.token_service.UpdateToken,
164
+ request,
165
+ )
166
+
124
167
  def list_tokens(
125
168
  self,
126
169
  organization_id: str,