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.
Files changed (219) hide show
  1. cyberdesk-2.1.20/PKG-INFO +452 -0
  2. cyberdesk-2.1.20/README.md +419 -0
  3. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk/__init__.py +22 -1
  4. cyberdesk-2.1.20/cyberdesk/client.py +1977 -0
  5. cyberdesk-2.1.20/cyberdesk/types.py +110 -0
  6. cyberdesk-2.1.20/cyberdesk.egg-info/PKG-INFO +452 -0
  7. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/SOURCES.txt +89 -1
  8. cyberdesk-2.1.20/cyberdesk.egg-info/requires.txt +26 -0
  9. 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
  10. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_list_v1_computer_machine_id_fs_list_get.py +190 -0
  11. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_read_v1_computer_machine_id_fs_read_get.py +190 -0
  12. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/fs_write_v1_computer_machine_id_fs_write_post.py +203 -0
  13. {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
  14. {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
  15. {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
  16. {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
  17. {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
  18. {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
  19. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/mouse_drag_v1_computer_machine_id_input_mouse_drag_post.py +185 -0
  20. {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
  21. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/mouse_scroll_v1_computer_machine_id_input_mouse_scroll_post.py +189 -0
  22. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py +221 -0
  23. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/computer/powershell_session_v1_computer_machine_id_shell_powershell_session_post.py +221 -0
  24. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/create_connection_v1_connections_post.py +6 -4
  25. {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
  26. {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
  27. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/list_connections_v1_connections_get.py +6 -4
  28. {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
  29. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/default/health_db_health_db_get.py +80 -0
  30. 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
  31. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/root_get.py +1 -0
  32. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py +88 -0
  33. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/health_check_v1_health_get.py +1 -0
  34. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/create_machine_v1_machines_post.py +6 -4
  35. {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
  36. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_pools_v1_machines_machine_id_pools_get.py +171 -0
  37. {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
  38. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/list_machines_v1_machines_get.py +59 -4
  39. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_pools_v1_machines_machine_id_pools_put.py +192 -0
  40. {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
  41. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/add_machines_to_pool_v1_pools_pool_id_machines_post.py +188 -0
  42. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/create_pool_v1_pools_post.py +174 -0
  43. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/delete_pool_v1_pools_pool_id_delete.py +164 -0
  44. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/get_pool_v1_pools_pool_id_get.py +187 -0
  45. 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
  46. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/remove_machines_from_pool_v1_pools_pool_id_machines_delete.py +186 -0
  47. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/pools/update_pool_v1_pools_pool_id_patch.py +188 -0
  48. {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
  49. {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
  50. {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
  51. {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
  52. {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
  53. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/create_run_attachment_v1_run_attachments_post.py +186 -0
  54. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/delete_run_attachment_v1_run_attachments_attachment_id_delete.py +172 -0
  55. 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
  56. 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
  57. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_v1_run_attachments_attachment_id_get.py +174 -0
  58. 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
  59. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/run_attachments/update_run_attachment_v1_run_attachments_attachment_id_put.py +196 -0
  60. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/bulk_create_runs_v1_runs_bulk_post.py +202 -0
  61. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/create_run_chain_v1_runs_chain_post.py +194 -0
  62. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_v1_runs_post.py +14 -8
  63. {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
  64. {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
  65. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/list_runs_v1_runs_get.py +116 -4
  66. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/runs/retry_run_v1_runs_run_id_retry_post.py +232 -0
  67. {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
  68. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/test/dummy_test_endpoint_v1_test_post.py +1 -0
  69. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/trajectories/__init__.py +1 -0
  70. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/create_trajectory_v1_trajectories_post.py +6 -4
  71. {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
  72. {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
  73. {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
  74. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py +356 -0
  75. {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
  76. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/workflows/__init__.py +1 -0
  77. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/create_workflow_v1_workflows_post.py +6 -4
  78. {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
  79. {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
  80. {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
  81. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py +301 -0
  82. {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
  83. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/__init__.py +231 -0
  84. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/attachment_type.py +9 -0
  85. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step.py +156 -0
  86. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step_inputs_type_0.py +74 -0
  87. 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
  88. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/copy_to_clipboard_request.py +59 -0
  89. 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
  90. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/file_input.py +99 -0
  91. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/file_write_request.py +78 -0
  92. 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
  93. 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
  94. 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
  95. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/health_health_get_response_health_health_get.py +44 -0
  96. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_create.py +80 -1
  97. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_parameters_type_0.py +44 -0
  98. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_sensitive_parameters_type_0.py +44 -0
  99. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_pool_assignment.py +69 -0
  100. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_pool_update.py +69 -0
  101. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response.py +426 -0
  102. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_parameters_type_0.py +44 -0
  103. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_sensitive_parameters_type_0.py +44 -0
  104. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_update.py +112 -1
  105. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_parameters_type_0.py +44 -0
  106. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_sensitive_parameters_type_0.py +44 -0
  107. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/mouse_drag_request.py +125 -0
  108. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/mouse_scroll_request.py +109 -0
  109. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/paginated_response_pool_response.py +97 -0
  110. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_attachment_response.py +97 -0
  111. 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
  112. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_response.py +137 -0
  113. 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
  114. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/pool_with_machines.py +162 -0
  115. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/power_shell_exec_request.py +131 -0
  116. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/power_shell_session_request.py +81 -0
  117. 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
  118. 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
  119. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/ref_value.py +61 -0
  120. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_response.py +20 -0
  121. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_create.py +157 -0
  122. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_download_url_response.py +68 -0
  123. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_attachment_response.py +231 -0
  124. 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
  125. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create.py +306 -0
  126. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_input_values_type_0.py +44 -0
  127. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_response.py +96 -0
  128. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_sensitive_input_values_type_0.py +44 -0
  129. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_completed_event.py +112 -0
  130. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create.py +338 -0
  131. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create_input_values_type_0.py +44 -0
  132. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_create_sensitive_input_values_type_0.py +44 -0
  133. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_field.py +21 -0
  134. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response.py +516 -0
  135. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response_input_values_type_0.py +44 -0
  136. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_response_sensitive_input_aliases_type_0.py +44 -0
  137. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry.py +312 -0
  138. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_input_values_type_0.py +44 -0
  139. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_sensitive_input_values_type_0.py +44 -0
  140. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update.py +33 -0
  141. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_update_input_values_type_0.py +44 -0
  142. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +181 -0
  143. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_create_original_input_values_type_0.py +44 -0
  144. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +256 -0
  145. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/trajectory_response_original_input_values_type_0.py +44 -0
  146. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update.py +60 -0
  147. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create.py +315 -0
  148. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_inputs_type_0.py +44 -0
  149. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_sensitive_inputs_type_0.py +44 -0
  150. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_chain_response.py +77 -0
  151. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_create.py +120 -0
  152. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response.py +97 -8
  153. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/workflow_update.py +152 -0
  154. cyberdesk-2.1.20/pyproject.toml +45 -0
  155. cyberdesk-1.5.0/PKG-INFO +0 -274
  156. cyberdesk-1.5.0/README.md +0 -258
  157. cyberdesk-1.5.0/cyberdesk/client.py +0 -784
  158. cyberdesk-1.5.0/cyberdesk.egg-info/PKG-INFO +0 -274
  159. cyberdesk-1.5.0/cyberdesk.egg-info/requires.txt +0 -7
  160. cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/__init__.py +0 -109
  161. cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/machine_response.py +0 -202
  162. cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/run_response.py +0 -245
  163. cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +0 -93
  164. cyberdesk-1.5.0/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +0 -127
  165. cyberdesk-1.5.0/pyproject.toml +0 -25
  166. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/LICENSE +0 -0
  167. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/dependency_links.txt +0 -0
  168. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/cyberdesk.egg-info/top_level.txt +0 -0
  169. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/__init__.py +0 -0
  170. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/__init__.py +0 -0
  171. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/__init__.py +0 -0
  172. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/__init__.py +0 -0
  173. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/__init__.py +0 -0
  174. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/__init__.py +0 -0
  175. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/__init__.py +0 -0
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/client.py +0 -0
  182. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/errors.py +0 -0
  183. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_create.py +0 -0
  184. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_response.py +0 -0
  185. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_status.py +0 -0
  186. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/display_dimensions.py +0 -0
  187. {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
  188. {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
  189. {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
  190. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/http_validation_error.py +0 -0
  191. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_key_request.py +0 -0
  192. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_type_request.py +0 -0
  193. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_status.py +0 -0
  194. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_click_request.py +0 -0
  195. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_move_request.py +0 -0
  196. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_position.py +0 -0
  197. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response.py +0 -0
  198. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_connection_response.py +0 -0
  199. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_machine_response.py +0 -0
  200. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_response.py +0 -0
  201. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_trajectory_response.py +0 -0
  202. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_workflow_response.py +0 -0
  203. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_create.py +0 -0
  204. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_update.py +0 -0
  205. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_output_data_type_0.py +0 -0
  206. {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
  207. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_status.py +0 -0
  208. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_output_data_type_0.py +0 -0
  209. {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
  210. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_dimensions.py +0 -0
  211. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_trajectory_data_item.py +0 -0
  212. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_dimensions.py +0 -0
  213. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_trajectory_data_item.py +0 -0
  214. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update_trajectory_data_type_0_item.py +0 -0
  215. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/validation_error.py +0 -0
  216. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response_old_versions_type_0_item.py +0 -0
  217. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/py.typed +0 -0
  218. {cyberdesk-1.5.0 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/types.py +0 -0
  219. {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.