cyberdesk 1.5.0__tar.gz → 2.1.20__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.
- cyberdesk-2.1.20/PKG-INFO +452 -0
- cyberdesk-2.1.20/README.md +419 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk/__init__.py +22 -1
- cyberdesk-2.1.20/cyberdesk/client.py +1977 -0
- cyberdesk-2.1.20/cyberdesk/types.py +110 -0
- cyberdesk-2.1.20/cyberdesk.egg-info/PKG-INFO +452 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/SOURCES.txt +89 -1
- cyberdesk-2.1.20/cyberdesk.egg-info/requires.txt +26 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/copy_to_clipboard_v1_computer_machine_id_copy_to_clipboard_post.py +221 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_list_v1_computer_machine_id_fs_list_get.py +190 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_read_v1_computer_machine_id_fs_read_get.py +190 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_write_v1_computer_machine_id_fs_write_post.py +203 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/get_display_dimensions_v1_computer_machine_id_display_dimensions_get.py +2 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/get_mouse_position_v1_computer_machine_id_input_mouse_position_get.py +2 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/get_screenshot_v1_computer_machine_id_display_screenshot_get.py +1 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/keyboard_key_v1_computer_machine_id_input_keyboard_key_post.py +2 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/keyboard_type_v1_computer_machine_id_input_keyboard_type_post.py +2 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_click_v1_computer_machine_id_input_mouse_click_post.py +2 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/mouse_drag_v1_computer_machine_id_input_mouse_drag_post.py +185 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_move_v1_computer_machine_id_input_mouse_move_post.py +2 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/mouse_scroll_v1_computer_machine_id_input_mouse_scroll_post.py +189 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py +221 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/powershell_session_v1_computer_machine_id_shell_powershell_session_post.py +221 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/create_connection_v1_connections_post.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/delete_connection_v1_connections_connection_id_delete.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/get_connection_v1_connections_connection_id_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/list_connections_v1_connections_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/update_connection_v1_connections_connection_id_patch.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/default/health_db_health_db_get.py +80 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/default/health_health_get.py +18 -37
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/root_get.py +1 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py +88 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/health_check_v1_health_get.py +1 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/create_machine_v1_machines_post.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/delete_machine_v1_machines_machine_id_delete.py +22 -8
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_pools_v1_machines_machine_id_pools_get.py +171 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_v1_machines_machine_id_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/list_machines_v1_machines_get.py +59 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_pools_v1_machines_machine_id_pools_put.py +192 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_v1_machines_machine_id_patch.py +18 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/add_machines_to_pool_v1_pools_pool_id_machines_post.py +188 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/create_pool_v1_pools_post.py +174 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/delete_pool_v1_pools_pool_id_delete.py +164 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/get_pool_v1_pools_pool_id_get.py +187 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/list_pools_v1_pools_get.py +23 -29
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/remove_machines_from_pool_v1_pools_pool_id_machines_delete.py +186 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/update_pool_v1_pools_pool_id_patch.py +188 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/create_request_log_v1_request_logs_post.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/delete_request_log_v1_request_logs_log_id_delete.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/get_request_log_v1_request_logs_log_id_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/list_request_logs_v1_request_logs_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/update_request_log_v1_request_logs_log_id_patch.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/create_run_attachment_v1_run_attachments_post.py +186 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/delete_run_attachment_v1_run_attachments_attachment_id_delete.py +172 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/download_run_attachment_v1_run_attachments_attachment_id_download_get.py +174 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_download_url_v1_run_attachments_attachment_id_download_url_get.py +211 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_v1_run_attachments_attachment_id_get.py +174 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/list_run_attachments_v1_run_attachments_get.py +70 -49
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/update_run_attachment_v1_run_attachments_attachment_id_put.py +196 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/bulk_create_runs_v1_runs_bulk_post.py +202 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/create_run_chain_v1_runs_chain_post.py +194 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_v1_runs_post.py +14 -8
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/delete_run_v1_runs_run_id_delete.py +10 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/get_run_v1_runs_run_id_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/list_runs_v1_runs_get.py +116 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/retry_run_v1_runs_run_id_retry_post.py +232 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/update_run_v1_runs_run_id_patch.py +10 -12
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/test/dummy_test_endpoint_v1_test_post.py +1 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/trajectories/__init__.py +1 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/create_trajectory_v1_trajectories_post.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/delete_trajectory_v1_trajectories_trajectory_id_delete.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_latest_trajectory_for_workflow_v1_workflows_workflow_id_latest_trajectory_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_trajectory_v1_trajectories_trajectory_id_get.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py +356 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/update_trajectory_v1_trajectories_trajectory_id_patch.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/workflows/__init__.py +1 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/create_workflow_v1_workflows_post.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/delete_workflow_v1_workflows_workflow_id_delete.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_v1_workflows_workflow_id_get.py +6 -4
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_versions_v1_workflows_workflow_id_versions_get.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py +301 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/update_workflow_v1_workflows_workflow_id_patch.py +6 -4
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/__init__.py +231 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/attachment_type.py +9 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step.py +156 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step_inputs_type_0.py +74 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/database_health_check_v1_health_db_get_response_database_health_check_v1_health_db_get.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step_sensitive_inputs_type_0.py +5 -5
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/copy_to_clipboard_request.py +59 -0
- cyberdesk-2.1.20/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.20/openapi_client/cyberdesk_cloud_client/models/file_input.py +99 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/file_write_request.py +78 -0
- cyberdesk-2.1.20/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 +44 -0
- cyberdesk-2.1.20/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 +44 -0
- cyberdesk-2.1.20/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 +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/health_health_get_response_health_health_get.py +44 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_create.py +80 -1
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_sensitive_parameters_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_pool_assignment.py +69 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_pool_update.py +69 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response.py +426 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_sensitive_parameters_type_0.py +44 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_update.py +112 -1
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_parameters_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_sensitive_parameters_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/mouse_drag_request.py +125 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/mouse_scroll_request.py +109 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/paginated_response_pool_response.py +97 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_attachment_response.py +97 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/workflow_create.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_create.py +22 -22
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_response.py +137 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/workflow_update.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_update.py +17 -17
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_with_machines.py +162 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/power_shell_exec_request.py +131 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/power_shell_session_request.py +81 -0
- cyberdesk-2.1.20/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 +47 -0
- cyberdesk-2.1.20/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 +47 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/ref_value.py +61 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_response.py +20 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_create.py +157 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_download_url_response.py +68 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_response.py +231 -0
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/run_create.py → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_update.py +25 -35
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create.py +306 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_response.py +96 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_sensitive_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_completed_event.py +112 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create.py +338 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create_sensitive_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_field.py +21 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response.py +516 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response_sensitive_input_aliases_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry.py +312 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_sensitive_input_values_type_0.py +44 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update.py +33 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_update_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +181 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_create_original_input_values_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +256 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_response_original_input_values_type_0.py +44 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update.py +60 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create.py +315 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_inputs_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_sensitive_inputs_type_0.py +44 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_response.py +77 -0
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_create.py +120 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response.py +97 -8
- cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_update.py +152 -0
- cyberdesk-2.1.20/pyproject.toml +45 -0
- cyberdesk-1.5.0/PKG-INFO +0 -274
- cyberdesk-1.5.0/README.md +0 -258
- cyberdesk-1.5.0/cyberdesk/client.py +0 -784
- cyberdesk-1.5.0/cyberdesk.egg-info/PKG-INFO +0 -274
- cyberdesk-1.5.0/cyberdesk.egg-info/requires.txt +0 -7
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/__init__.py +0 -109
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/machine_response.py +0 -202
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/run_response.py +0 -245
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +0 -93
- cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +0 -127
- cyberdesk-1.5.0/pyproject.toml +0 -25
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/LICENSE +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/dependency_links.txt +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/top_level.txt +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/__init__.py +0 -0
- {cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/request_logs → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools}/__init__.py +0 -0
- {cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/runs → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/request_logs}/__init__.py +0 -0
- {cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/test → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments}/__init__.py +0 -0
- {cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/trajectories → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs}/__init__.py +0 -0
- {cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/api/workflows → cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/test}/__init__.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/client.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/errors.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_create.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_status.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/display_dimensions.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/dummy_test_endpoint_v1_test_post_response_dummy_test_endpoint_v1_test_post.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/get_workflow_versions_v1_workflows_workflow_id_versions_get_response_200_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/health_check_v1_health_get_response_health_check_v1_health_get.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/http_validation_error.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_key_request.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_type_request.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_status.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_click_request.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_move_request.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_position.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_connection_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_machine_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_trajectory_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_workflow_response.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_create.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_update.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_output_data_type_0.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_run_message_history_type_0_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_status.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_output_data_type_0.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_run_message_history_type_0_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_dimensions.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_trajectory_data_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_dimensions.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_trajectory_data_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update_trajectory_data_type_0_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/validation_error.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response_old_versions_type_0_item.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/py.typed +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/types.py +0 -0
- {cyberdesk-1.5.0 → cyberdesk-2.1.20}/setup.cfg +0 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cyberdesk
|
|
3
|
+
Version: 2.1.20
|
|
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
|
+
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"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# Cyberdesk Python SDK
|
|
35
|
+
|
|
36
|
+
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.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Basic SDK installation
|
|
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]"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
The most common use case is to execute workflows that you've created in the [Cyberdesk Dashboard](https://cyberdesk.io/dashboard).
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from cyberdesk import CyberdeskClient, RunCreate
|
|
57
|
+
import time
|
|
58
|
+
|
|
59
|
+
# Initialize the client
|
|
60
|
+
client = CyberdeskClient(api_key="your-api-key")
|
|
61
|
+
|
|
62
|
+
# Create a run for your workflow
|
|
63
|
+
run_data = RunCreate(
|
|
64
|
+
workflow_id="your-workflow-id",
|
|
65
|
+
machine_id="your-machine-id",
|
|
66
|
+
input_values={
|
|
67
|
+
# Your workflow-specific input data
|
|
68
|
+
"patient_id": "12345",
|
|
69
|
+
"patient_first_name": "John",
|
|
70
|
+
"patient_last_name": "Doe"
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
response = client.runs.create_sync(run_data)
|
|
75
|
+
if response.error:
|
|
76
|
+
print(f"Error creating run: {response.error}")
|
|
77
|
+
else:
|
|
78
|
+
run = response.data
|
|
79
|
+
|
|
80
|
+
# Wait for the run to complete
|
|
81
|
+
while run.status in ["scheduling", "running"]:
|
|
82
|
+
time.sleep(5) # Wait 5 seconds
|
|
83
|
+
response = client.runs.get_sync(run.id)
|
|
84
|
+
run = response.data
|
|
85
|
+
|
|
86
|
+
# Get the output data
|
|
87
|
+
if run.status == "success":
|
|
88
|
+
print("Result:", run.output_data)
|
|
89
|
+
else:
|
|
90
|
+
print("Run failed:", ", ".join(run.error or []))
|
|
91
|
+
```
|
|
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
|
+
|
|
125
|
+
## Full Documentation
|
|
126
|
+
|
|
127
|
+
For complete documentation including async/sync usage, error handling, and all available methods, visit:
|
|
128
|
+
|
|
129
|
+
**[https://docs.cyberdesk.io/sdk-guides/python](https://docs.cyberdesk.io/sdk-guides/python)**
|
|
130
|
+
|
|
131
|
+
## Async Support
|
|
132
|
+
|
|
133
|
+
The SDK provides both synchronous and asynchronous methods for all operations:
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
import asyncio
|
|
137
|
+
from cyberdesk import CyberdeskClient
|
|
138
|
+
|
|
139
|
+
async def main():
|
|
140
|
+
client = CyberdeskClient(api_key="your-api-key")
|
|
141
|
+
|
|
142
|
+
# Async method
|
|
143
|
+
response = await client.machines.list()
|
|
144
|
+
if response.data:
|
|
145
|
+
for machine in response.data.items:
|
|
146
|
+
print(f"Machine: {machine.name}")
|
|
147
|
+
|
|
148
|
+
asyncio.run(main())
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Resources
|
|
152
|
+
|
|
153
|
+
### Machines
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
# List machines
|
|
157
|
+
response = client.machines.list_sync(
|
|
158
|
+
skip=0,
|
|
159
|
+
limit=10,
|
|
160
|
+
status=MachineStatus.ACTIVE
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Get a specific machine
|
|
164
|
+
response = client.machines.get_sync("machine-id")
|
|
165
|
+
|
|
166
|
+
# Create a machine
|
|
167
|
+
from cyberdesk import MachineCreate
|
|
168
|
+
|
|
169
|
+
machine = MachineCreate(
|
|
170
|
+
name="My Machine",
|
|
171
|
+
provider="azure",
|
|
172
|
+
region="eastus"
|
|
173
|
+
)
|
|
174
|
+
response = client.machines.create_sync(machine)
|
|
175
|
+
|
|
176
|
+
# Update a machine
|
|
177
|
+
from cyberdesk import MachineUpdate
|
|
178
|
+
|
|
179
|
+
update = MachineUpdate(name="Updated Name")
|
|
180
|
+
response = client.machines.update_sync("machine-id", update)
|
|
181
|
+
|
|
182
|
+
# Delete a machine
|
|
183
|
+
response = client.machines.delete_sync("machine-id")
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Workflows
|
|
187
|
+
|
|
188
|
+
```python
|
|
189
|
+
# List workflows
|
|
190
|
+
response = client.workflows.list_sync()
|
|
191
|
+
|
|
192
|
+
# Get a workflow
|
|
193
|
+
response = client.workflows.get_sync("workflow-id")
|
|
194
|
+
|
|
195
|
+
# Create a workflow
|
|
196
|
+
from cyberdesk import WorkflowCreate
|
|
197
|
+
|
|
198
|
+
workflow = WorkflowCreate(
|
|
199
|
+
name="My Workflow",
|
|
200
|
+
description="Description"
|
|
201
|
+
)
|
|
202
|
+
response = client.workflows.create_sync(workflow)
|
|
203
|
+
|
|
204
|
+
# Update a workflow
|
|
205
|
+
from cyberdesk import WorkflowUpdate
|
|
206
|
+
|
|
207
|
+
update = WorkflowUpdate(description="New description")
|
|
208
|
+
response = client.workflows.update_sync("workflow-id", update)
|
|
209
|
+
|
|
210
|
+
# Delete a workflow
|
|
211
|
+
response = client.workflows.delete_sync("workflow-id")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Runs
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
# List runs with filtering
|
|
218
|
+
response = client.runs.list_sync(
|
|
219
|
+
workflow_id="workflow-id",
|
|
220
|
+
machine_id="machine-id",
|
|
221
|
+
status=RunStatus.RUNNING
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Create a run
|
|
225
|
+
from cyberdesk import RunCreate
|
|
226
|
+
|
|
227
|
+
run = RunCreate(
|
|
228
|
+
workflow_id="workflow-id",
|
|
229
|
+
machine_id="machine-id"
|
|
230
|
+
)
|
|
231
|
+
response = client.runs.create_sync(run)
|
|
232
|
+
|
|
233
|
+
# Get run details
|
|
234
|
+
response = client.runs.get_sync("run-id")
|
|
235
|
+
|
|
236
|
+
# Update run status
|
|
237
|
+
from cyberdesk import RunUpdate
|
|
238
|
+
|
|
239
|
+
update = RunUpdate(status=RunStatus.COMPLETED)
|
|
240
|
+
response = client.runs.update_sync("run-id", update)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Connections
|
|
244
|
+
|
|
245
|
+
```python
|
|
246
|
+
# List connections
|
|
247
|
+
response = client.connections.list_sync(
|
|
248
|
+
machine_id="machine-id",
|
|
249
|
+
status=ConnectionStatus.ACTIVE
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Create a connection
|
|
253
|
+
from cyberdesk import ConnectionCreate
|
|
254
|
+
|
|
255
|
+
connection = ConnectionCreate(
|
|
256
|
+
machine_id="machine-id",
|
|
257
|
+
connection_type="vnc"
|
|
258
|
+
)
|
|
259
|
+
response = client.connections.create_sync(connection)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Trajectories
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
# List trajectories
|
|
266
|
+
response = client.trajectories.list_sync(workflow_id="workflow-id")
|
|
267
|
+
|
|
268
|
+
# Create a trajectory
|
|
269
|
+
from cyberdesk import TrajectoryCreate
|
|
270
|
+
|
|
271
|
+
trajectory = TrajectoryCreate(
|
|
272
|
+
workflow_id="workflow-id",
|
|
273
|
+
trajectory_data=[{"action": "click", "x": 100, "y": 200}]
|
|
274
|
+
)
|
|
275
|
+
response = client.trajectories.create_sync(trajectory)
|
|
276
|
+
|
|
277
|
+
# Get latest trajectory for a workflow
|
|
278
|
+
response = client.trajectories.get_latest_for_workflow_sync("workflow-id")
|
|
279
|
+
|
|
280
|
+
# Update a trajectory
|
|
281
|
+
from cyberdesk import TrajectoryUpdate
|
|
282
|
+
|
|
283
|
+
update = TrajectoryUpdate(
|
|
284
|
+
trajectory_data=[{"action": "type", "text": "Hello"}]
|
|
285
|
+
)
|
|
286
|
+
response = client.trajectories.update_sync("trajectory-id", update)
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Error Handling
|
|
290
|
+
|
|
291
|
+
All methods return an `ApiResponse` object with `data` and `error` attributes:
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
response = client.machines.get_sync("invalid-id")
|
|
295
|
+
if response.error:
|
|
296
|
+
print(f"Error: {response.error}")
|
|
297
|
+
else:
|
|
298
|
+
print(f"Machine: {response.data.name}")
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Context Manager
|
|
302
|
+
|
|
303
|
+
The client can be used as a context manager:
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
with CyberdeskClient(api_key="your-api-key") as client:
|
|
307
|
+
response = client.machines.list_sync()
|
|
308
|
+
# Client will be properly closed when exiting the context
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Configuration
|
|
312
|
+
|
|
313
|
+
You can specify a custom API base URL:
|
|
314
|
+
|
|
315
|
+
```python
|
|
316
|
+
client = CyberdeskClient(
|
|
317
|
+
api_key="your-api-key",
|
|
318
|
+
base_url="https://custom-api.cyberdesk.io"
|
|
319
|
+
)
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Type Safety
|
|
323
|
+
|
|
324
|
+
The SDK is fully typed and exports all request/response models:
|
|
325
|
+
|
|
326
|
+
```python
|
|
327
|
+
from cyberdesk import (
|
|
328
|
+
MachineCreate,
|
|
329
|
+
MachineUpdate,
|
|
330
|
+
MachineResponse,
|
|
331
|
+
MachineStatus,
|
|
332
|
+
WorkflowCreate,
|
|
333
|
+
WorkflowResponse,
|
|
334
|
+
RunCreate,
|
|
335
|
+
RunStatus,
|
|
336
|
+
# ... and more
|
|
337
|
+
)
|
|
338
|
+
```
|
|
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
|
+
|
|
440
|
+
## Limitations
|
|
441
|
+
|
|
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`.
|
|
443
|
+
|
|
444
|
+
## Requirements
|
|
445
|
+
|
|
446
|
+
- Python 3.8+
|
|
447
|
+
- httpx
|
|
448
|
+
- attrs (used by the auto-generated OpenAPI client)
|
|
449
|
+
|
|
450
|
+
## License
|
|
451
|
+
|
|
452
|
+
MIT License - see LICENSE file for details.
|