cyberdesk 0.2.1__py3-none-any.whl → 0.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cyberdesk might be problematic. Click here for more details.

cyberdesk/__init__.py CHANGED
@@ -1 +1,8 @@
1
- from .client import CyberdeskClient
1
+ from .client import CyberdeskClient
2
+ from .types import (
3
+ GetDesktopParams,
4
+ LaunchDesktopParams,
5
+ TerminateDesktopParams,
6
+ ExecuteComputerActionParams,
7
+ ExecuteBashActionParams,
8
+ )
cyberdesk/actions.py ADDED
@@ -0,0 +1,38 @@
1
+ from .types import (
2
+ PostV1DesktopIdComputerActionClickMouseAction,
3
+ PostV1DesktopIdComputerActionDragMouseAction,
4
+ PostV1DesktopIdComputerActionGetCursorPositionAction,
5
+ PostV1DesktopIdComputerActionMoveMouseAction,
6
+ PostV1DesktopIdComputerActionPressKeysAction,
7
+ PostV1DesktopIdComputerActionScreenshotAction,
8
+ PostV1DesktopIdComputerActionScrollAction,
9
+ PostV1DesktopIdComputerActionTypeTextAction,
10
+ PostV1DesktopIdComputerActionWaitAction,
11
+ )
12
+
13
+ def click_mouse(x: int, y: int, button: str = "left") -> PostV1DesktopIdComputerActionClickMouseAction:
14
+ return PostV1DesktopIdComputerActionClickMouseAction(type="click_mouse", x=x, y=y, button=button)
15
+
16
+ def drag_mouse(start_x: int, start_y: int, end_x: int, end_y: int, button: str = "left") -> PostV1DesktopIdComputerActionDragMouseAction:
17
+ return PostV1DesktopIdComputerActionDragMouseAction(type="drag_mouse", start_x=start_x, start_y=start_y, end_x=end_x, end_y=end_y, button=button)
18
+
19
+ def get_cursor_position() -> PostV1DesktopIdComputerActionGetCursorPositionAction:
20
+ return PostV1DesktopIdComputerActionGetCursorPositionAction(type="get_cursor_position")
21
+
22
+ def move_mouse(x: int, y: int) -> PostV1DesktopIdComputerActionMoveMouseAction:
23
+ return PostV1DesktopIdComputerActionMoveMouseAction(type="move_mouse", x=x, y=y)
24
+
25
+ def press_keys(keys: list[str]) -> PostV1DesktopIdComputerActionPressKeysAction:
26
+ return PostV1DesktopIdComputerActionPressKeysAction(type="press_keys", keys=keys)
27
+
28
+ def screenshot() -> PostV1DesktopIdComputerActionScreenshotAction:
29
+ return PostV1DesktopIdComputerActionScreenshotAction(type="screenshot")
30
+
31
+ def scroll(dx: int, dy: int) -> PostV1DesktopIdComputerActionScrollAction:
32
+ return PostV1DesktopIdComputerActionScrollAction(type="scroll", dx=dx, dy=dy)
33
+
34
+ def type_text(text: str) -> PostV1DesktopIdComputerActionTypeTextAction:
35
+ return PostV1DesktopIdComputerActionTypeTextAction(type="type", text=text)
36
+
37
+ def wait(ms: int) -> PostV1DesktopIdComputerActionWaitAction:
38
+ return PostV1DesktopIdComputerActionWaitAction(type="wait", ms=ms)
cyberdesk/client.py CHANGED
@@ -2,6 +2,12 @@
2
2
  Cyberdesk Python SDK wrapper client.
