cyberdesk 2.1.16__tar.gz → 2.1.18__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.
Potentially problematic release.
This version of cyberdesk might be problematic. Click here for more details.
- {cyberdesk-2.1.16/cyberdesk.egg-info → cyberdesk-2.1.18}/PKG-INFO +158 -2
- cyberdesk-2.1.16/PKG-INFO → cyberdesk-2.1.18/README.md +141 -18
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/cyberdesk/__init__.py +1 -1
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/cyberdesk/client.py +212 -106
- cyberdesk-2.1.16/README.md → cyberdesk-2.1.18/cyberdesk.egg-info/PKG-INFO +174 -2
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/cyberdesk.egg-info/SOURCES.txt +9 -1
- cyberdesk-2.1.18/cyberdesk.egg-info/requires.txt +26 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/api/computer/copy_to_clipboard_v1_computer_machine_id_copy_to_clipboard_post.py +221 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/fs_list_v1_computer_machine_id_fs_list_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/fs_read_v1_computer_machine_id_fs_read_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/fs_write_v1_computer_machine_id_fs_write_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/get_display_dimensions_v1_computer_machine_id_display_dimensions_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/get_mouse_position_v1_computer_machine_id_input_mouse_position_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/get_screenshot_v1_computer_machine_id_display_screenshot_get.py +1 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/keyboard_key_v1_computer_machine_id_input_keyboard_key_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/keyboard_type_v1_computer_machine_id_input_keyboard_type_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_click_v1_computer_machine_id_input_mouse_click_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_drag_v1_computer_machine_id_input_mouse_drag_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_move_v1_computer_machine_id_input_mouse_move_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_scroll_v1_computer_machine_id_input_mouse_scroll_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/powershell_session_v1_computer_machine_id_shell_powershell_session_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/create_connection_v1_connections_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/delete_connection_v1_connections_connection_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/get_connection_v1_connections_connection_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/list_connections_v1_connections_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/update_connection_v1_connections_connection_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/default/health_db_health_db_get.py +1 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/default/health_health_get.py +1 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/default/root_get.py +1 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py +88 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/health/health_check_v1_health_get.py +1 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/create_machine_v1_machines_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/delete_machine_v1_machines_machine_id_delete.py +18 -4
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_pools_v1_machines_machine_id_pools_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_v1_machines_machine_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/list_machines_v1_machines_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_pools_v1_machines_machine_id_pools_put.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_v1_machines_machine_id_patch.py +14 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/add_machines_to_pool_v1_pools_pool_id_machines_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/create_pool_v1_pools_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/delete_pool_v1_pools_pool_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/get_pool_v1_pools_pool_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/list_pools_v1_pools_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/remove_machines_from_pool_v1_pools_pool_id_machines_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/update_pool_v1_pools_pool_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/create_request_log_v1_request_logs_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/delete_request_log_v1_request_logs_log_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/get_request_log_v1_request_logs_log_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/list_request_logs_v1_request_logs_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/update_request_log_v1_request_logs_log_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/create_run_attachment_v1_run_attachments_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/delete_run_attachment_v1_run_attachments_attachment_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/download_run_attachment_v1_run_attachments_attachment_id_download_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_download_url_v1_run_attachments_attachment_id_download_url_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_v1_run_attachments_attachment_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/list_run_attachments_v1_run_attachments_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/update_run_attachment_v1_run_attachments_attachment_id_put.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/bulk_create_runs_v1_runs_bulk_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_chain_v1_runs_chain_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_v1_runs_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/delete_run_v1_runs_run_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/get_run_v1_runs_run_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/list_runs_v1_runs_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/retry_run_v1_runs_run_id_retry_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/update_run_v1_runs_run_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/test/dummy_test_endpoint_v1_test_post.py +1 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/create_trajectory_v1_trajectories_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/delete_trajectory_v1_trajectories_trajectory_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_latest_trajectory_for_workflow_v1_workflows_workflow_id_latest_trajectory_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_trajectory_v1_trajectories_trajectory_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/update_trajectory_v1_trajectories_trajectory_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/create_workflow_v1_workflows_post.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/delete_workflow_v1_workflows_workflow_id_delete.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_v1_workflows_workflow_id_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_versions_v1_workflows_workflow_id_versions_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/update_workflow_v1_workflows_workflow_id_patch.py +2 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/__init__.py +17 -3
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/copy_to_clipboard_request.py +59 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/copy_to_clipboard_v1_computer_machine_id_copy_to_clipboard_post_response_copy_to_clipboard_v1_computer_machine_id_copy_to_clipboard_post.py +47 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_create.py +80 -1
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_sensitive_parameters_type_0.py +44 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_response.py +77 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_sensitive_parameters_type_0.py +44 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_update.py +80 -1
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.18/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_sensitive_parameters_type_0.py +44 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/power_shell_exec_request.py +21 -0
- cyberdesk-2.1.18/pyproject.toml +45 -0
- cyberdesk-2.1.16/cyberdesk.egg-info/requires.txt +0 -7
- cyberdesk-2.1.16/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py +0 -146
- cyberdesk-2.1.16/openapi_client/cyberdesk_cloud_client/models/database_health_check_v1_health_db_get_response_database_health_check_v1_health_db_get.py +0 -44
- cyberdesk-2.1.16/pyproject.toml +0 -25
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/LICENSE +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/cyberdesk.egg-info/dependency_links.txt +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/cyberdesk.egg-info/top_level.txt +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/computer/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/connections/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/default/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/health/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/machines/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/pools/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/request_logs/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/run_attachments/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/runs/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/test/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/trajectories/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/api/workflows/__init__.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/client.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/errors.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/attachment_type.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/chain_step.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/chain_step_inputs_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/chain_step_sensitive_inputs_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/connection_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/connection_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/connection_status.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/display_dimensions.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/dummy_test_endpoint_v1_test_post_response_dummy_test_endpoint_v1_test_post.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/file_input.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/file_write_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/fs_list_v1_computer_machine_id_fs_list_get_response_fs_list_v1_computer_machine_id_fs_list_get.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/fs_read_v1_computer_machine_id_fs_read_get_response_fs_read_v1_computer_machine_id_fs_read_get.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/fs_write_v1_computer_machine_id_fs_write_post_response_fs_write_v1_computer_machine_id_fs_write_post.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/get_workflow_versions_v1_workflows_workflow_id_versions_get_response_200_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/health_check_v1_health_get_response_health_check_v1_health_get.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/health_health_get_response_health_health_get.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/http_validation_error.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/keyboard_key_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/keyboard_type_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_pool_assignment.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_pool_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/machine_status.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/mouse_click_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/mouse_drag_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/mouse_move_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/mouse_position.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/mouse_scroll_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_connection_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_machine_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_pool_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_attachment_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_trajectory_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/paginated_response_workflow_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/pool_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/pool_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/pool_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/pool_with_machines.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/power_shell_session_request.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post_response_powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/powershell_session_v1_computer_machine_id_shell_powershell_session_post_response_powershell_session_v1_computer_machine_id_shell_powershell_session_post.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/ref_value.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/request_log_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/request_log_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/request_log_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_attachment_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_attachment_download_url_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_attachment_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_attachment_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_sensitive_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_completed_event.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_create_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_create_sensitive_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_field.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_response_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_response_output_data_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_response_run_message_history_type_0_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_response_sensitive_input_aliases_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_retry.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_retry_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_retry_sensitive_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_status.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_update_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_update_output_data_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/run_update_run_message_history_type_0_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_dimensions.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_original_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_trajectory_data_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_dimensions.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_original_input_values_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_trajectory_data_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/trajectory_update_trajectory_data_type_0_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/validation_error.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_inputs_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_sensitive_inputs_type_0.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_create.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_response.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_response_old_versions_type_0_item.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/models/workflow_update.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/py.typed +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/openapi_client/cyberdesk_cloud_client/types.py +0 -0
- {cyberdesk-2.1.16 → cyberdesk-2.1.18}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cyberdesk
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.18
|
|
4
4
|
Summary: The official Python SDK for Cyberdesk
|
|
5
5
|
Author-email: Cyberdesk Team <dev@cyberdesk.io>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -12,6 +12,23 @@ Provides-Extra: dev
|
|
|
12
12
|
Requires-Dist: openapi-python-client; extra == "dev"
|
|
13
13
|
Requires-Dist: build; extra == "dev"
|
|
14
14
|
Requires-Dist: twine; extra == "dev"
|
|
15
|
+
Provides-Extra: testing
|
|
16
|
+
Requires-Dist: svix>=1.0.0; extra == "testing"
|
|
17
|
+
Requires-Dist: fastapi>=0.100.0; extra == "testing"
|
|
18
|
+
Requires-Dist: uvicorn[standard]>=0.30.0; extra == "testing"
|
|
19
|
+
Requires-Dist: python-dotenv>=1.0.0; extra == "testing"
|
|
20
|
+
Requires-Dist: pytest>=8.0.0; extra == "testing"
|
|
21
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "testing"
|
|
22
|
+
Provides-Extra: all
|
|
23
|
+
Requires-Dist: openapi-python-client; extra == "all"
|
|
24
|
+
Requires-Dist: build; extra == "all"
|
|
25
|
+
Requires-Dist: twine; extra == "all"
|
|
26
|
+
Requires-Dist: svix>=1.0.0; extra == "all"
|
|
27
|
+
Requires-Dist: fastapi>=0.100.0; extra == "all"
|
|
28
|
+
Requires-Dist: uvicorn[standard]>=0.30.0; extra == "all"
|
|
29
|
+
Requires-Dist: python-dotenv>=1.0.0; extra == "all"
|
|
30
|
+
Requires-Dist: pytest>=8.0.0; extra == "all"
|
|
31
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "all"
|
|
15
32
|
Dynamic: license-file
|
|
16
33
|
|
|
17
34
|
# Cyberdesk Python SDK
|
|
@@ -21,7 +38,14 @@ The official Python SDK for Cyberdesk API. This SDK provides a clean, type-safe
|
|
|
21
38
|
## Installation
|
|
22
39
|
|
|
23
40
|
```bash
|
|
41
|
+
# Basic SDK installation
|
|
24
42
|
pip install cyberdesk
|
|
43
|
+
|
|
44
|
+
# With testing utilities
|
|
45
|
+
pip install "cyberdesk[testing]"
|
|
46
|
+
|
|
47
|
+
# All development dependencies (for SDK contributors)
|
|
48
|
+
pip install "cyberdesk[all]"
|
|
25
49
|
```
|
|
26
50
|
|
|
27
51
|
## Quick Start
|
|
@@ -66,6 +90,38 @@ else:
|
|
|
66
90
|
print("Run failed:", ", ".join(run.error or []))
|
|
67
91
|
```
|
|
68
92
|
|
|
93
|
+
## Desktop Parameters
|
|
94
|
+
|
|
95
|
+
Configure machine-specific values that automatically populate workflows running on specific desktops:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
from cyberdesk import MachineUpdate
|
|
99
|
+
|
|
100
|
+
# Set desktop parameters for a machine
|
|
101
|
+
client.machines.update_sync(
|
|
102
|
+
machine_id="machine-id",
|
|
103
|
+
data=MachineUpdate(
|
|
104
|
+
machine_parameters={
|
|
105
|
+
"username": "machine_specific_user",
|
|
106
|
+
"api_url": "https://api-region-east.example.com",
|
|
107
|
+
"config_path": "C:\\MachineA\\config.json"
|
|
108
|
+
},
|
|
109
|
+
machine_sensitive_parameters={
|
|
110
|
+
"password": "actual_secret_value", # Stored securely in Basis Theory
|
|
111
|
+
"api_key": "actual_api_key_123"
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Use in workflows with standard syntax:
|
|
118
|
+
```
|
|
119
|
+
Log in to {api_url} using {username} and password {$password}.
|
|
120
|
+
Then open the config at {config_path}.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Desktop parameters automatically override run-level inputs and persist across runs. See the [Desktop Parameters docs](https://docs.cyberdesk.io/concepts/desktop-parameters) for more details.
|
|
124
|
+
|
|
69
125
|
## Full Documentation
|
|
70
126
|
|
|
71
127
|
For complete documentation including async/sync usage, error handling, and all available methods, visit:
|
|
@@ -281,6 +337,106 @@ from cyberdesk import (
|
|
|
281
337
|
)
|
|
282
338
|
```
|
|
283
339
|
|
|
340
|
+
## Webhooks
|
|
341
|
+
|
|
342
|
+
### Handling Webhooks
|
|
343
|
+
|
|
344
|
+
Cyberdesk sends webhooks when important events occur (e.g., workflow completion). To handle webhooks:
|
|
345
|
+
|
|
346
|
+
```python
|
|
347
|
+
import os
|
|
348
|
+
from fastapi import FastAPI, Request, HTTPException
|
|
349
|
+
from svix.webhooks import Webhook, WebhookVerificationError
|
|
350
|
+
from openapi_client.cyberdesk_cloud_client.models.run_completed_event import RunCompletedEvent
|
|
351
|
+
from openapi_client.cyberdesk_cloud_client.models.run_response import RunResponse
|
|
352
|
+
from typing import cast
|
|
353
|
+
|
|
354
|
+
app = FastAPI()
|
|
355
|
+
|
|
356
|
+
@app.post("/webhooks/cyberdesk")
|
|
357
|
+
async def cyberdesk_webhook(request: Request):
|
|
358
|
+
secret = os.environ["SVIX_WEBHOOK_SECRET"]
|
|
359
|
+
wh = Webhook(secret)
|
|
360
|
+
|
|
361
|
+
payload = await request.body()
|
|
362
|
+
headers = {
|
|
363
|
+
"svix-id": request.headers.get("svix-id"),
|
|
364
|
+
"svix-timestamp": request.headers.get("svix-timestamp"),
|
|
365
|
+
"svix-signature": request.headers.get("svix-signature"),
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
try:
|
|
369
|
+
data = wh.verify(payload, headers)
|
|
370
|
+
# IMPORTANT: Use from_dict() for attrs classes, NOT model_validate()
|
|
371
|
+
evt = RunCompletedEvent.from_dict(data)
|
|
372
|
+
run: RunResponse = cast(RunResponse, evt.run)
|
|
373
|
+
|
|
374
|
+
# Process the run based on status
|
|
375
|
+
if run.status == "success":
|
|
376
|
+
print(f"Run {run.id} completed successfully!")
|
|
377
|
+
print(f"Output: {run.output_data}")
|
|
378
|
+
|
|
379
|
+
return {"ok": True}
|
|
380
|
+
except WebhookVerificationError:
|
|
381
|
+
raise HTTPException(status_code=400, detail="Invalid signature")
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Important**: The SDK uses `attrs` classes (not Pydantic), so use `RunCompletedEvent.from_dict(data)` instead of `model_validate(data)`.
|
|
385
|
+
|
|
386
|
+
### Testing Webhooks Locally
|
|
387
|
+
|
|
388
|
+
See [tests/webhooks/WEBHOOK_TESTING.md](./tests/webhooks/WEBHOOK_TESTING.md) for a complete guide on testing webhooks locally without exposing your server to the internet.
|
|
389
|
+
|
|
390
|
+
Quick start:
|
|
391
|
+
```bash
|
|
392
|
+
# Install SDK with testing dependencies
|
|
393
|
+
pip install "cyberdesk[testing]"
|
|
394
|
+
|
|
395
|
+
# Set up .env file
|
|
396
|
+
cp .env.example .env
|
|
397
|
+
# Edit .env with your SVIX_WEBHOOK_SECRET
|
|
398
|
+
|
|
399
|
+
# Run the example webhook handler
|
|
400
|
+
python -m uvicorn tests.webhooks.example_webhook_handler:app --reload
|
|
401
|
+
|
|
402
|
+
# In another terminal, test it
|
|
403
|
+
python -m tests.webhooks.test_webhook_local
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Example Files
|
|
407
|
+
|
|
408
|
+
All webhook testing resources are in the `tests/webhooks/` directory:
|
|
409
|
+
- `tests/webhooks/example_webhook_handler.py` - Complete, production-ready webhook handler
|
|
410
|
+
- `tests/webhooks/test_webhook_local.py` - Utility to test webhooks locally
|
|
411
|
+
- `tests/webhooks/test_webhook_integration.py` - pytest integration tests
|
|
412
|
+
- `tests/webhooks/WEBHOOK_TESTING.md` - Comprehensive testing guide
|
|
413
|
+
- `tests/webhooks/WEBHOOK_QUICKSTART.md` - Quick reference guide
|
|
414
|
+
|
|
415
|
+
## Testing
|
|
416
|
+
|
|
417
|
+
The SDK includes comprehensive testing utilities:
|
|
418
|
+
|
|
419
|
+
### Quick Test
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
# Install with test dependencies
|
|
423
|
+
pip install ".[testing]"
|
|
424
|
+
|
|
425
|
+
# Set up environment
|
|
426
|
+
cp .env.example .env
|
|
427
|
+
# Edit .env with your credentials
|
|
428
|
+
|
|
429
|
+
# Run all tests
|
|
430
|
+
pytest tests/ -v
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Test Categories
|
|
434
|
+
|
|
435
|
+
- **Webhook Tests** (`tests/webhooks/`) - Test webhook handlers locally, no real API
|
|
436
|
+
- **Integration Tests** (`tests/integration/`) - Test SDK with real API calls
|
|
437
|
+
|
|
438
|
+
See [TESTING.md](./TESTING.md) for complete testing documentation.
|
|
439
|
+
|
|
284
440
|
## Limitations
|
|
285
441
|
|
|
286
442
|
- **Screenshot API**: The `/v1/computer/{machine_id}/display/screenshot` endpoint is not included in the generated client due to limitations with binary (PNG) responses in the openapi-python-client generator. This can be added manually if needed - see the TODO comment in `client.py`.
|
|
@@ -289,7 +445,7 @@ from cyberdesk import (
|
|
|
289
445
|
|
|
290
446
|
- Python 3.8+
|
|
291
447
|
- httpx
|
|
292
|
-
-
|
|
448
|
+
- attrs (used by the auto-generated OpenAPI client)
|
|
293
449
|
|
|
294
450
|
## License
|
|
295
451
|
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: cyberdesk
|
|
3
|
-
Version: 2.1.16
|
|
4
|
-
Summary: The official Python SDK for Cyberdesk
|
|
5
|
-
Author-email: Cyberdesk Team <dev@cyberdesk.io>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
License-File: LICENSE
|
|
9
|
-
Requires-Dist: httpx
|
|
10
|
-
Requires-Dist: attrs
|
|
11
|
-
Provides-Extra: dev
|
|
12
|
-
Requires-Dist: openapi-python-client; extra == "dev"
|
|
13
|
-
Requires-Dist: build; extra == "dev"
|
|
14
|
-
Requires-Dist: twine; extra == "dev"
|
|
15
|
-
Dynamic: license-file
|
|
16
|
-
|
|
17
1
|
# Cyberdesk Python SDK
|
|
18
2
|
|
|
19
3
|
The official Python SDK for Cyberdesk API. This SDK provides a clean, type-safe interface for interacting with all Cyberdesk resources including machines, workflows, runs, connections, and trajectories.
|
|
@@ -21,7 +5,14 @@ The official Python SDK for Cyberdesk API. This SDK provides a clean, type-safe
|
|
|
21
5
|
## Installation
|
|
22
6
|
|
|
23
7
|
```bash
|
|
8
|
+
# Basic SDK installation
|
|
24
9
|
pip install cyberdesk
|
|
10
|
+
|
|
11
|
+
# With testing utilities
|
|
12
|
+
pip install "cyberdesk[testing]"
|
|
13
|
+
|
|
14
|
+
# All development dependencies (for SDK contributors)
|
|
15
|
+
pip install "cyberdesk[all]"
|
|
25
16
|
```
|
|
26
17
|
|
|
27
18
|
## Quick Start
|
|
@@ -66,6 +57,38 @@ else:
|
|
|
66
57
|
print("Run failed:", ", ".join(run.error or []))
|
|
67
58
|
```
|
|
68
59
|
|
|
60
|
+
## Desktop Parameters
|
|
61
|
+
|
|
62
|
+
Configure machine-specific values that automatically populate workflows running on specific desktops:
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from cyberdesk import MachineUpdate
|
|
66
|
+
|
|
67
|
+
# Set desktop parameters for a machine
|
|
68
|
+
client.machines.update_sync(
|
|
69
|
+
machine_id="machine-id",
|
|
70
|
+
data=MachineUpdate(
|
|
71
|
+
machine_parameters={
|
|
72
|
+
"username": "machine_specific_user",
|
|
73
|
+
"api_url": "https://api-region-east.example.com",
|
|
74
|
+
"config_path": "C:\\MachineA\\config.json"
|
|
75
|
+
},
|
|
76
|
+
machine_sensitive_parameters={
|
|
77
|
+
"password": "actual_secret_value", # Stored securely in Basis Theory
|
|
78
|
+
"api_key": "actual_api_key_123"
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Use in workflows with standard syntax:
|
|
85
|
+
```
|
|
86
|
+
Log in to {api_url} using {username} and password {$password}.
|
|
87
|
+
Then open the config at {config_path}.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Desktop parameters automatically override run-level inputs and persist across runs. See the [Desktop Parameters docs](https://docs.cyberdesk.io/concepts/desktop-parameters) for more details.
|
|
91
|
+
|
|
69
92
|
## Full Documentation
|
|
70
93
|
|
|
71
94
|
For complete documentation including async/sync usage, error handling, and all available methods, visit:
|
|
@@ -281,6 +304,106 @@ from cyberdesk import (
|
|
|
281
304
|
)
|
|
282
305
|
```
|
|
283
306
|
|
|
307
|
+
## Webhooks
|
|
308
|
+
|
|
309
|
+
### Handling Webhooks
|
|
310
|
+
|
|
311
|
+
Cyberdesk sends webhooks when important events occur (e.g., workflow completion). To handle webhooks:
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
import os
|
|
315
|
+
from fastapi import FastAPI, Request, HTTPException
|
|
316
|
+
from svix.webhooks import Webhook, WebhookVerificationError
|
|
317
|
+
from openapi_client.cyberdesk_cloud_client.models.run_completed_event import RunCompletedEvent
|
|
318
|
+
from openapi_client.cyberdesk_cloud_client.models.run_response import RunResponse
|
|
319
|
+
from typing import cast
|
|
320
|
+
|
|
321
|
+
app = FastAPI()
|
|
322
|
+
|
|
323
|
+
@app.post("/webhooks/cyberdesk")
|
|
324
|
+
async def cyberdesk_webhook(request: Request):
|
|
325
|
+
secret = os.environ["SVIX_WEBHOOK_SECRET"]
|
|
326
|
+
wh = Webhook(secret)
|
|
327
|
+
|
|
328
|
+
payload = await request.body()
|
|
329
|
+
headers = {
|
|
330
|
+
"svix-id": request.headers.get("svix-id"),
|
|
331
|
+
"svix-timestamp": request.headers.get("svix-timestamp"),
|
|
332
|
+
"svix-signature": request.headers.get("svix-signature"),
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
try:
|
|
336
|
+
data = wh.verify(payload, headers)
|
|
337
|
+
# IMPORTANT: Use from_dict() for attrs classes, NOT model_validate()
|
|
338
|
+
evt = RunCompletedEvent.from_dict(data)
|
|
339
|
+
run: RunResponse = cast(RunResponse, evt.run)
|
|
340
|
+
|
|
341
|
+
# Process the run based on status
|
|
342
|
+
if run.status == "success":
|
|
343
|
+
print(f"Run {run.id} completed successfully!")
|
|
344
|
+
print(f"Output: {run.output_data}")
|
|
345
|
+
|
|
346
|
+
return {"ok": True}
|
|
347
|
+
except WebhookVerificationError:
|
|
348
|
+
raise HTTPException(status_code=400, detail="Invalid signature")
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Important**: The SDK uses `attrs` classes (not Pydantic), so use `RunCompletedEvent.from_dict(data)` instead of `model_validate(data)`.
|
|
352
|
+
|
|
353
|
+
### Testing Webhooks Locally
|
|
354
|
+
|
|
355
|
+
See [tests/webhooks/WEBHOOK_TESTING.md](./tests/webhooks/WEBHOOK_TESTING.md) for a complete guide on testing webhooks locally without exposing your server to the internet.
|
|
356
|
+
|
|
357
|
+
Quick start:
|
|
358
|
+
```bash
|
|
359
|
+
# Install SDK with testing dependencies
|
|
360
|
+
pip install "cyberdesk[testing]"
|
|
361
|
+
|
|
362
|
+
# Set up .env file
|
|
363
|
+
cp .env.example .env
|
|
364
|
+
# Edit .env with your SVIX_WEBHOOK_SECRET
|
|
365
|
+
|
|
366
|
+
# Run the example webhook handler
|
|
367
|
+
python -m uvicorn tests.webhooks.example_webhook_handler:app --reload
|
|
368
|
+
|
|
369
|
+
# In another terminal, test it
|
|
370
|
+
python -m tests.webhooks.test_webhook_local
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Example Files
|
|
374
|
+
|
|
375
|
+
All webhook testing resources are in the `tests/webhooks/` directory:
|
|
376
|
+
- `tests/webhooks/example_webhook_handler.py` - Complete, production-ready webhook handler
|
|
377
|
+
- `tests/webhooks/test_webhook_local.py` - Utility to test webhooks locally
|
|
378
|
+
- `tests/webhooks/test_webhook_integration.py` - pytest integration tests
|
|
379
|
+
- `tests/webhooks/WEBHOOK_TESTING.md` - Comprehensive testing guide
|
|
380
|
+
- `tests/webhooks/WEBHOOK_QUICKSTART.md` - Quick reference guide
|
|
381
|
+
|
|
382
|
+
## Testing
|
|
383
|
+
|
|
384
|
+
The SDK includes comprehensive testing utilities:
|
|
385
|
+
|
|
386
|
+
### Quick Test
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
# Install with test dependencies
|
|
390
|
+
pip install ".[testing]"
|
|
391
|
+
|
|
392
|
+
# Set up environment
|
|
393
|
+
cp .env.example .env
|
|
394
|
+
# Edit .env with your credentials
|
|
395
|
+
|
|
396
|
+
# Run all tests
|
|
397
|
+
pytest tests/ -v
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Test Categories
|
|
401
|
+
|
|
402
|
+
- **Webhook Tests** (`tests/webhooks/`) - Test webhook handlers locally, no real API
|
|
403
|
+
- **Integration Tests** (`tests/integration/`) - Test SDK with real API calls
|
|
404
|
+
|
|
405
|
+
See [TESTING.md](./TESTING.md) for complete testing documentation.
|
|
406
|
+
|
|
284
407
|
## Limitations
|
|
285
408
|
|
|
286
409
|
- **Screenshot API**: The `/v1/computer/{machine_id}/display/screenshot` endpoint is not included in the generated client due to limitations with binary (PNG) responses in the openapi-python-client generator. This can be added manually if needed - see the TODO comment in `client.py`.
|
|
@@ -289,8 +412,8 @@ from cyberdesk import (
|
|
|
289
412
|
|
|
290
413
|
- Python 3.8+
|
|
291
414
|
- httpx
|
|
292
|
-
-
|
|
415
|
+
- attrs (used by the auto-generated OpenAPI client)
|
|
293
416
|
|
|
294
417
|
## License
|
|
295
418
|
|
|
296
|
-
MIT License - see LICENSE file for details.
|
|
419
|
+
MIT License - see LICENSE file for details.
|