scalekit-sdk-python 2.18.0__tar.gz → 2.19.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.
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/PKG-INFO +1 -1
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/_version.py +1 -1
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/actions.py +82 -3
- scalekit_sdk_python-2.19.1/scalekit/actions/models/responses/list_tools_response.py +165 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/types.py +3 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/client.py +41 -2
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/common/exceptions.py +39 -5
- scalekit_sdk_python-2.19.1/scalekit/core.py +565 -0
- scalekit_sdk_python-2.19.1/scalekit/resource.py +96 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/tools.py +49 -1
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.py +3 -3
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.py +4 -4
- scalekit_sdk_python-2.19.1/scalekit/v1/auditlogs/auditlogs_pb2.py +115 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/auth_pb2.py +55 -47
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/auth_pb2.pyi +14 -4
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/auth_pb2_grpc.py +3 -3
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/webauthn_pb2.py +4 -4
- scalekit_sdk_python-2.19.1/scalekit/v1/billing/billing_pb2.py +135 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/billing/billing_pb2.pyi +307 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/billing/billing_pb2_grpc.py +263 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/clients/clients_pb2.py +212 -178
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/clients/clients_pb2.pyi +40 -2
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/clients/clients_pb2_grpc.py +119 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/commons/commons_pb2.py +38 -37
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/commons/commons_pb2.pyi +1 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.py +104 -78
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connected_accounts/connected_accounts_pb2.pyi +34 -6
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connected_accounts/connected_accounts_pb2_grpc.py +34 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connections/connections_pb2.py +182 -166
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connections/connections_pb2.pyi +31 -8
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/directories/directories_pb2.py +20 -20
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/domains/domains_pb2.py +8 -8
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/emails/emails_pb2.py +19 -19
- scalekit_sdk_python-2.19.1/scalekit/v1/environments/environments_pb2.py +451 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/environments/environments_pb2.pyi +13 -4
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/events/events_pb2.py +4 -4
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/gateway/gateway_pb2.py +19 -19
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/interceptors/interceptors_pb2.py +17 -17
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/keys/keys_pb2.py +11 -11
- scalekit_sdk_python-2.19.1/scalekit/v1/logstreams/logstreams_pb2.py +155 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/logstreams/logstreams_pb2.pyi +288 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/logstreams/logstreams_pb2_grpc.py +346 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/mcp/mcp_pb2.py +19 -19
- scalekit_sdk_python-2.19.1/scalekit/v1/members/members_pb2.py +273 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/members/members_pb2.pyi +324 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/members/members_pb2_grpc.py +622 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/migrations/migrations_pb2.py +119 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/migrations/migrations_pb2.pyi +46 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/migrations/migrations_pb2_grpc.py +66 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/options/options_pb2.py +38 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/options/options_pb2.pyi +33 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/organizations/organizations_pb2.py +369 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/providers/providers_pb2.py +6 -6
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/roles/roles_pb2.py +26 -26
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/secrets/secrets_pb2.py +7 -7
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/sessions/sessions_pb2.py +6 -6
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/tokens/tokens_pb2.py +7 -7
- scalekit_sdk_python-2.19.1/scalekit/v1/tools/tools_pb2.py +259 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/tools/tools_pb2.pyi +74 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/tools/tools_pb2_grpc.py +67 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/user_attributes/user_attributes_pb2.py +10 -10
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/users/users_pb2.py +19 -19
- scalekit_sdk_python-2.19.1/scalekit/v1/webhooks/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/webhooks/webhooks_pb2.py +5 -5
- scalekit_sdk_python-2.19.1/scalekit/v1/workspaces/__init__.py +0 -0
- scalekit_sdk_python-2.19.1/scalekit/v1/workspaces/workspaces_pb2.py +273 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/workspaces/workspaces_pb2.pyi +15 -2
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit_sdk_python.egg-info/PKG-INFO +1 -1
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit_sdk_python.egg-info/SOURCES.txt +13 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_actions.py +32 -0
- scalekit_sdk_python-2.19.1/tests/test_call_timeout.py +203 -0
- scalekit_sdk_python-2.19.1/tests/test_http_timeout.py +159 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_keepalive_channel_options.py +57 -3
- scalekit_sdk_python-2.19.1/tests/test_resource.py +81 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_sk819_retry_behavior.py +10 -8
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_tools.py +123 -1
- scalekit_sdk_python-2.19.1/tests/test_transient_error_no_retry.py +461 -0
- scalekit_sdk_python-2.18.0/scalekit/core.py +0 -268
- scalekit_sdk_python-2.18.0/scalekit/v1/auditlogs/auditlogs_pb2.py +0 -51
- scalekit_sdk_python-2.18.0/scalekit/v1/environments/environments_pb2.py +0 -444
- scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2.py +0 -115
- scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2.pyi +0 -156
- scalekit_sdk_python-2.18.0/scalekit/v1/members/members_pb2_grpc.py +0 -271
- scalekit_sdk_python-2.18.0/scalekit/v1/migrations/migrations_pb2.py +0 -105
- scalekit_sdk_python-2.18.0/scalekit/v1/options/options_pb2.py +0 -32
- scalekit_sdk_python-2.18.0/scalekit/v1/organizations/organizations_pb2.py +0 -367
- scalekit_sdk_python-2.18.0/scalekit/v1/tools/tools_pb2.py +0 -201
- scalekit_sdk_python-2.18.0/scalekit/v1/workspaces/workspaces_pb2.py +0 -269
- scalekit_sdk_python-2.18.0/tests/test_http_timeout.py +0 -59
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/LICENSE +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/README.md +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/buf/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/buf/validate/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/buf/validate/validate_pb2.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/buf/validate/validate_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/buf/validate/validate_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/pyproject.toml +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/google_adk.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/langchain.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/types/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/types/google_adk_tool.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/frameworks/util.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/custom_provider.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/mcp_config.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/mcp_connection_auth_state.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/mcp_instance.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/create_connected_account_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/create_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/delete_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/list_providers_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/mcp_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/tool_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/update_connected_account_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/requests/update_custom_provider_request.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/create_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/create_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/create_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/create_mcp_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/create_mcp_session_token_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/delete_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/delete_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/delete_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/delete_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/ensure_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/execute_tool_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/get_connected_account_auth_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/get_mcp_instance_auth_state_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/get_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/get_mcp_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/list_connected_accounts_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/list_mcp_configs_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/list_mcp_connected_accounts_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/list_mcp_instances_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/list_providers_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/magic_link_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/update_connected_account_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/update_custom_provider_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/update_mcp_config_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/update_mcp_instance_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/responses/verify_connected_account_user_response.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/tool_input_output.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/models/tool_mapping.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/actions/modifier.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/auth.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/common/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/common/scalekit.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/common/user.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/connected_accounts.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/connection.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/constants/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/constants/user.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/directory.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/domain.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/events.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/frameworks/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/frameworks/django.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/frameworks/fastapi.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/frameworks/flask.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/m2m_client.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/mcp.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/middleware/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/middleware/csrf_state.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/middleware/protocol.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/middleware/session_crypto.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/middleware/session_manager.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/organization.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/passwordless.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/permissions.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/providers.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/role.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/sessions.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/token.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/users.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/utils/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/utils/directory.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_analytics_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_logs_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/agentkit_logs/agentkit_logs_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auditlogs/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auditlogs/auditlogs_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auditlogs/auditlogs_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/passwordless_pb2.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/passwordless_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/passwordless_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/totp_pb2.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/totp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/totp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/webauthn_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/auth/webauthn_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/clients → scalekit_sdk_python-2.19.1/scalekit/v1/billing}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/commons → scalekit_sdk_python-2.19.1/scalekit/v1/clients}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/connected_accounts → scalekit_sdk_python-2.19.1/scalekit/v1/commons}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/commons/commons_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/connections → scalekit_sdk_python-2.19.1/scalekit/v1/connected_accounts}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/directories → scalekit_sdk_python-2.19.1/scalekit/v1/connections}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/connections/connections_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/domains → scalekit_sdk_python-2.19.1/scalekit/v1/directories}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/directories/directories_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/directories/directories_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/emails → scalekit_sdk_python-2.19.1/scalekit/v1/domains}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/domains/domains_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/domains/domains_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/environments → scalekit_sdk_python-2.19.1/scalekit/v1/emails}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/emails/emails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/emails/emails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/errdetails → scalekit_sdk_python-2.19.1/scalekit/v1/environments}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/environments/environments_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/events → scalekit_sdk_python-2.19.1/scalekit/v1/errdetails}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/errdetails/errdetails_pb2.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/errdetails/errdetails_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/errdetails/errdetails_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/gateway → scalekit_sdk_python-2.19.1/scalekit/v1/events}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/events/events_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/events/events_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/interceptors → scalekit_sdk_python-2.19.1/scalekit/v1/gateway}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/gateway/gateway_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/gateway/gateway_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/keys → scalekit_sdk_python-2.19.1/scalekit/v1/interceptors}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/interceptors/interceptors_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/interceptors/interceptors_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/mcp → scalekit_sdk_python-2.19.1/scalekit/v1/keys}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/keys/keys_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/keys/keys_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/members → scalekit_sdk_python-2.19.1/scalekit/v1/logstreams}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/migrations → scalekit_sdk_python-2.19.1/scalekit/v1/mcp}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/mcp/mcp_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/mcp/mcp_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/options → scalekit_sdk_python-2.19.1/scalekit/v1/members}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/organizations → scalekit_sdk_python-2.19.1/scalekit/v1/migrations}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/providers → scalekit_sdk_python-2.19.1/scalekit/v1/options}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/options/options_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/roles → scalekit_sdk_python-2.19.1/scalekit/v1/organizations}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/organizations/organizations_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/organizations/organizations_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/secrets → scalekit_sdk_python-2.19.1/scalekit/v1/providers}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/providers/providers_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/providers/providers_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/sessions → scalekit_sdk_python-2.19.1/scalekit/v1/roles}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/roles/roles_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/roles/roles_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/tokens → scalekit_sdk_python-2.19.1/scalekit/v1/secrets}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/secrets/secrets_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/secrets/secrets_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/tools → scalekit_sdk_python-2.19.1/scalekit/v1/sessions}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/sessions/sessions_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/sessions/sessions_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/user_attributes → scalekit_sdk_python-2.19.1/scalekit/v1/tokens}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/tokens/tokens_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/tokens/tokens_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/users → scalekit_sdk_python-2.19.1/scalekit/v1/tools}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/webhooks → scalekit_sdk_python-2.19.1/scalekit/v1/user_attributes}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/user_attributes/user_attributes_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/user_attributes/user_attributes_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0/scalekit/v1/workspaces → scalekit_sdk_python-2.19.1/scalekit/v1/users}/__init__.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/users/users_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/users/users_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/webhooks/webhooks_pb2.pyi +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/webhooks/webhooks_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/v1/workspaces/workspaces_pb2_grpc.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit/webauthn.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit_sdk_python.egg-info/dependency_links.txt +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit_sdk_python.egg-info/requires.txt +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/scalekit_sdk_python.egg-info/top_level.txt +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/setup.cfg +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/setup.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_connected_accounts.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_connection.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_directory.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_domain.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_events.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_login.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_m2m_client.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_mcp.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_csrf_state.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_django.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_fastapi.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_flask.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_session_crypto.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_middleware_session_manager.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_org_roles.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_organization.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_organization_session_policy.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_organization_slug_logo.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_passwordless.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_permissions.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_providers.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_role_defaults_dependent.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_roles.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_sessions.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_tokens.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_user_roles_permissions.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_users.py +0 -0
- {scalekit_sdk_python-2.18.0 → scalekit_sdk_python-2.19.1}/tests/test_webauthn_credentials.py +0 -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,10 +9,17 @@ import hmac
|
|
|
9
9
|
import hashlib
|
|
10
10
|
import base64
|
|
11
11
|
from datetime import datetime, timedelta, timezone
|
|
12
|
-
from scalekit.core import
|
|
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
|
|
22
|
+
from scalekit.resource import ResourceClient
|
|
16
23
|
from scalekit.organization import OrganizationClient
|
|
17
24
|
from scalekit.directory import DirectoryClient
|
|
18
25
|
from scalekit.users import UserClient
|
|
@@ -57,6 +64,8 @@ class ScalekitClient:
|
|
|
57
64
|
client_secret: str,
|
|
58
65
|
keepalive_time_ms: int = DEFAULT_KEEPALIVE_TIME_MS,
|
|
59
66
|
keepalive_timeout_ms: int = DEFAULT_KEEPALIVE_TIMEOUT_MS,
|
|
67
|
+
call_timeout_s: float = DEFAULT_CALL_TIMEOUT_S,
|
|
68
|
+
tool_call_timeout_s: float = DEFAULT_TOOL_CALL_TIMEOUT_S,
|
|
60
69
|
):
|
|
61
70
|
"""
|
|
62
71
|
Initializer for Scalekit base class
|
|
@@ -69,15 +78,42 @@ class ScalekitClient:
|
|
|
69
78
|
:type : ``` str ```
|
|
70
79
|
:param keepalive_time_ms : How often, in milliseconds, an idle gRPC
|
|
71
80
|
connection is verified before reuse.
|
|
81
|
+
Also derives grpc.client_idle_timeout_ms
|
|
82
|
+
(see CLIENT_IDLE_TIMEOUT_CEILING_MS),
|
|
83
|
+
which proactively recycles a connection
|
|
84
|
+
with zero active calls before the
|
|
85
|
+
backend's own MaxConnectionIdle would.
|
|
72
86
|
Defaults to 60000; most callers never
|
|
73
87
|
need to set this. Set to 0 to disable
|
|
74
|
-
|
|
88
|
+
both of this SDK's own settings for
|
|
89
|
+
these — grpc-core still applies its own
|
|
90
|
+
(much larger) default idle behavior
|
|
91
|
+
when no options are passed at all, so
|
|
92
|
+
this isn't "no idle handling," just no
|
|
93
|
+
SDK-configured one.
|
|
75
94
|
:type : ``` int ```
|
|
76
95
|
:param keepalive_timeout_ms : How long, in milliseconds, to wait for a
|
|
77
96
|
keepalive response before treating an
|
|
78
97
|
idle connection as dead. Defaults to
|
|
79
98
|
10000.
|
|
80
99
|
:type : ``` int ```
|
|
100
|
+
:param call_timeout_s : Deadline, in seconds, applied to every gRPC
|
|
101
|
+
call except ToolsClient calls (list_tools,
|
|
102
|
+
list_scoped_tools, execute_tool — see
|
|
103
|
+
tool_call_timeout_s). Without this, a call
|
|
104
|
+
can block forever on a connection that
|
|
105
|
+
looks fine to the client but is silently
|
|
106
|
+
dead. Bounds each attempt individually,
|
|
107
|
+
not the total call across retries — a
|
|
108
|
+
call that retries can take a multiple of
|
|
109
|
+
this value in the worst case. Defaults
|
|
110
|
+
to 20.
|
|
111
|
+
:type : ``` float ```
|
|
112
|
+
:param tool_call_timeout_s : Deadline, in seconds, for tool-execution
|
|
113
|
+
calls, which proxy to third-party APIs and
|
|
114
|
+
can legitimately run longer than ordinary
|
|
115
|
+
control-plane calls. Defaults to 60.
|
|
116
|
+
:type : ``` float ```
|
|
81
117
|
|
|
82
118
|
:returns:
|
|
83
119
|
None
|
|
@@ -89,12 +125,15 @@ class ScalekitClient:
|
|
|
89
125
|
client_secret=client_secret,
|
|
90
126
|
keepalive_time_ms=keepalive_time_ms,
|
|
91
127
|
keepalive_timeout_ms=keepalive_timeout_ms,
|
|
128
|
+
call_timeout_s=call_timeout_s,
|
|
129
|
+
tool_call_timeout_s=tool_call_timeout_s,
|
|
92
130
|
)
|
|
93
131
|
self.domain = DomainClient(self.core_client)
|
|
94
132
|
self.connection = ConnectionClient(self.core_client)
|
|
95
133
|
self.organization = OrganizationClient(self.core_client)
|
|
96
134
|
self.directory = DirectoryClient(self.core_client)
|
|
97
135
|
self.m2m_client = M2MClient(self.core_client)
|
|
136
|
+
self.resources = ResourceClient(self.core_client)
|
|
98
137
|
self.users = UserClient(self.core_client)
|
|
99
138
|
self.roles = RoleClient(self.core_client)
|
|
100
139
|
self.permissions = PermissionClient(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:
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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):
|