3
3
  """
4
4
 
5
+ from .types import (
6
+ GetDesktopParams,
7
+ TerminateDesktopParams,
8
+ ExecuteBashActionParams,
9
+ ComputerActionModel,
10
+ )
5
11
  from openapi_client.api_reference_client.client import Client
6
12
  from openapi_client.api_reference_client.api.desktop import (
7
13
  get_v1_desktop_id,
@@ -13,15 +19,6 @@ from openapi_client.api_reference_client.api.desktop import (
13
19
  from openapi_client.api_reference_client.models import (
14
20
  PostV1DesktopBody,
15
21
  PostV1DesktopIdBashActionBody,
16
- PostV1DesktopIdComputerActionClickMouseAction,
17
- PostV1DesktopIdComputerActionDragMouseAction,
18
- PostV1DesktopIdComputerActionGetCursorPositionAction,
19
- PostV1DesktopIdComputerActionMoveMouseAction,
20
- PostV1DesktopIdComputerActionPressKeysAction,
21
- PostV1DesktopIdComputerActionScreenshotAction,
22
- PostV1DesktopIdComputerActionScrollAction,
23
- PostV1DesktopIdComputerActionTypeTextAction,
24
- PostV1DesktopIdComputerActionWaitAction,
25
22
  )
26
23
 
27
24
  class CyberdeskClient:
@@ -33,11 +30,11 @@ class CyberdeskClient:
33
30
  self.api_key = api_key
34
31
  self.client = Client(base_url=base_url, headers={"x-api-key": api_key})
35
32
 
36
- def get_desktop(self, id: str):
33
+ def get_desktop(self, id: GetDesktopParams):
37
34
  """Synchronous: Get details of a specific desktop instance."""
38
35
  return get_v1_desktop_id.sync(id=id, client=self.client, x_api_key=self.api_key)
39
36
 
40
- async def async_get_desktop(self, id: str):
37
+ async def async_get_desktop(self, id: GetDesktopParams):
41
38
  """Async: Get details of a specific desktop instance. Use with 'await'."""
42
39
  return await get_v1_desktop_id.asyncio(id=id, client=self.client, x_api_key=self.api_key)
43
40
 
@@ -51,58 +48,28 @@ class CyberdeskClient:
51
48
  body = PostV1DesktopBody(timeout_ms=timeout_ms) if timeout_ms is not None else PostV1DesktopBody()
52
49
  return await post_v1_desktop.asyncio(client=self.client, body=body, x_api_key=self.api_key)
53
50
 
54
- def terminate_desktop(self, id: str):
51
+ def terminate_desktop(self, id: TerminateDesktopParams):
55
52
  """Synchronous: Stop a running desktop instance."""
56
53
  return post_v1_desktop_id_stop.sync(id=id, client=self.client, x_api_key=self.api_key)
57
54
 
58
- async def async_terminate_desktop(self, id: str):
55
+ async def async_terminate_desktop(self, id: TerminateDesktopParams):
59
56
  """Async: Stop a running desktop instance. Use with 'await'."""
60
57
  return await post_v1_desktop_id_stop.asyncio(id=id, client=self.client, x_api_key=self.api_key)
61
58
 
62
- def execute_computer_action(self, id: str, action: dict):
59
+ def execute_computer_action(self, id: GetDesktopParams, action: ComputerActionModel):
63
60
  """Synchronous: Perform an action on the desktop (mouse, keyboard, etc)."""
64
- action_type = action.get("type")
65
- model_cls = {
66
- "click_mouse": PostV1DesktopIdComputerActionClickMouseAction,
67
- "scroll": PostV1DesktopIdComputerActionScrollAction,
68
- "move_mouse": PostV1DesktopIdComputerActionMoveMouseAction,
69
- "drag_mouse": PostV1DesktopIdComputerActionDragMouseAction,
70
- "type": PostV1DesktopIdComputerActionTypeTextAction,
71
- "press_keys": PostV1DesktopIdComputerActionPressKeysAction,
72
- "wait": PostV1DesktopIdComputerActionWaitAction,
73
- "screenshot": PostV1DesktopIdComputerActionScreenshotAction,
74
- "get_cursor_position": PostV1DesktopIdComputerActionGetCursorPositionAction,
75
- }.get(action_type)
76
- if model_cls is None:
77
- raise ValueError(f"Unknown computer action type: {action_type}")
78
- model = model_cls.from_dict(action)
79
- return post_v1_desktop_id_computer_action.sync(id=id, client=self.client, body=model, x_api_key=self.api_key)
61
+ return post_v1_desktop_id_computer_action.sync(id=id, client=self.client, body=action, x_api_key=self.api_key)
80
62
 
81
- async def async_execute_computer_action(self, id: str, action: dict):
63
+ async def async_execute_computer_action(self, id: GetDesktopParams, action: ComputerActionModel):
82
64
  """Async: Perform an action on the desktop (mouse, keyboard, etc). Use with 'await'."""
83
- action_type = action.get("type")
84
- model_cls = {
85
- "click_mouse": PostV1DesktopIdComputerActionClickMouseAction,
86
- "scroll": PostV1DesktopIdComputerActionScrollAction,
87
- "move_mouse": PostV1DesktopIdComputerActionMoveMouseAction,
88
- "drag_mouse": PostV1DesktopIdComputerActionDragMouseAction,
89
- "type": PostV1DesktopIdComputerActionTypeTextAction,
90
- "press_keys": PostV1DesktopIdComputerActionPressKeysAction,
91
- "wait": PostV1DesktopIdComputerActionWaitAction,
92
- "screenshot": PostV1DesktopIdComputerActionScreenshotAction,
93
- "get_cursor_position": PostV1DesktopIdComputerActionGetCursorPositionAction,
94
- }.get(action_type)
95
- if model_cls is None:
96
- raise ValueError(f"Unknown computer action type: {action_type}")
97
- model = model_cls.from_dict(action)
98
- return await post_v1_desktop_id_computer_action.asyncio(id=id, client=self.client, body=model, x_api_key=self.api_key)
65
+ return await post_v1_desktop_id_computer_action.asyncio(id=id, client=self.client, body=action, x_api_key=self.api_key)
99
66
 
100
- def execute_bash_action(self, id: str, command: str):
67
+ def execute_bash_action(self, id: GetDesktopParams, command: ExecuteBashActionParams):
101
68
  """Synchronous: Execute a bash command on the desktop."""
102
69
  body = PostV1DesktopIdBashActionBody(command=command)
103
70
  return post_v1_desktop_id_bash_action.sync(id=id, client=self.client, body=body, x_api_key=self.api_key)
104
71
 
105
- async def async_execute_bash_action(self, id: str, command: str):
72
+ async def async_execute_bash_action(self, id: GetDesktopParams, command: ExecuteBashActionParams):
106
73
  """Async: Execute a bash command on the desktop. Use with 'await'."""
107
74
  body = PostV1DesktopIdBashActionBody(command=command)
108
75
  return await post_v1_desktop_id_bash_action.asyncio(id=id, client=self.client, body=body, x_api_key=self.api_key)
cyberdesk/types.py ADDED
@@ -0,0 +1,50 @@
1
+ from openapi_client.api_reference_client.models import (
2
+ PostV1DesktopBody,
3
+ PostV1DesktopIdComputerActionClickMouseAction,
4
+ PostV1DesktopIdComputerActionDragMouseAction,
5
+ PostV1DesktopIdComputerActionGetCursorPositionAction,
6
+ PostV1DesktopIdComputerActionMoveMouseAction,
7
+ PostV1DesktopIdComputerActionPressKeysAction,
8
+ PostV1DesktopIdComputerActionScreenshotAction,
9
+ PostV1DesktopIdComputerActionScrollAction,
10
+ PostV1DesktopIdComputerActionTypeTextAction,
11
+ PostV1DesktopIdComputerActionWaitAction,
12
+ )
13
+ from typing import Union
14
+
15
+ # Named parameter types for SDK methods
16
+ GetDesktopParams = str # Desktop ID
17
+ LaunchDesktopParams = PostV1DesktopBody
18
+ TerminateDesktopParams = str # Desktop ID
19
+ ExecuteBashActionParams = str # Command string
20
+
21
+ # Strongly-typed union for all computer action models
22
+ ComputerActionModel = Union[
23
+ PostV1DesktopIdComputerActionClickMouseAction,
24
+ PostV1DesktopIdComputerActionDragMouseAction,
25
+ PostV1DesktopIdComputerActionGetCursorPositionAction,
26
+ PostV1DesktopIdComputerActionMoveMouseAction,
27
+ PostV1DesktopIdComputerActionPressKeysAction,
28
+ PostV1DesktopIdComputerActionScreenshotAction,
29
+ PostV1DesktopIdComputerActionScrollAction,
30
+ PostV1DesktopIdComputerActionTypeTextAction,
31
+ PostV1DesktopIdComputerActionWaitAction,
32
+ ]
33
+
34
+ # Re-export action models for ergonomic imports
35
+ __all__ = [
36
+ "GetDesktopParams",
37
+ "LaunchDesktopParams",
38
+ "TerminateDesktopParams",
39
+ "ExecuteBashActionParams",
40
+ "ComputerActionModel",
41
+ "PostV1DesktopIdComputerActionClickMouseAction",
42
+ "PostV1DesktopIdComputerActionDragMouseAction",
43
+ "PostV1DesktopIdComputerActionGetCursorPositionAction",
44
+ "PostV1DesktopIdComputerActionMoveMouseAction",
45
+ "PostV1DesktopIdComputerActionPressKeysAction",
46
+ "PostV1DesktopIdComputerActionScreenshotAction",
47
+ "PostV1DesktopIdComputerActionScrollAction",
48
+ "PostV1DesktopIdComputerActionTypeTextAction",
49
+ "PostV1DesktopIdComputerActionWaitAction",
50
+ ]
@@ -0,0 +1,216 @@
1
+ Metadata-Version: 2.4
2
+ Name: cyberdesk
3
+ Version: 0.2.2
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
+ Provides-Extra: dev
11
+ Requires-Dist: openapi-python-client; extra == "dev"
12
+ Requires-Dist: build; extra == "dev"
13
+ Requires-Dist: twine; extra == "dev"
14
+ Dynamic: license-file
15
+
16
+ # cyberdesk
17
+
18
+ [![PyPI version](https://badge.fury.io/py/cyberdesk.svg)](https://badge.fury.io/py/cyberdesk)
19
+
20
+ The official Python SDK for Cyberdesk.
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ pip install cyberdesk
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ First, create a Cyberdesk client instance with your API key:
31
+
32
+ ```python
33
+ from cyberdesk import CyberdeskClient
34
+
35
+ client = CyberdeskClient(api_key="YOUR_API_KEY")
36
+ ```
37
+
38
+ ---
39
+
40
+ ### Launch a Desktop
41
+
42
+ ```python
43
+ result = client.launch_desktop(timeout_ms=10000) # Optional: set a timeout for the desktop session
44
+
45
+ # Error handling example
46
+ if hasattr(result, 'error') and result.error:
47
+ raise Exception('Failed to launch desktop: ' + str(result.error))
48
+
49
+ # Success
50
+ if hasattr(result, 'id'):
51
+ desktop_id = result.id
52
+ print('Launched desktop with ID:', desktop_id)
53
+ ```
54
+
55
+ ---
56
+
57
+ ### Get Desktop Info
58
+
59
+ ```python
60
+ info = client.get_desktop("your-desktop-id")
61
+
62
+ if hasattr(info, 'error') and info.error:
63
+ raise Exception('Failed to get desktop info: ' + str(info.error))
64
+
65
+ print('Desktop info:', info)
66
+ ```
67
+
68
+ ---
69
+
70
+ ### Perform a Computer Action (e.g., Mouse Click)
71
+
72
+ ```python
73
+ from cyberdesk.actions import click_mouse
74
+
75
+ action = click_mouse(x=100, y=150, button="left")
76
+ action_result = client.execute_computer_action("your-desktop-id", action)
77
+
78
+ if hasattr(action_result, 'error') and action_result.error:
79
+ raise Exception('Action failed: ' + str(action_result.error))
80
+
81
+ print('Action result:', action_result)
82
+ ```
83
+
84
+ ---
85
+
86
+ ### Run a Bash Command
87
+
88
+ ```python
89
+ bash_result = client.execute_bash_action(
90
+ "your-desktop-id",
91
+ "echo Hello, world!"
92
+ )
93
+
94
+ if hasattr(bash_result, 'error') and bash_result.error:
95
+ raise Exception('Bash command failed: ' + str(bash_result.error))
96
+
97
+ print('Bash output:', getattr(bash_result, 'output', bash_result))
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Ergonomic, Type-Safe Actions
103
+
104
+ To create computer actions (mouse, keyboard, etc.), use the factory functions in `cyberdesk.actions`. These provide full type hints and IDE autocompletion for all required and optional fields.
105
+
106
+ **Example:**
107
+ ```python
108
+ from cyberdesk.actions import click_mouse, type_text
109
+
110
+ action1 = click_mouse(x=100, y=200, button="left")
111
+ action2 = type_text(text="Hello, world!")
112
+
113
+ client.execute_computer_action("your-desktop-id", action1)
114
+ client.execute_computer_action("your-desktop-id", action2)
115
+ ```
116
+
117
+ | Action | Factory Function | Description |
118
+ |----------------|-------------------------|----------------------------|
119
+ | Click Mouse | `click_mouse` | Mouse click at (x, y) |
120
+ | Drag Mouse | `drag_mouse` | Mouse drag from/to (x, y) |
121
+ | Move Mouse | `move_mouse` | Move mouse to (x, y) |
122
+ | Scroll | `scroll` | Scroll by dx, dy |
123
+ | Type Text | `type_text` | Type text |
124
+ | Press Keys | `press_keys` | Press keyboard keys |
125
+ | Screenshot | `screenshot` | Take a screenshot |
126
+ | Wait | `wait` | Wait for ms milliseconds |
127
+ | Get Cursor Pos | `get_cursor_position` | Get mouse cursor position |
128
+
129
+ ---
130
+
131
+ ## Async Usage
132
+
133
+ All methods are also available as async variants (prefixed with `async_`). Example:
134
+
135
+ ```python
136
+ import asyncio
137
+ from cyberdesk import CyberdeskClient
138
+ from cyberdesk.actions import click_mouse
139
+
140
+ async def main():
141
+ client = CyberdeskClient(api_key="YOUR_API_KEY")
142
+ result = await client.async_launch_desktop(timeout_ms=10000)
143
+ print(result)
144
+ # Example async computer action
145
+ action = click_mouse(x=100, y=200)
146
+ await client.async_execute_computer_action("your-desktop-id", action)
147
+ # ... use other async_ methods as needed
148
+
149
+ asyncio.run(main())
150
+ ```
151
+
152
+ ---
153
+
154
+ ## Type Hints and Models
155
+
156
+ All request/response types are available from the generated models, and all computer actions are available as factory functions in `cyberdesk.actions` for ergonomic, type-safe usage.
157
+
158
+ ```python
159
+ from cyberdesk.actions import click_mouse, drag_mouse, type_text, wait, scroll, move_mouse, press_keys, screenshot, get_cursor_position
160
+ ```
161
+
162
+ ---
163
+
164
+ ## For Cyberdesk Team: Publishing to PyPI
165
+
166
+ **Recommended:** Always use a [virtual environment](https://docs.python.org/3/library/venv.html) (venv) for building and publishing to avoid dependency conflicts.
167
+
168
+ To build and publish this package to [PyPI](https://pypi.org/project/cyberdesk/):
169
+
170
+ 1. **Log into PyPI** (get credentials from the Cyberdesk team).
171
+
172
+ 2. **Install dev dependencies** (in a clean venv):
173
+ ```bash
174
+ pip install .[dev]
175
+ # or
176
+ uv pip install .[dev]
177
+ ```
178
+
179
+ 3. **Build the package:**
180
+ ```bash
181
+ python -m build
182
+ ```
183
+ This creates a `dist/` directory with `.whl` and `.tar.gz` files.
184
+
185
+ 4. **(Recommended) Set up a `.pypirc` file for easy publishing:**
186
+ - Create a file named `.pypirc` in your home directory (e.g., `C:\Users\yourname\.pypirc` on Windows or `~/.pypirc` on Linux/macOS).
187
+ - Add:
188
+ ```ini
189
+ [distutils]
190
+ index-servers =
191
+ pypi
192
+
193
+ [pypi]
194
+ username = __token__
195
+ password = pypi-AgEIcH... # <-- paste your API token here
196
+ ```
197
+
198
+ 5. **Publish to PyPI:**
199
+ ```bash
200
+ twine upload dist/*
201
+ ```
202
+ - If you set up `.pypirc`, you won't be prompted for credentials.
203
+ - If not, enter `__token__` as the username and paste your API token as the password.
204
+
205
+ 6. **Verify:**
206
+ - Visit https://pypi.org/project/cyberdesk/ to see your published package.
207
+ - Try installing it in a fresh environment:
208
+ ```bash
209
+ pip install cyberdesk
210
+ ```
211
+
212
+ ---
213
+
214
+ ## License
215
+
216
+ [MIT](LICENSE)
@@ -0,0 +1,9 @@
1
+ cyberdesk/__init__.py,sha256=6w_HoySYYfkbEefmGaG4X_YPsC899Rf5Bm_7I2h0hoU,203
2
+ cyberdesk/actions.py,sha256=QHDje98UhRRueTEc-nCV0NKJ_vLRGHtce1N_7b33si0,2106
3
+ cyberdesk/client.py,sha256=7o1bZDiUom_kB6dRnL_n1F0yDGBI5kT9oOCNbMhIKOI,3881
4
+ cyberdesk/types.py,sha256=n2x8OVVwOvkBkiNV5k6PQcMeFkNqCZ5u4bOC4Sm5rmk,2024
5
+ cyberdesk-0.2.2.dist-info/licenses/LICENSE,sha256=2KwiXv5ggnOI_pTkar6DJhkvlsThyfiA1-Q-CKTYP3U,1091
6
+ cyberdesk-0.2.2.dist-info/METADATA,sha256=x6EMfZz_pcVx_lbFst9etBa_gS6H16ExgidEk0xNe68,6130
7
+ cyberdesk-0.2.2.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
8
+ cyberdesk-0.2.2.dist-info/top_level.txt,sha256=CdS7JHYf_tUvJj-XyQ0reLcOLsfrzCFxWQS1apfMkGM,10
9
+ cyberdesk-0.2.2.dist-info/RECORD,,
@@ -1,137 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: cyberdesk
3
- Version: 0.2.1
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
- Provides-Extra: dev
11
- Requires-Dist: openapi-python-client; extra == "dev"
12
- Requires-Dist: build; extra == "dev"
13
- Requires-Dist: twine; extra == "dev"
14
- Dynamic: license-file
15
-
16
- # cyberdesk
17
-
18
- [![PyPI version](https://badge.fury.io/py/cyberdesk.svg)](https://badge.fury.io/py/cyberdesk)
19
-
20
- The official Python SDK for Cyberdesk.
21
-
22
- ## Installation
23
-
24
- ```bash
25
- pip install cyberdesk
26
- ```
27
-
28
- ## Usage
29
-
30
- First, create a Cyberdesk client instance with your API key:
31
-
32
- ```python
33
- from cyberdesk import CyberdeskClient
34
-
35
- client = CyberdeskClient(api_key="YOUR_API_KEY")
36
- ```
37
-
38
- ---
39
-
40
- ### Launch a Desktop
41
-
42
- ```python
43
- result = client.launch_desktop(timeout_ms=10000) # Optional: set a timeout for the desktop session
44
-
45
- # Error handling example
46
- if hasattr(result, 'error') and result.error:
47
- raise Exception('Failed to launch desktop: ' + str(result.error))
48
-
49
- # Success
50
- if hasattr(result, 'id'):
51
- desktop_id = result.id
52
- print('Launched desktop with ID:', desktop_id)
53
- ```
54
-
55
- ---
56
-
57
- ### Get Desktop Info
58
-
59
- ```python
60
- info = client.get_desktop("your-desktop-id")
61
-
62
- if hasattr(info, 'error') and info.error:
63
- raise Exception('Failed to get desktop info: ' + str(info.error))
64
-
65
- print('Desktop info:', info)
66
- ```
67
-
68
- ---
69
-
70
- ### Perform a Computer Action (e.g., Mouse Click)
71
-
72
- ```python
73
- action_result = client.execute_computer_action(
74
- "your-desktop-id",
75
- {
76
- "type": "click_mouse",
77
- "x": 100,
78
- "y": 150
79
- }
80
- )
81
-
82
- if hasattr(action_result, 'error') and action_result.error:
83
- raise Exception('Action failed: ' + str(action_result.error))
84
-
85
- print('Action result:', action_result)
86
- ```
87
-
88
- ---
89
-
90
- ### Run a Bash Command
91
-
92
- ```python
93
- bash_result = client.execute_bash_action(
94
- "your-desktop-id",
95
- "echo Hello, world!"
96
- )
97
-
98
- if hasattr(bash_result, 'error') and bash_result.error:
99
- raise Exception('Bash command failed: ' + str(bash_result.error))
100
-
101
- print('Bash output:', getattr(bash_result, 'output', bash_result))
102
- ```
103
-
104
- ---
105
-
106
- ## Async Usage
107
-
108
- All methods are also available as async variants (prefixed with `async_`). Example:
109
-
110
- ```python
111
- import asyncio
112
- from cyberdesk import CyberdeskClient
113
-
114
- async def main():
115
- client = CyberdeskClient(api_key="YOUR_API_KEY")
116
- result = await client.async_launch_desktop(timeout_ms=10000)
117
- print(result)
118
- # ... use other async_ methods as needed
119
-
120
- asyncio.run(main())
121
- ```
122
-
123
- ---
124
-
125
- ## Type Hints and Models
126
-
127
- All request/response types are available from the generated models:
128
-
129
- ```python
130
- from openapi_client.api_reference_client.models import PostV1DesktopBody, PostV1DesktopIdBashActionBody
131
- ```
132
-
133
- ---
134
-
135
- ## License
136
-
137
- [MIT](LICENSE)
@@ -1,7 +0,0 @@
1
- cyberdesk/__init__.py,sha256=G5ewrCDKWu9oCVWHvpeEB4YqKrnqzvf9ZJlCTtAedBA,36
2
- cyberdesk/client.py,sha256=Hc5Z47cPAYCWcMBi0Ye53zkJ8YumP5wI9z5PQq-yAG8,5818
3
- cyberdesk-0.2.1.dist-info/licenses/LICENSE,sha256=2KwiXv5ggnOI_pTkar6DJhkvlsThyfiA1-Q-CKTYP3U,1091
4
- cyberdesk-0.2.1.dist-info/METADATA,sha256=XgmkoXBOmHxjQWnEmSJt2N_yQ14BSucvlE8AdMr19xY,2933
5
- cyberdesk-0.2.1.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
6
- cyberdesk-0.2.1.dist-info/top_level.txt,sha256=CdS7JHYf_tUvJj-XyQ0reLcOLsfrzCFxWQS1apfMkGM,10
7
- cyberdesk-0.2.1.dist-info/RECORD,,