scalekit-sdk-python 2.18.0__tar.gz → 2.19.0__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 (301) hide show
  1. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/PKG-INFO +1 -1
  2. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/_version.py +1 -1
  3. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/actions.py +82 -3
  4. scalekit_sdk_python-2.19.0/scalekit/actions/models/responses/list_tools_response.py +165 -0
  5. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/types.py +3 -0
  6. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/client.py +28 -1
  7. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/common/exceptions.py +39 -5
  8. scalekit_sdk_python-2.19.0/scalekit/core.py +508 -0
  9. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/tools.py +49 -1
  10. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.py +3 -3
  11. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.py +4 -4
  12. scalekit_sdk_python-2.19.0/scalekit/v1/auditlogs/auditlogs_pb2.py +115 -0
  13. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/auth_pb2.py +55 -47
  14. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/auth_pb2.pyi +14 -4
  15. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/auth_pb2_grpc.py +3 -3
  16. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/webauthn_pb2.py +4 -4
  17. scalekit_sdk_python-2.19.0/scalekit/v1/billing/billing_pb2.py +135 -0
  18. scalekit_sdk_python-2.19.0/scalekit/v1/billing/billing_pb2.pyi +307 -0
  19. scalekit_sdk_python-2.19.0/scalekit/v1/billing/billing_pb2_grpc.py +263 -0
  20. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/clients/clients_pb2.py +212 -178
  21. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/clients/clients_pb2.pyi +40 -2
  22. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/clients/clients_pb2_grpc.py +119 -0
  23. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/commons/commons_pb2.py +38 -37
  24. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/commons/commons_pb2.pyi +1 -0
  25. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +104 -78
  26. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +34 -6
  27. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +34 -0
  28. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connections/connections_pb2.py +182 -166
  29. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connections/connections_pb2.pyi +31 -8
  30. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/directories/directories_pb2.py +20 -20
  31. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/domains/domains_pb2.py +8 -8
  32. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/emails/emails_pb2.py +19 -19
  33. scalekit_sdk_python-2.19.0/scalekit/v1/environments/environments_pb2.py +451 -0
  34. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/environments/environments_pb2.pyi +13 -4
  35. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/events/events_pb2.py +4 -4
  36. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/gateway/gateway_pb2.py +19 -19
  37. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/interceptors/interceptors_pb2.py +17 -17
  38. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/keys/keys_pb2.py +11 -11
  39. scalekit_sdk_python-2.19.0/scalekit/v1/logstreams/logstreams_pb2.py +155 -0
  40. scalekit_sdk_python-2.19.0/scalekit/v1/logstreams/logstreams_pb2.pyi +288 -0
  41. scalekit_sdk_python-2.19.0/scalekit/v1/logstreams/logstreams_pb2_grpc.py +346 -0
  42. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/mcp/mcp_pb2.py +19 -19
  43. scalekit_sdk_python-2.19.0/scalekit/v1/members/members_pb2.py +273 -0
  44. scalekit_sdk_python-2.19.0/scalekit/v1/members/members_pb2.pyi +324 -0
  45. scalekit_sdk_python-2.19.0/scalekit/v1/members/members_pb2_grpc.py +622 -0
  46. scalekit_sdk_python-2.19.0/scalekit/v1/migrations/migrations_pb2.py +119 -0
  47. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/migrations/migrations_pb2.pyi +46 -0
  48. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/migrations/migrations_pb2_grpc.py +66 -0
  49. scalekit_sdk_python-2.19.0/scalekit/v1/options/options_pb2.py +38 -0
  50. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/options/options_pb2.pyi +33 -0
  51. scalekit_sdk_python-2.19.0/scalekit/v1/organizations/organizations_pb2.py +369 -0
  52. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/providers/providers_pb2.py +6 -6
  53. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/roles/roles_pb2.py +26 -26
  54. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/secrets/secrets_pb2.py +7 -7
  55. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/sessions/sessions_pb2.py +6 -6
  56. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/tokens/tokens_pb2.py +7 -7
  57. scalekit_sdk_python-2.19.0/scalekit/v1/tools/tools_pb2.py +259 -0
  58. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/tools/tools_pb2.pyi +74 -0
  59. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/tools/tools_pb2_grpc.py +67 -0
  60. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/user_attributes/user_attributes_pb2.py +10 -10
  61. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/users/users_pb2.py +19 -19
  62. scalekit_sdk_python-2.19.0/scalekit/v1/webhooks/__init__.py +0 -0
  63. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/webhooks/webhooks_pb2.py +5 -5
  64. scalekit_sdk_python-2.19.0/scalekit/v1/workspaces/__init__.py +0 -0
  65. scalekit_sdk_python-2.19.0/scalekit/v1/workspaces/workspaces_pb2.py +273 -0
  66. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/workspaces/workspaces_pb2.pyi +15 -2
  67. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit_sdk_python.egg-info/PKG-INFO +1 -1
  68. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit_sdk_python.egg-info/SOURCES.txt +11 -0
  69. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_actions.py +32 -0
  70. scalekit_sdk_python-2.19.0/tests/test_call_timeout.py +203 -0
  71. scalekit_sdk_python-2.19.0/tests/test_http_timeout.py +159 -0
  72. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_sk819_retry_behavior.py +10 -8
  73. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_tools.py +123 -1
  74. scalekit_sdk_python-2.19.0/tests/test_transient_error_no_retry.py +461 -0
  75. scalekit_sdk_python-2.18.0/scalekit/core.py +0 -268
  76. scalekit_sdk_python-2.18.0/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -51
  77. scalekit_sdk_python-2.18.0/scalekit/v1/environments/environments_pb2.py +0 -444
  78. scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2.py +0 -115
  79. scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2.pyi +0 -156
  80. scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2_grpc.py +0 -271
  81. scalekit_sdk_python-2.18.0/scalekit/v1/migrations/migrations_pb2.py +0 -105
  82. scalekit_sdk_python-2.18.0/scalekit/v1/options/options_pb2.py +0 -32
  83. scalekit_sdk_python-2.18.0/scalekit/v1/organizations/organizations_pb2.py +0 -367
  84. scalekit_sdk_python-2.18.0/scalekit/v1/tools/tools_pb2.py +0 -201
  85. scalekit_sdk_python-2.18.0/scalekit/v1/workspaces/workspaces_pb2.py +0 -269
  86. scalekit_sdk_python-2.18.0/tests/test_http_timeout.py +0 -59
  87. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/LICENSE +0 -0
  88. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/README.md +0 -0
  89. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/buf/__init__.py +0 -0
  90. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/buf/validate/__init__.py +0 -0
  91. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/buf/validate/validate_pb2.py +0 -0
  92. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/buf/validate/validate_pb2.pyi +0 -0
  93. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/buf/validate/validate_pb2_grpc.py +0 -0
  94. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/pyproject.toml +0 -0
  95. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/__init__.py +0 -0
  96. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/__init__.py +0 -0
  97. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/__init__.py +0 -0
  98. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/google_adk.py +0 -0
  99. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/langchain.py +0 -0
  100. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/types/__init__.py +0 -0
  101. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
  102. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/frameworks/util.py +0 -0
  103. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/__init__.py +0 -0
  104. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/custom_provider.py +0 -0
  105. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/mcp_config.py +0 -0
  106. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/mcp_connection_auth_state.py +0 -0
  107. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/mcp_instance.py +0 -0
  108. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/__init__.py +0 -0
  109. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/create_connected_account_request.py +0 -0
  110. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/create_custom_provider_request.py +0 -0
  111. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/delete_custom_provider_request.py +0 -0
  112. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/list_providers_request.py +0 -0
  113. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/mcp_request.py +0 -0
  114. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/tool_request.py +0 -0
  115. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
  116. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/requests/update_custom_provider_request.py +0 -0
  117. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/__init__.py +0 -0
  118. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
  119. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/create_custom_provider_response.py +0 -0
  120. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
  121. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
  122. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/create_mcp_session_token_response.py +0 -0
  123. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
  124. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/delete_custom_provider_response.py +0 -0
  125. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
  126. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
  127. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
  128. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
  129. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
  130. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
  131. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
  132. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
  133. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
  134. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
  135. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/list_mcp_connected_accounts_response.py +0 -0
  136. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
  137. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/list_providers_response.py +0 -0
  138. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/magic_link_response.py +0 -0
  139. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
  140. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/update_custom_provider_response.py +0 -0
  141. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
  142. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
  143. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/responses/verify_connected_account_user_response.py +0 -0
  144. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/tool_input_output.py +0 -0
  145. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/models/tool_mapping.py +0 -0
  146. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/actions/modifier.py +0 -0
  147. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/auth.py +0 -0
  148. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/common/__init__.py +0 -0
  149. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/common/scalekit.py +0 -0
  150. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/common/user.py +0 -0
  151. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/connected_accounts.py +0 -0
  152. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/connection.py +0 -0
  153. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/constants/__init__.py +0 -0
  154. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/constants/user.py +0 -0
  155. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/directory.py +0 -0
  156. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/domain.py +0 -0
  157. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/events.py +0 -0
  158. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/frameworks/__init__.py +0 -0
  159. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/frameworks/django.py +0 -0
  160. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/frameworks/fastapi.py +0 -0
  161. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/frameworks/flask.py +0 -0
  162. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/m2m_client.py +0 -0
  163. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/mcp.py +0 -0
  164. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/middleware/__init__.py +0 -0
  165. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/middleware/csrf_state.py +0 -0
  166. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/middleware/protocol.py +0 -0
  167. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/middleware/session_crypto.py +0 -0
  168. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/middleware/session_manager.py +0 -0
  169. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/organization.py +0 -0
  170. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/passwordless.py +0 -0
  171. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/permissions.py +0 -0
  172. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/providers.py +0 -0
  173. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/role.py +0 -0
  174. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/sessions.py +0 -0
  175. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/token.py +0 -0
  176. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/users.py +0 -0
  177. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/utils/__init__.py +0 -0
  178. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/utils/directory.py +0 -0
  179. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/__init__.py +0 -0
  180. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/__init__.py +0 -0
  181. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.pyi +0 -0
  182. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2_grpc.py +0 -0
  183. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.pyi +0 -0
  184. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/agentkit_logs/agentkit_logs_pb2_grpc.py +0 -0
  185. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auditlogs/__init__.py +0 -0
  186. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
  187. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
  188. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/__init__.py +0 -0
  189. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/passwordless_pb2.py +0 -0
  190. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
  191. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
  192. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/totp_pb2.py +0 -0
  193. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/totp_pb2.pyi +0 -0
  194. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
  195. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
  196. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
  197. {scalekit_sdk_python-2.18.0/scalekit/v1/clients → scalekit_sdk_python-2.19.0/scalekit/v1/billing}/__init__.py +0 -0
  198. {scalekit_sdk_python-2.18.0/scalekit/v1/commons → scalekit_sdk_python-2.19.0/scalekit/v1/clients}/__init__.py +0 -0
  199. {scalekit_sdk_python-2.18.0/scalekit/v1/connected_accounts → scalekit_sdk_python-2.19.0/scalekit/v1/commons}/__init__.py +0 -0
  200. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
  201. {scalekit_sdk_python-2.18.0/scalekit/v1/connections → scalekit_sdk_python-2.19.0/scalekit/v1/connected_accounts}/__init__.py +0 -0
  202. {scalekit_sdk_python-2.18.0/scalekit/v1/directories → scalekit_sdk_python-2.19.0/scalekit/v1/connections}/__init__.py +0 -0
  203. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
  204. {scalekit_sdk_python-2.18.0/scalekit/v1/domains → scalekit_sdk_python-2.19.0/scalekit/v1/directories}/__init__.py +0 -0
  205. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/directories/directories_pb2.pyi +0 -0
  206. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
  207. {scalekit_sdk_python-2.18.0/scalekit/v1/emails → scalekit_sdk_python-2.19.0/scalekit/v1/domains}/__init__.py +0 -0
  208. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/domains/domains_pb2.pyi +0 -0
  209. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
  210. {scalekit_sdk_python-2.18.0/scalekit/v1/environments → scalekit_sdk_python-2.19.0/scalekit/v1/emails}/__init__.py +0 -0
  211. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/emails/emails_pb2.pyi +0 -0
  212. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
  213. {scalekit_sdk_python-2.18.0/scalekit/v1/errdetails → scalekit_sdk_python-2.19.0/scalekit/v1/environments}/__init__.py +0 -0
  214. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
  215. {scalekit_sdk_python-2.18.0/scalekit/v1/events → scalekit_sdk_python-2.19.0/scalekit/v1/errdetails}/__init__.py +0 -0
  216. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
  217. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
  218. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
  219. {scalekit_sdk_python-2.18.0/scalekit/v1/gateway → scalekit_sdk_python-2.19.0/scalekit/v1/events}/__init__.py +0 -0
  220. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/events/events_pb2.pyi +0 -0
  221. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/events/events_pb2_grpc.py +0 -0
  222. {scalekit_sdk_python-2.18.0/scalekit/v1/interceptors → scalekit_sdk_python-2.19.0/scalekit/v1/gateway}/__init__.py +0 -0
  223. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/gateway/gateway_pb2.pyi +0 -0
  224. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/gateway/gateway_pb2_grpc.py +0 -0
  225. {scalekit_sdk_python-2.18.0/scalekit/v1/keys → scalekit_sdk_python-2.19.0/scalekit/v1/interceptors}/__init__.py +0 -0
  226. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
  227. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
  228. {scalekit_sdk_python-2.18.0/scalekit/v1/mcp → scalekit_sdk_python-2.19.0/scalekit/v1/keys}/__init__.py +0 -0
  229. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/keys/keys_pb2.pyi +0 -0
  230. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/keys/keys_pb2_grpc.py +0 -0
  231. {scalekit_sdk_python-2.18.0/scalekit/v1/members → scalekit_sdk_python-2.19.0/scalekit/v1/logstreams}/__init__.py +0 -0
  232. {scalekit_sdk_python-2.18.0/scalekit/v1/migrations → scalekit_sdk_python-2.19.0/scalekit/v1/mcp}/__init__.py +0 -0
  233. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
  234. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
  235. {scalekit_sdk_python-2.18.0/scalekit/v1/options → scalekit_sdk_python-2.19.0/scalekit/v1/members}/__init__.py +0 -0
  236. {scalekit_sdk_python-2.18.0/scalekit/v1/organizations → scalekit_sdk_python-2.19.0/scalekit/v1/migrations}/__init__.py +0 -0
  237. {scalekit_sdk_python-2.18.0/scalekit/v1/providers → scalekit_sdk_python-2.19.0/scalekit/v1/options}/__init__.py +0 -0
  238. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/options/options_pb2_grpc.py +0 -0
  239. {scalekit_sdk_python-2.18.0/scalekit/v1/roles → scalekit_sdk_python-2.19.0/scalekit/v1/organizations}/__init__.py +0 -0
  240. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
  241. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
  242. {scalekit_sdk_python-2.18.0/scalekit/v1/secrets → scalekit_sdk_python-2.19.0/scalekit/v1/providers}/__init__.py +0 -0
  243. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/providers/providers_pb2.pyi +0 -0
  244. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
  245. {scalekit_sdk_python-2.18.0/scalekit/v1/sessions → scalekit_sdk_python-2.19.0/scalekit/v1/roles}/__init__.py +0 -0
  246. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/roles/roles_pb2.pyi +0 -0
  247. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
  248. {scalekit_sdk_python-2.18.0/scalekit/v1/tokens → scalekit_sdk_python-2.19.0/scalekit/v1/secrets}/__init__.py +0 -0
  249. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
  250. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
  251. {scalekit_sdk_python-2.18.0/scalekit/v1/tools → scalekit_sdk_python-2.19.0/scalekit/v1/sessions}/__init__.py +0 -0
  252. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
  253. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
  254. {scalekit_sdk_python-2.18.0/scalekit/v1/user_attributes → scalekit_sdk_python-2.19.0/scalekit/v1/tokens}/__init__.py +0 -0
  255. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
  256. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
  257. {scalekit_sdk_python-2.18.0/scalekit/v1/users → scalekit_sdk_python-2.19.0/scalekit/v1/tools}/__init__.py +0 -0
  258. {scalekit_sdk_python-2.18.0/scalekit/v1/webhooks → scalekit_sdk_python-2.19.0/scalekit/v1/user_attributes}/__init__.py +0 -0
  259. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
  260. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
  261. {scalekit_sdk_python-2.18.0/scalekit/v1/workspaces → scalekit_sdk_python-2.19.0/scalekit/v1/users}/__init__.py +0 -0
  262. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/users/users_pb2.pyi +0 -0
  263. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/users/users_pb2_grpc.py +0 -0
  264. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
  265. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
  266. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
  267. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit/webauthn.py +0 -0
  268. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
  269. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit_sdk_python.egg-info/requires.txt +0 -0
  270. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
  271. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/setup.cfg +0 -0
  272. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/setup.py +0 -0
  273. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_connected_accounts.py +0 -0
  274. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_connection.py +0 -0
  275. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_directory.py +0 -0
  276. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_domain.py +0 -0
  277. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_events.py +0 -0
  278. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_keepalive_channel_options.py +0 -0
  279. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_login.py +0 -0
  280. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_m2m_client.py +0 -0
  281. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_mcp.py +0 -0
  282. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_csrf_state.py +0 -0
  283. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_django.py +0 -0
  284. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_fastapi.py +0 -0
  285. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_flask.py +0 -0
  286. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_session_crypto.py +0 -0
  287. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_middleware_session_manager.py +0 -0
  288. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_org_roles.py +0 -0
  289. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_organization.py +0 -0
  290. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_organization_session_policy.py +0 -0
  291. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_organization_slug_logo.py +0 -0
  292. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_passwordless.py +0 -0
  293. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_permissions.py +0 -0
  294. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_providers.py +0 -0
  295. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_role_defaults_dependent.py +0 -0
  296. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_roles.py +0 -0
  297. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_sessions.py +0 -0
  298. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_tokens.py +0 -0
  299. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_user_roles_permissions.py +0 -0
  300. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_users.py +0 -0
  301. {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.0}/tests/test_webauthn_credentials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalekit-sdk-python
