cyberdesk 2.1.10__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 (212) hide show
  1. {cyberdesk-2.1.10/cyberdesk.egg-info → cyberdesk-2.1.20}/PKG-INFO +158 -2
  2. cyberdesk-2.1.10/PKG-INFO → cyberdesk-2.1.20/README.md +141 -18
  3. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/cyberdesk/__init__.py +10 -1
  4. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/cyberdesk/client.py +347 -109
  5. cyberdesk-2.1.20/cyberdesk/types.py +110 -0
  6. cyberdesk-2.1.10/README.md → cyberdesk-2.1.20/cyberdesk.egg-info/PKG-INFO +174 -2
  7. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/cyberdesk.egg-info/SOURCES.txt +18 -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.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/fs_list_v1_computer_machine_id_fs_list_get.py +2 -0
  11. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/fs_read_v1_computer_machine_id_fs_read_get.py +2 -0
  12. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/fs_write_v1_computer_machine_id_fs_write_post.py +2 -0
  13. {cyberdesk-2.1.10 → 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-2.1.10 → 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-2.1.10 → 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-2.1.10 → 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-2.1.10 → 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-2.1.10 → 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-2.1.10 → 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.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/mouse_scroll_v1_computer_machine_id_input_mouse_scroll_post.py +2 -0
  22. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py +2 -0
  23. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/powershell_session_v1_computer_machine_id_shell_powershell_session_post.py +2 -0
  24. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/create_connection_v1_connections_post.py +2 -0
  25. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/delete_connection_v1_connections_connection_id_delete.py +2 -0
  26. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/get_connection_v1_connections_connection_id_get.py +2 -0
  27. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/list_connections_v1_connections_get.py +2 -0
  28. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/update_connection_v1_connections_connection_id_patch.py +2 -0
  29. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/health_db_health_db_get.py +1 -0
  30. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/health_health_get.py +1 -0
  31. {cyberdesk-2.1.10 → 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-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/health_check_v1_health_get.py +1 -0
  34. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/create_machine_v1_machines_post.py +2 -0
  35. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/delete_machine_v1_machines_machine_id_delete.py +18 -4
  36. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_pools_v1_machines_machine_id_pools_get.py +2 -0
  37. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/get_machine_v1_machines_machine_id_get.py +2 -0
  38. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/list_machines_v1_machines_get.py +2 -0
  39. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_pools_v1_machines_machine_id_pools_put.py +2 -0
  40. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/update_machine_v1_machines_machine_id_patch.py +14 -0
  41. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/add_machines_to_pool_v1_pools_pool_id_machines_post.py +2 -0
  42. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/create_pool_v1_pools_post.py +2 -0
  43. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/delete_pool_v1_pools_pool_id_delete.py +2 -0
  44. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/get_pool_v1_pools_pool_id_get.py +2 -0
  45. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/list_pools_v1_pools_get.py +2 -0
  46. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/remove_machines_from_pool_v1_pools_pool_id_machines_delete.py +2 -0
  47. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/update_pool_v1_pools_pool_id_patch.py +2 -0
  48. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/create_request_log_v1_request_logs_post.py +2 -0
  49. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/delete_request_log_v1_request_logs_log_id_delete.py +2 -0
  50. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/get_request_log_v1_request_logs_log_id_get.py +2 -0
  51. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/list_request_logs_v1_request_logs_get.py +2 -0
  52. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/update_request_log_v1_request_logs_log_id_patch.py +2 -0
  53. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/create_run_attachment_v1_run_attachments_post.py +2 -0
  54. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/delete_run_attachment_v1_run_attachments_attachment_id_delete.py +2 -0
  55. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/download_run_attachment_v1_run_attachments_attachment_id_download_get.py +16 -12
  56. {cyberdesk-2.1.10 → 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 +2 -0
  57. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/get_run_attachment_v1_run_attachments_attachment_id_get.py +2 -0
  58. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/list_run_attachments_v1_run_attachments_get.py +2 -0
  59. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/update_run_attachment_v1_run_attachments_attachment_id_put.py +2 -0
  60. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/bulk_create_runs_v1_runs_bulk_post.py +2 -0
  61. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_chain_v1_runs_chain_post.py +2 -0
  62. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/create_run_v1_runs_post.py +2 -0
  63. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/delete_run_v1_runs_run_id_delete.py +2 -0
  64. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/get_run_v1_runs_run_id_get.py +2 -0
  65. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/list_runs_v1_runs_get.py +37 -0
  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-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/update_run_v1_runs_run_id_patch.py +2 -0
  68. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/test/dummy_test_endpoint_v1_test_post.py +1 -0
  69. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/create_trajectory_v1_trajectories_post.py +2 -0
  70. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/delete_trajectory_v1_trajectories_trajectory_id_delete.py +2 -0
  71. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_latest_trajectory_for_workflow_v1_workflows_workflow_id_latest_trajectory_get.py +2 -0
  72. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/get_trajectory_v1_trajectories_trajectory_id_get.py +2 -0
  73. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py +34 -4
  74. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/update_trajectory_v1_trajectories_trajectory_id_patch.py +2 -0
  75. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/create_workflow_v1_workflows_post.py +2 -0
  76. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/delete_workflow_v1_workflows_workflow_id_delete.py +2 -0
  77. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_v1_workflows_workflow_id_get.py +2 -0
  78. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_versions_v1_workflows_workflow_id_versions_get.py +2 -0
  79. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py +2 -0
  80. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/update_workflow_v1_workflows_workflow_id_patch.py +2 -0
  81. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/__init__.py +29 -3
  82. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/chain_step.py +34 -0
  83. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/chain_step_sensitive_inputs_type_0.py +44 -0
  84. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/copy_to_clipboard_request.py +59 -0
  85. 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
  86. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_create.py +80 -1
  87. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_parameters_type_0.py +44 -0
  88. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_create_machine_sensitive_parameters_type_0.py +44 -0
  89. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_response.py +107 -0
  90. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_parameters_type_0.py +44 -0
  91. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_response_machine_sensitive_parameters_type_0.py +44 -0
  92. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_update.py +80 -1
  93. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_parameters_type_0.py +44 -0
  94. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/machine_update_machine_sensitive_parameters_type_0.py +44 -0
  95. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/mouse_drag_request.py +125 -0
  96. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/power_shell_exec_request.py +21 -0
  97. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_field.py +21 -0
  98. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response.py +127 -95
  99. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry.py +312 -0
  100. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_input_values_type_0.py +44 -0
  101. cyberdesk-2.1.20/openapi_client/cyberdesk_cloud_client/models/run_retry_sensitive_input_values_type_0.py +44 -0
  102. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create.py +9 -0
  103. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response.py +8 -0
  104. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update.py +20 -0
  105. cyberdesk-2.1.20/pyproject.toml +45 -0
  106. cyberdesk-2.1.10/cyberdesk.egg-info/requires.txt +0 -7
  107. cyberdesk-2.1.10/openapi_client/cyberdesk_cloud_client/api/health/database_health_check_v1_health_db_get.py +0 -146
  108. cyberdesk-2.1.10/openapi_client/cyberdesk_cloud_client/models/database_health_check_v1_health_db_get_response_database_health_check_v1_health_db_get.py +0 -44
  109. cyberdesk-2.1.10/pyproject.toml +0 -25
  110. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/LICENSE +0 -0
  111. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/cyberdesk.egg-info/dependency_links.txt +0 -0
  112. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/cyberdesk.egg-info/top_level.txt +0 -0
  113. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/__init__.py +0 -0
  114. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/__init__.py +0 -0
  115. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/computer/__init__.py +0 -0
  116. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/connections/__init__.py +0 -0
  117. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/default/__init__.py +0 -0
  118. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/health/__init__.py +0 -0
  119. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/machines/__init__.py +0 -0
  120. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/pools/__init__.py +0 -0
  121. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/request_logs/__init__.py +0 -0
  122. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/run_attachments/__init__.py +0 -0
  123. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/runs/__init__.py +0 -0
  124. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/test/__init__.py +0 -0
  125. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/trajectories/__init__.py +0 -0
  126. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/api/workflows/__init__.py +0 -0
  127. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/client.py +0 -0
  128. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/errors.py +0 -0
  129. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/attachment_type.py +0 -0
  130. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/chain_step_inputs_type_0.py +0 -0
  131. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_create.py +0 -0
  132. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_response.py +0 -0
  133. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/connection_status.py +0 -0
  134. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/display_dimensions.py +0 -0
  135. {cyberdesk-2.1.10 → 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
  136. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/file_input.py +0 -0
  137. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/file_write_request.py +0 -0
  138. {cyberdesk-2.1.10 → 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 +0 -0
  139. {cyberdesk-2.1.10 → 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 +0 -0
  140. {cyberdesk-2.1.10 → 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 +0 -0
  141. {cyberdesk-2.1.10 → 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
  142. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/health_check_v1_health_get_response_health_check_v1_health_get.py +0 -0
  143. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/health_health_get_response_health_health_get.py +0 -0
  144. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/http_validation_error.py +0 -0
  145. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_key_request.py +0 -0
  146. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/keyboard_type_request.py +0 -0
  147. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_pool_assignment.py +0 -0
  148. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_pool_update.py +0 -0
  149. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/machine_status.py +0 -0
  150. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_click_request.py +0 -0
  151. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_move_request.py +0 -0
  152. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_position.py +0 -0
  153. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/mouse_scroll_request.py +0 -0
  154. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response.py +0 -0
  155. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_connection_response.py +0 -0
  156. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_machine_response.py +0 -0
  157. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_pool_response.py +0 -0
  158. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_attachment_response.py +0 -0
  159. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_run_response.py +0 -0
  160. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_trajectory_response.py +0 -0
  161. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/paginated_response_workflow_response.py +0 -0
  162. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/pool_create.py +0 -0
  163. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/pool_response.py +0 -0
  164. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/pool_update.py +0 -0
  165. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/pool_with_machines.py +0 -0
  166. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/power_shell_session_request.py +0 -0
  167. {cyberdesk-2.1.10 → 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 +0 -0
  168. {cyberdesk-2.1.10 → 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 +0 -0
  169. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/ref_value.py +0 -0
  170. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_create.py +0 -0
  171. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_response.py +0 -0
  172. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/request_log_update.py +0 -0
  173. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_attachment_create.py +0 -0
  174. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_attachment_download_url_response.py +0 -0
  175. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_attachment_response.py +0 -0
  176. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_attachment_update.py +0 -0
  177. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create.py +0 -0
  178. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_input_values_type_0.py +0 -0
  179. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_response.py +0 -0
  180. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_bulk_create_sensitive_input_values_type_0.py +0 -0
  181. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_completed_event.py +0 -0
  182. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_create.py +0 -0
  183. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_create_input_values_type_0.py +0 -0
  184. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_create_sensitive_input_values_type_0.py +0 -0
  185. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_input_values_type_0.py +0 -0
  186. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_output_data_type_0.py +0 -0
  187. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_run_message_history_type_0_item.py +0 -0
  188. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_response_sensitive_input_aliases_type_0.py +0 -0
  189. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_status.py +0 -0
  190. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update.py +0 -0
  191. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_input_values_type_0.py +0 -0
  192. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_output_data_type_0.py +0 -0
  193. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/run_update_run_message_history_type_0_item.py +0 -0
  194. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_dimensions.py +0 -0
  195. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_original_input_values_type_0.py +0 -0
  196. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_create_trajectory_data_item.py +0 -0
  197. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_dimensions.py +0 -0
  198. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_original_input_values_type_0.py +0 -0
  199. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_response_trajectory_data_item.py +0 -0
  200. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/trajectory_update_trajectory_data_type_0_item.py +0 -0
  201. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/validation_error.py +0 -0
  202. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create.py +0 -0
  203. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_inputs_type_0.py +0 -0
  204. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_create_shared_sensitive_inputs_type_0.py +0 -0
  205. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_chain_response.py +0 -0
  206. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_create.py +0 -0
  207. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response.py +0 -0
  208. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_response_old_versions_type_0_item.py +0 -0
  209. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/models/workflow_update.py +0 -0
  210. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/py.typed +0 -0
  211. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/openapi_client/cyberdesk_cloud_client/types.py +0 -0
  212. {cyberdesk-2.1.10 → cyberdesk-2.1.20}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cyberdesk
3
- Version: 2.1.10
3
+ Version: 2.1.20
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
- - pydantic
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.10
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
- - pydantic
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.
@@ -27,7 +27,13 @@ from .client import (
27
27
  AttachmentType,
28
28
  )
29
29
 
30
- __version__ = "2.1.10"
30
+ from .types import (
31
+ MessageContentBlock,
32
+ ChatMessage,
33
+ RunMessageHistory,
34
+ )
35
+
36
+ __version__ = "2.1.20"
31
37
 
32
38
  __all__ = [
33
39
  "CyberdeskClient",
@@ -54,4 +60,7 @@ __all__ = [
54
60
  "RunAttachmentResponse",
55
61
  "RunAttachmentDownloadUrlResponse",
56
62
  "AttachmentType",
63
+ "MessageContentBlock",
64
+ "ChatMessage",
65
+ "RunMessageHistory",
57
66
  ]