3
- Version: 2.18.0
3
+ Version: 2.19.0
4
4
  Summary: Scalekit official Python SDK
5
5
  Home-page: https://github.com/scalekit-inc/scalekit-sdk-python
6
6
  Author: Team Scalekit
@@ -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.18.0"
3
+ __version__ = "2.19.0"
@@ -1,7 +1,7 @@
1
1
  from datetime import timedelta
2
2
  from typing import Optional, Any, List, Dict, Union
3
3
  import requests
4
- from scalekit.actions.types import ToolRequest,ExecuteToolResponse,MagicLinkResponse,ListConnectedAccountsResponse,DeleteConnectedAccountResponse,GetConnectedAccountAuthResponse,GetConnectedAccountDetailsResponse,ToolInput, \
4
+ from scalekit.actions.types import ToolRequest,ExecuteToolResponse,MagicLinkResponse,ListConnectedAccountsResponse,ListToolsResponse,DeleteConnectedAccountResponse,GetConnectedAccountAuthResponse,GetConnectedAccountDetailsResponse,ToolInput, \
5
5
  UpdateConnectedAccountResponse,CreateMcpConfigResponse,ListMcpConfigsResponse,UpdateMcpConfigResponse,DeleteMcpConfigResponse, \
6
6
  EnsureMcpInstanceResponse,UpdateMcpInstanceResponse,GetMcpInstanceResponse,ListMcpInstancesResponse,DeleteMcpInstanceResponse,GetMcpInstanceAuthStateResponse, \
7
7
  McpConfig,McpConfigConnectionToolMapping,VerifyConnectedAccountUserResponse, \
@@ -16,6 +16,8 @@ from scalekit.actions.modifier import (
16
16
  apply_pre_modifiers, apply_post_modifiers
17
17
  )
18
18
  from scalekit.common.exceptions import ScalekitNotFoundException
19
+ from scalekit.v1.tools.tools_pb2 import Filter
20
+ from google.protobuf.wrappers_pb2 import BoolValue
19
21
 
20
22
 
21
23
 
@@ -168,9 +170,86 @@ class ActionClient:
168
170
  modified_response = apply_post_modifiers(tool_name, response.data, self._modifiers)
169
171
 
170
172
  response.data = modified_response
171
-
173
+
172
174
  return response
173
-
175
+
176
+ def list_tools(
177
+ self,
178
+ connection_name: Optional[str] = None,
179
+ identifier: Optional[str] = None,
180
+ provider: Optional[str] = None,
181
+ tool_name: Optional[List[str]] = None,
182
+ query: Optional[str] = None,
183
+ organization_id: Optional[str] = None,
184
+ user_id: Optional[str] = None,
185
+ connected_account_id: Optional[str] = None,
186
+ summary: Optional[bool] = None,
187
+ page_size: Optional[int] = None,
188
+ page_token: Optional[str] = None,
189
+ **kwargs
190
+ ) -> ListToolsResponse:
191
+ """
192
+ List tools available in your workspace, optionally scoped to a connected account.
193
+
194
+ Thin wrapper around ToolsClient.list_tools.
195
+
196
+ :param connection_name: Filter by connector identifier, e.g. 'github-connect' (optional)
197
+ :type: str
198
+ :param identifier: Filter/resolve by connected-account identifier (optional)
199
+ :type: str
200
+ :param provider: Filter by provider key, e.g. 'github' (optional)
201
+ :type: str
202
+ :param tool_name: Filter to specific tool names (optional)
203
+ :type: List[str]
204
+ :param query: Free-form search query across tool metadata (optional)
205
+ :type: str
206
+ :param organization_id: Organization ID to scope the connected-account lookup (optional)
207
+ :type: str
208
+ :param user_id: User ID to scope the connected-account lookup (optional)
209
+ :type: str
210
+ :param connected_account_id: Direct connected account ID, as an alternative to
211
+ identifier + connection_name (optional)
212
+ :type: str
213
+ :param summary: Whether to return a summarized tool definition (optional)
214
+ :type: bool
215
+ :param page_size: Maximum number of tools to return per page (optional)
216
+ :type: int
217
+ :param page_token: Token from a previous response for pagination (optional)
218
+ :type: str
219
+
220
+ :returns:
221
+ ListToolsResponse containing the matching tools
222
+ """
223
+ has_filter_fields = any([
224
+ connection_name, identifier, provider, tool_name,
225
+ query, organization_id, user_id, connected_account_id,
226
+ summary is not None,
227
+ ])
228
+ filter_kwargs = {
229
+ "connector": connection_name,
230
+ "identifier": identifier,
231
+ "provider": provider,
232
+ "tool_name": tool_name,
233
+ "query": query,
234
+ "organization_id": organization_id,
235
+ "user_id": user_id,
236
+ "connected_account_id": connected_account_id,
237
+ }
238
+ if summary is not None:
239
+ filter_kwargs["summary"] = BoolValue(value=summary)
240
+ filter_obj = Filter(**filter_kwargs) if has_filter_fields else None
241
+
242
+ # Call the existing tools.list_tools which returns (response, metadata) tuple
243
+ result_tuple = self.tools.list_tools(
244
+ filter=filter_obj,
245
+ page_size=page_size,
246
+ page_token=page_token
247
+ )
248
+
249
+ proto_response = result_tuple[0]
250
+
251
+ return ListToolsResponse.from_proto(proto_response)
252
+
174
253
  def get_authorization_link(
175
254
  self,
176
255
  identifier: Optional[str] = None,
@@ -0,0 +1,165 @@
1
+ from typing import List, Optional
2
+ from datetime import datetime
3
+ from pydantic import BaseModel, Field
4
+ from google.protobuf.json_format import MessageToDict
5
+
6
+
7
+ class Tool(BaseModel):
8
+ """Tool item in list response with one-to-one mapping to proto Tool"""
9
+
10
+ id: Optional[str] = Field(
11
+ None,
12
+ description="Unique identifier for the tool"
13
+ )
14
+ provider: Optional[str] = Field(
15
+ None,
16
+ description="Provider that exposes this tool (e.g., 'github', 'slack')"
17
+ )
18
+ definition: Optional[dict] = Field(
19
+ None,
20
+ description="Tool definition (schema/parameters) as a dictionary"
21
+ )
22
+ metadata: Optional[dict] = Field(
23
+ None,
24
+ description="Additional metadata for the tool"
25
+ )
26
+ tags: List[str] = Field(
27
+ default_factory=list,
28
+ description="Tags associated with the tool"
29
+ )
30
+ is_default: Optional[bool] = Field(
31
+ None,
32
+ description="Whether this is a default tool for its provider"
33
+ )
34
+ updated_at: Optional[datetime] = Field(
35
+ None,
36
+ description="Timestamp when the tool was last updated"
37
+ )
38
+
39
+ @classmethod
40
+ def from_proto(cls, proto_tool) -> 'Tool':
41
+ """
42
+ Create Tool from protobuf Tool
43
+
44
+ :param proto_tool: The protobuf Tool object
45
+ :type proto_tool: Tool (from tools_pb2)
46
+
47
+ :returns:
48
+ Tool instance
49
+ """
50
+ definition = None
51
+ if proto_tool.HasField("definition"):
52
+ definition = MessageToDict(proto_tool.definition)
53
+
54
+ metadata = None
55
+ if proto_tool.HasField("metadata"):
56
+ metadata = MessageToDict(proto_tool.metadata)
57
+
58
+ updated_at = None
59
+ if proto_tool.HasField("updated_at"):
60
+ updated_at = proto_tool.updated_at.ToDatetime()
61
+
62
+ return cls(
63
+ id=proto_tool.id if proto_tool.id else None,
64
+ provider=proto_tool.provider if proto_tool.provider else None,
65
+ definition=definition,
66
+ metadata=metadata,
67
+ tags=list(proto_tool.tags),
68
+ is_default=proto_tool.is_default.value if proto_tool.HasField("is_default") else None,
69
+ updated_at=updated_at
70
+ )
71
+
72
+ def to_dict(self) -> dict:
73
+ """
74
+ Convert to dictionary representation
75
+
76
+ :returns:
77
+ Dictionary representation of the tool
78
+ """
79
+ return {
80
+ "id": self.id,
81
+ "provider": self.provider,
82
+ "definition": self.definition,
83
+ "metadata": self.metadata,
84
+ "tags": self.tags,
85
+ "is_default": self.is_default,
86
+ "updated_at": self.updated_at.isoformat() if self.updated_at else None
87
+ }
88
+
89
+ class Config:
90
+ """Pydantic configuration"""
91
+ validate_assignment = True
92
+ json_encoders = {
93
+ datetime: lambda v: v.isoformat() if v else None
94
+ }
95
+
96
+
97
+ class ListToolsResponse(BaseModel):
98
+ """List tools response with one-to-one mapping to proto ListToolsResponse"""
99
+
100
+ tools: List[Tool] = Field(
101
+ default_factory=list,
102
+ description="List of tools"
103
+ )
104
+ tool_names: List[str] = Field(
105
+ default_factory=list,
106
+ description="Names of the tools in this page"
107
+ )
108
+ total_count: Optional[int] = Field(
109
+ None,
110
+ description="Total number of tools matching the request",
111
+ alias="total_size"
112
+ )
113
+ next_page_token: Optional[str] = Field(
114
+ None,
115
+ description="Token for the next page of results"
116
+ )
117
+ previous_page_token: Optional[str] = Field(
118
+ None,
119
+ description="Token for the previous page of results",
120
+ alias="prev_page_token"
121
+ )
122
+
123
+ @classmethod
124
+ def from_proto(cls, proto_response) -> 'ListToolsResponse':
125
+ """
126
+ Create ListToolsResponse from protobuf ListToolsResponse
127
+
128
+ :param proto_response: The protobuf ListToolsResponse object
129
+ :type proto_response: ListToolsResponse (from tools_pb2)
130
+
131
+ :returns:
132
+ ListToolsResponse instance
133
+ """
134
+ tools = [Tool.from_proto(proto_tool) for proto_tool in proto_response.tools]
135
+
136
+ return cls(
137
+ tools=tools,
138
+ tool_names=list(proto_response.tool_names),
139
+ total_count=proto_response.total_size,
140
+ next_page_token=proto_response.next_page_token if proto_response.next_page_token else None,
141
+ previous_page_token=proto_response.prev_page_token if proto_response.prev_page_token else None
142
+ )
143
+
144
+ def to_dict(self) -> dict:
145
+ """
146
+ Convert to dictionary representation
147
+
148
+ :returns:
149
+ Dictionary representation of the response
150
+ """
151
+ return {
152
+ "tools": [tool.to_dict() for tool in self.tools],
153
+ "tool_names": self.tool_names,
154
+ "total_count": self.total_count,
155
+ "next_page_token": self.next_page_token,
156
+ "previous_page_token": self.previous_page_token
157
+ }
158
+
159
+ class Config:
160
+ """Pydantic configuration"""
161
+ validate_assignment = True
162
+ populate_by_name = True
163
+ json_encoders = {
164
+ datetime: lambda v: v.isoformat() if v else None
165
+ }
@@ -5,6 +5,7 @@ from .models.requests.update_connected_account_request import UpdateConnectedAcc
5
5
  from .models.responses.execute_tool_response import ExecuteToolResponse
6
6
  from .models.responses.magic_link_response import MagicLinkResponse
7
7
  from .models.responses.list_connected_accounts_response import ListConnectedAccountsResponse
8
+ from .models.responses.list_tools_response import Tool, ListToolsResponse
8
9
  from .models.responses.delete_connected_account_response import DeleteConnectedAccountResponse
9
10
  from .models.responses.get_connected_account_auth_response import GetConnectedAccountAuthResponse, GetConnectedAccountDetailsResponse
10
11
  from .models.responses.create_connected_account_response import CreateConnectedAccountResponse
@@ -48,6 +49,8 @@ __all__ = [
48
49
  'ExecuteToolResponse',
49
50
  'MagicLinkResponse',
50
51
  'ListConnectedAccountsResponse',
52
+ 'Tool',
53
+ 'ListToolsResponse',
51
54
  'DeleteConnectedAccountResponse',
52
55
  'GetConnectedAccountAuthResponse',
53
56
  'GetConnectedAccountDetailsResponse',
@@ -9,7 +9,13 @@ import hmac
9
9
  import hashlib
10
10
  import base64
11
11
  from datetime import datetime, timedelta, timezone
12
- from scalekit.core import CoreClient, DEFAULT_KEEPALIVE_TIME_MS, DEFAULT_KEEPALIVE_TIMEOUT_MS
12
+ from scalekit.core import (
13
+ CoreClient,
14
+ DEFAULT_KEEPALIVE_TIME_MS,
15
+ DEFAULT_KEEPALIVE_TIMEOUT_MS,
16
+ DEFAULT_CALL_TIMEOUT_S,
17
+ DEFAULT_TOOL_CALL_TIMEOUT_S,
18
+ )
13
19
  from scalekit.domain import DomainClient
14
20
  from scalekit.connection import ConnectionClient
15
21
  from scalekit.m2m_client import M2MClient
@@ -57,6 +63,8 @@ class ScalekitClient:
57
63
  client_secret: str,
58
64
  keepalive_time_ms: int = DEFAULT_KEEPALIVE_TIME_MS,
59
65
  keepalive_timeout_ms: int = DEFAULT_KEEPALIVE_TIMEOUT_MS,
66
+ call_timeout_s: float = DEFAULT_CALL_TIMEOUT_S,
67
+ tool_call_timeout_s: float = DEFAULT_TOOL_CALL_TIMEOUT_S,
60
68
  ):
61
69
  """
62
70
  Initializer for Scalekit base class
@@ -78,6 +86,23 @@ class ScalekitClient:
78
86
  idle connection as dead. Defaults to
79
87
  10000.
80
88
  :type : ``` int ```
89
+ :param call_timeout_s : Deadline, in seconds, applied to every gRPC
90
+ call except ToolsClient calls (list_tools,
91
+ list_scoped_tools, execute_tool — see
92
+ tool_call_timeout_s). Without this, a call
93
+ can block forever on a connection that
94
+ looks fine to the client but is silently
95
+ dead. Bounds each attempt individually,
96
+ not the total call across retries — a
97
+ call that retries can take a multiple of
98
+ this value in the worst case. Defaults
99
+ to 20.
100
+ :type : ``` float ```
101
+ :param tool_call_timeout_s : Deadline, in seconds, for tool-execution
102
+ calls, which proxy to third-party APIs and
103
+ can legitimately run longer than ordinary
104
+ control-plane calls. Defaults to 60.
105
+ :type : ``` float ```
81
106
 
82
107
  :returns:
83
108
  None
@@ -89,6 +114,8 @@ class ScalekitClient:
89
114
  client_secret=client_secret,
90
115
  keepalive_time_ms=keepalive_time_ms,
91
116
  keepalive_timeout_ms=keepalive_timeout_ms,
117
+ call_timeout_s=call_timeout_s,
118
+ tool_call_timeout_s=tool_call_timeout_s,
92
119
  )
93
120
  self.domain = DomainClient(self.core_client)
94
121
  self.connection = ConnectionClient(self.core_client)
@@ -1,4 +1,6 @@
1
1
 
2
+ import enum
3
+
2
4
  import grpc
3
5
  from grpc import StatusCode
4
6
  from http import HTTPStatus
@@ -7,6 +9,13 @@ from requests.models import Response
7
9
  from scalekit.v1.errdetails.errdetails_pb2 import ErrorInfo
8
10
 
9
11
 
12
+ class NonStandardHTTPStatus(enum.IntEnum):
13
+ """HTTP status codes not in the stdlib http.HTTPStatus enum, needed so
14
+ __str__ can read .name/.value the same way it does for every HTTPStatus
15
+ entry in GRPC_TO_HTTP."""
16
+ CLIENT_CLOSED_REQUEST = 499
17
+
18
+
10
19
  GRPC_TO_HTTP = {
11
20
  StatusCode.OK: HTTPStatus.OK,
12
21
  StatusCode.INVALID_ARGUMENT: HTTPStatus.BAD_REQUEST,
@@ -18,7 +27,7 @@ GRPC_TO_HTTP = {
18
27
  StatusCode.ALREADY_EXISTS: HTTPStatus.CONFLICT,
19
28
  StatusCode.ABORTED: HTTPStatus.CONFLICT,
20
29
  StatusCode.RESOURCE_EXHAUSTED: HTTPStatus.TOO_MANY_REQUESTS,
21
- StatusCode.CANCELLED: 499,
30
+ StatusCode.CANCELLED: NonStandardHTTPStatus.CLIENT_CLOSED_REQUEST,
22
31
  StatusCode.DATA_LOSS: HTTPStatus.INTERNAL_SERVER_ERROR,
23
32
  StatusCode.UNKNOWN: HTTPStatus.INTERNAL_SERVER_ERROR,
24
33
  StatusCode.INTERNAL: HTTPStatus.INTERNAL_SERVER_ERROR,
@@ -91,9 +100,29 @@ class ScalekitServerException(ScalekitException):
91
100
  self._message = None
92
101
  elif isinstance(error, grpc.RpcError):
93
102
  self._grpc_status = error.code()
94
- self._http_status = GRPC_TO_HTTP.get(self._grpc_status)
95
- self._message = rpc_status.from_call(error).message
96
- self._err_details = rpc_status.from_call(error).details
103
+ # Every current StatusCode is mapped, so this default is latent today —
104
+ # but without it, any future/unmapped code gives None here and __str__
105
+ # crashes on None.name, the same shape as the CANCELLED-as-bare-int bug.
106
+ self._http_status = GRPC_TO_HTTP.get(self._grpc_status, HTTPStatus.INTERNAL_SERVER_ERROR)
107
+ try:
108
+ # rpc_status.from_call raises ValueError (not just returning None)
109
+ # when grpc-status-details-bin is present but internally
110
+ # inconsistent with the call's own code/message — a malformed or
111
+ # tampered status must not crash the exception meant to describe it.
112
+ status = rpc_status.from_call(error)
113
+ except ValueError:
114
+ status = None
115
+ if status:
116
+ self._message = status.message
117
+ else:
118
+ # error.details() is grpc's documented accessor for the plain-text
119
+ # message; str(error) falls back to _InactiveRpcError's multi-line
120
+ # debug repr (or '' for other RpcError subclasses), which is a
121
+ # weaker signal than what details() gives when it's available.
122
+ details_fn = getattr(error, "details", None)
123
+ details_text = details_fn() if callable(details_fn) else None
124
+ self._message = details_text or str(error)
125
+ self._err_details = status.details if status else []
97
126
  self._error_code = None
98
127
 
99
128
  for detail in self._err_details:
@@ -187,11 +216,16 @@ class ScalekitServerException(ScalekitException):
187
216
  f"{self._message}: {details_str}\n{border}\n")
188
217
  else:
189
218
  border = "=" * 40
219
+ # _err_details is empty exactly when there was no trailing
220
+ # google.rpc.Status to unpack (e.g. a transport-level failure with
221
+ # no response from the server) — _message is where the real error
222
+ # text lives in that case, so fall back to it rather than printing
223
+ # an empty list and hiding the one thing this render is for.
190
224
  return (f"\n{border}\n"
191
225
  f"Error Code: {self._error_code}\n"
192
226
  f"GRPC: ({self._grpc_status.name}: {self._grpc_status.value})\n"
193
227
  f"HTTP: ({self._http_status.name}: {self._http_status.value})\n"
194
- f"Error Details: {self._err_details}\n{border}\n")
228
+ f"Error Details: {self._err_details or self._message}\n{border}\n")
195
229
 
196
230
  @property
197
231
  def http_status(self):