cyberdesk 2.1.13__py3-none-any.whl → 2.1.15__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
@@ -27,7 +27,7 @@ from .client import (
27
27
  AttachmentType,
28
28
  )
29
29
 
30
- __version__ = "2.1.13"
30
+ __version__ = "2.1.15"
31
31
 
32
32
  __all__ = [
33
33
  "CyberdeskClient",
cyberdesk/client.py CHANGED
@@ -1144,7 +1144,7 @@ class RunsAPI:
1144
1144
  """Create a multi-step chain that runs on a single reserved session/machine.
1145
1145
 
1146
1146
  Args:
1147
- data: WorkflowChainCreate with steps (session_alias, inputs),
1147
+ data: WorkflowChainCreate with steps (session_alias, inputs, sensitive_inputs),
1148
1148
  optional shared_inputs/sensitive/file_inputs, and optional
1149
1149
  session_id or machine_id/pool_ids for session start.
1150
1150
 
@@ -1161,7 +1161,16 @@ class RunsAPI:
1161
1161
  return ApiResponse(error=e)
1162
1162
 
1163
1163
  def chain_sync(self, data: WorkflowChainCreate) -> ApiResponse:
1164
- """Create a multi-step chain (synchronous)."""
1164
+ """Create a multi-step chain (synchronous).
1165
+
1166
+ Args:
1167
+ data: WorkflowChainCreate with steps (session_alias, inputs, sensitive_inputs),
1168
+ optional shared_inputs/sensitive/file_inputs, and optional
1169
+ session_id or machine_id/pool_ids for session start.
1170
+
1171
+ Returns:
1172
+ ApiResponse with WorkflowChainResponse
1173
+ """
1165
1174
  try:
1166
1175
  response = create_run_chain_v1_runs_chain_post.sync(
1167
1176
  client=self.client,
@@ -1260,19 +1269,35 @@ class TrajectoriesAPI:
1260
1269
  skip: Optional[int] = None,
1261
1270
  limit: Optional[int] = None,
1262
1271
  workflow_id: Optional[str] = None,
1272
+ is_approved: Optional[bool] = None,
1263
1273
  *,
1264
1274
  created_at_from: Optional[Union[str, datetime]] = None,
1265
1275
  created_at_to: Optional[Union[str, datetime]] = None,
1266
1276
  updated_at_from: Optional[Union[str, datetime]] = None,
1267
1277
  updated_at_to: Optional[Union[str, datetime]] = None,
1268
1278
  ) -> ApiResponse:
1269
- """List trajectories with optional filtering."""
1279
+ """List trajectories with optional filtering.
1280
+
1281
+ Args:
1282
+ skip: Number of records to skip
1283
+ limit: Number of records to return
1284
+ workflow_id: Filter by workflow ID
1285
+ is_approved: Filter by approval status (True=approved, False=not approved, None=all)
1286
+ created_at_from: Filter created at or after (UTC or ISO string)
1287
+ created_at_to: Filter created at or before (UTC or ISO string)
1288
+ updated_at_from: Filter updated at or after (UTC or ISO string)
1289
+ updated_at_to: Filter updated at or before (UTC or ISO string)
1290
+
1291
+ Note: By default returns both approved and unapproved trajectories.
1292
+ Only approved trajectories are used during workflow execution.
1293
+ """
1270
1294
  try:
1271
1295
  response = await list_trajectories_v1_trajectories_get.asyncio(
1272
1296
  client=self.client,
1273
1297
  skip=_to_unset_or_value(skip),
1274
1298
  limit=_to_unset_or_value(limit),
1275
1299
  workflow_id=_to_uuid(workflow_id) if workflow_id else UNSET,
1300
+ is_approved=_to_unset_or_value(is_approved),
1276
1301
  created_at_from=_to_unset_or_value(_to_iso_utc_str(created_at_from)),
1277
1302
  created_at_to=_to_unset_or_value(_to_iso_utc_str(created_at_to)),
1278
1303
  updated_at_from=_to_unset_or_value(_to_iso_utc_str(updated_at_from)),
@@ -1287,19 +1312,35 @@ class TrajectoriesAPI:
1287
1312
  skip: Optional[int] = None,
1288
1313
  limit: Optional[int] = None,
1289
1314
  workflow_id: Optional[str] = None,
1315
+ is_approved: Optional[bool] = None,
1290
1316
  *,
1291
1317
  created_at_from: Optional[Union[str, datetime]] = None,
1292
1318
  created_at_to: Optional[Union[str, datetime]] = None,
1293
1319
  updated_at_from: Optional[Union[str, datetime]] = None,
1294
1320
  updated_at_to: Optional[Union[str, datetime]] = None,
1295
1321
  ) -> ApiResponse:
1296
- """List trajectories with optional filtering (synchronous)."""
1322
+ """List trajectories with optional filtering (synchronous).
1323
+
1324
+ Args:
1325
+ skip: Number of records to skip
1326
+ limit: Number of records to return
1327
+ workflow_id: Filter by workflow ID
1328
+ is_approved: Filter by approval status (True=approved, False=not approved, None=all)
1329
+ created_at_from: Filter created at or after (UTC or ISO string)
1330
+ created_at_to: Filter created at or before (UTC or ISO string)
1331
+ updated_at_from: Filter updated at or after (UTC or ISO string)
1332
+ updated_at_to: Filter updated at or before (UTC or ISO string)
1333
+
1334
+ Note: By default returns both approved and unapproved trajectories.
1335
+ Only approved trajectories are used during workflow execution.
1336
+ """
1297
1337
  try:
1298
1338
  response = list_trajectories_v1_trajectories_get.sync(
1299
1339
  client=self.client,
1300
1340
  skip=_to_unset_or_value(skip),
1301
1341
  limit=_to_unset_or_value(limit),
1302
1342
  workflow_id=_to_uuid(workflow_id) if workflow_id else UNSET,
1343
+ is_approved=_to_unset_or_value(is_approved),
1303
1344
  created_at_from=_to_unset_or_value(_to_iso_utc_str(created_at_from)),
1304
1345
  created_at_to=_to_unset_or_value(_to_iso_utc_str(created_at_to)),
1305
1346
  updated_at_from=_to_unset_or_value(_to_iso_utc_str(updated_at_from)),
@@ -1310,7 +1351,11 @@ class TrajectoriesAPI:
1310
1351
  return ApiResponse(error=e)
1311
1352
 
1312
1353
  async def create(self, data: TrajectoryCreate) -> ApiResponse:
1313
- """Create a new trajectory."""
1354
+ """Create a new trajectory.
1355
+
1356
+ Note: Trajectories are created with is_approved=False by default.
1357
+ You must explicitly approve them before they can be used during workflow execution.
1358
+ """
1314
1359
  try:
1315
1360
  response = await create_trajectory_v1_trajectories_post.asyncio(
1316
1361
  client=self.client,
@@ -1321,7 +1366,11 @@ class TrajectoriesAPI:
1321
1366
  return ApiResponse(error=e)
1322
1367
 
1323
1368
  def create_sync(self, data: TrajectoryCreate) -> ApiResponse:
1324
- """Create a new trajectory (synchronous)."""
1369
+ """Create a new trajectory (synchronous).
1370
+
1371
+ Note: Trajectories are created with is_approved=False by default.
1372
+ You must explicitly approve them before they can be used during workflow execution.
1373
+ """
1325
1374
  try:
1326
1375
  response = create_trajectory_v1_trajectories_post.sync(
1327
1376
  client=self.client,
@@ -1354,7 +1403,12 @@ class TrajectoriesAPI:
1354
1403
  return ApiResponse(error=e)
1355
1404
 
1356
1405
  async def update(self, trajectory_id: str, data: TrajectoryUpdate) -> ApiResponse:
1357
- """Update a trajectory."""
1406
+ """Update a trajectory.
1407
+
1408
+ You can update trajectory metadata (name, description), trajectory data (steps),
1409
+ and approval status (is_approved). Only approved trajectories are used during
1410
+ workflow execution.
1411
+ """
1358
1412
  try:
1359
1413
  response = await update_trajectory_v1_trajectories_trajectory_id_patch.asyncio(
1360
1414
  client=self.client,
@@ -1366,7 +1420,12 @@ class TrajectoriesAPI:
1366
1420
  return ApiResponse(error=e)
1367
1421
 
1368
1422
  def update_sync(self, trajectory_id: str, data: TrajectoryUpdate) -> ApiResponse:
1369
- """Update a trajectory (synchronous)."""
1423
+ """Update a trajectory (synchronous).
1424
+
1425
+ You can update trajectory metadata (name, description), trajectory data (steps),
1426
+ and approval status (is_approved). Only approved trajectories are used during
1427
+ workflow execution.
1428
+ """
1370
1429
  try:
1371
1430
  response = update_trajectory_v1_trajectories_trajectory_id_patch.sync(
1372
1431
  client=self.client,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cyberdesk
3
- Version: 2.1.13
3
+ Version: 2.1.15
4
4
  Summary: The official Python SDK for Cyberdesk
5
5
  Author-email: Cyberdesk Team <dev@cyberdesk.io>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
- cyberdesk/__init__.py,sha256=YPEZLZDuQwqyKWsEnkfhvy-C047mnQhX4TT9CQ8THP8,1158
2
- cyberdesk/client.py,sha256=72fhbiHZcvQl08ncoEArUZROECRfSkmf5MXY7do2KPM,68639
3
- cyberdesk-2.1.13.dist-info/licenses/LICENSE,sha256=06Op63FCwGhuUOz__M8IZW5sxd29WxyGC4X5-Uih7IQ,1071
1
+ cyberdesk/__init__.py,sha256=I_9Pp45S6s-V5ZjLlQNt3TuG0hPrca8zki6gaLoRFe0,1158
2
+ cyberdesk/client.py,sha256=LrNFmZtLYNpDr7ed2atcVLBitQU0sZQpi1QFI-9iTfc,71460
3
+ cyberdesk-2.1.15.dist-info/licenses/LICENSE,sha256=06Op63FCwGhuUOz__M8IZW5sxd29WxyGC4X5-Uih7IQ,1071
4
4
  openapi_client/cyberdesk_cloud_client/__init__.py,sha256=r_uVkNUL-SOK8j7-KiGMIKdinES5X8K1Q250ySX2F-A,158
5
5
  openapi_client/cyberdesk_cloud_client/client.py,sha256=o_mdLqyBCQstu5tS1WZFwqIEbGwkvWQ7eQjuCJw_5VY,12419
6
6
  openapi_client/cyberdesk_cloud_client/errors.py,sha256=gO8GBmKqmSNgAg-E5oT-oOyxztvp7V_6XG7OUTT15q0,546
@@ -17,6 +17,7 @@ openapi_client/cyberdesk_cloud_client/api/computer/get_screenshot_v1_computer_ma
17
17
  openapi_client/cyberdesk_cloud_client/api/computer/keyboard_key_v1_computer_machine_id_input_keyboard_key_post.py,sha256=14iKQ2Pj9YCc4YgbNhsmIM8y4hO_xMzm2aOFMIFE4j8,4948
18
18
  openapi_client/cyberdesk_cloud_client/api/computer/keyboard_type_v1_computer_machine_id_input_keyboard_type_post.py,sha256=tVBv4T6cg5UscdZtFuZpV4WJFF1Lqg7jDP97dbpoPnk,4664
19
19
  openapi_client/cyberdesk_cloud_client/api/computer/mouse_click_v1_computer_machine_id_input_mouse_click_post.py,sha256=_b8dCyAI0W3Fr0Ra5vo35yJuMb36cS0o41SSlLT1xf8,4984
20
+ openapi_client/cyberdesk_cloud_client/api/computer/mouse_drag_v1_computer_machine_id_input_mouse_drag_post.py,sha256=CJ7BogOcUfdBlVKetDCThtb8n_7ZdjhZ9cwtzealuVw,4900
20
21
  openapi_client/cyberdesk_cloud_client/api/computer/mouse_move_v1_computer_machine_id_input_mouse_move_post.py,sha256=CNfIj6oTs8QSRo4674pmHw9kJQIBw7D-u7mKT62tMDg,4704
21
22
  openapi_client/cyberdesk_cloud_client/api/computer/mouse_scroll_v1_computer_machine_id_input_mouse_scroll_post.py,sha256=iHi8de7RU7gc1aLzLXlrlNW4HO13M8SigTyMqypA-9s,5024
22
23
  openapi_client/cyberdesk_cloud_client/api/computer/powershell_exec_v1_computer_machine_id_shell_powershell_exec_post.py,sha256=iZCvu92FFTVAZfIkw-PIWPllUe4NRuAdjB63IasSxKw,6567
@@ -80,7 +81,7 @@ openapi_client/cyberdesk_cloud_client/api/trajectories/create_trajectory_v1_traj
80
81
  openapi_client/cyberdesk_cloud_client/api/trajectories/delete_trajectory_v1_trajectories_trajectory_id_delete.py,sha256=uvWcVq-VsklflJd47OKsYszIXNFPu0YCAADo8NHmTR4,4366
81
82
  openapi_client/cyberdesk_cloud_client/api/trajectories/get_latest_trajectory_for_workflow_v1_workflows_workflow_id_latest_trajectory_get.py,sha256=kFsYg3Jx13x56TrHCVuM7yzPBWKVBwZPklSxqELx1Fc,5026
82
83
  openapi_client/cyberdesk_cloud_client/api/trajectories/get_trajectory_v1_trajectories_trajectory_id_get.py,sha256=d3cTp_hEThXejqxsdnRg1QhVoSMGMO1cLdeUG1vy7oo,4883
83
- openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py,sha256=kcpnHm4rOpocEE90PibDFRlOIQhgVYl96IjY4bdHh9k,12481
84
+ openapi_client/cyberdesk_cloud_client/api/trajectories/list_trajectories_v1_trajectories_get.py,sha256=Xq8YEFuz2SuoUXzvZpQlsegufKjcbw0JJybs0nXDFh8,13922
84
85
  openapi_client/cyberdesk_cloud_client/api/trajectories/update_trajectory_v1_trajectories_trajectory_id_patch.py,sha256=s3S6I24Tsf1nTByOf3bNw88WAfo6ogdo_PG7AjDbl-Q,5596
85
86
  openapi_client/cyberdesk_cloud_client/api/workflows/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
86
87
  openapi_client/cyberdesk_cloud_client/api/workflows/create_workflow_v1_workflows_post.py,sha256=b_N1b5ujzuKuhgnlqRQdU4LB_aBSBcR0kl06ZZOJaJc,4836
@@ -89,10 +90,11 @@ openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_v1_workflows_wo
89
90
  openapi_client/cyberdesk_cloud_client/api/workflows/get_workflow_versions_v1_workflows_workflow_id_versions_get.py,sha256=ax_5V-lIClvOxr50eXSIAPbyhWP-cS4a4DXzwdxkVYs,5889
90
91
  openapi_client/cyberdesk_cloud_client/api/workflows/list_workflows_v1_workflows_get.py,sha256=Aszxh1BlUuRqMHjT7lvZf8g6kDCcNUZtuwoJqhDOwlQ,11258
91
92
  openapi_client/cyberdesk_cloud_client/api/workflows/update_workflow_v1_workflows_workflow_id_patch.py,sha256=K_tuO6s_FyM8MUOck5AuX_RNIeYqCQcfYx1aDg9xwhE,5737
92
- openapi_client/cyberdesk_cloud_client/models/__init__.py,sha256=xT6qmjL5fV-b9JAabLs875XrPZvB_4APm30nDRQW72U,10586
93
+ openapi_client/cyberdesk_cloud_client/models/__init__.py,sha256=bN2yq2UmoeEwvmWfc5o9Kk9UoFYBa3S7fPrnc_k_qx0,10774
93
94
  openapi_client/cyberdesk_cloud_client/models/attachment_type.py,sha256=zqPOsSd2AmxGNqb5HQ6ZYBAYL8k-0UbWHhfAJYNHoro,161
94
- openapi_client/cyberdesk_cloud_client/models/chain_step.py,sha256=mdWyUoC-zPXPkNc_JWONbEKao5VH5az2LQNJA3mmG1k,3871
95
+ openapi_client/cyberdesk_cloud_client/models/chain_step.py,sha256=RbcnI9FI-e6fPYnvtsTUcKmyOkw_0X0R3YLzQihyMO4,5608
95
96
  openapi_client/cyberdesk_cloud_client/models/chain_step_inputs_type_0.py,sha256=fLKmOSl7rEi7pRrXbY1sqiVdbCNg0mGj2cPOb5_7hh4,2368
97
+ openapi_client/cyberdesk_cloud_client/models/chain_step_sensitive_inputs_type_0.py,sha256=oLV0b0BiQulk_iNK7QE01t3kBTMmK_0bgBoW9BwfSjI,1302
96
98
  openapi_client/cyberdesk_cloud_client/models/connection_create.py,sha256=gCI36DmjJDZxzGFPbykyYw9k4QEf_4dVNz9b-xZfLo4,3288
97
99
  openapi_client/cyberdesk_cloud_client/models/connection_response.py,sha256=aFxqJX75wSEw5dZ-kvh3Wgv_haJ6xYJ7o72vSAbEtHY,5247
98
100
  openapi_client/cyberdesk_cloud_client/models/connection_status.py,sha256=XTpa-W0TinYhypU7P-LaJEI3I2JsEaT3voUZQ3zoJO0,203
@@ -117,6 +119,7 @@ openapi_client/cyberdesk_cloud_client/models/machine_response.py,sha256=2fOAnhfZ
117
119
  openapi_client/cyberdesk_cloud_client/models/machine_status.py,sha256=mqKyXgK1wcaA2fI6iTo_tS7AMeuVrRN4yE21d2Lsq1I,200
118
120
  openapi_client/cyberdesk_cloud_client/models/machine_update.py,sha256=0rUF8QOMrKLfGc2t1tULmId33sXBr9uwNgJSUD7p6es,8344
119
121
  openapi_client/cyberdesk_cloud_client/models/mouse_click_request.py,sha256=GSBn4fg2sNnL4KQQHKly2YIzyRqbfwVgrQXpaalOUxg,3423
122
+ openapi_client/cyberdesk_cloud_client/models/mouse_drag_request.py,sha256=TRQoT0FUprSE2hBK7U3M_mHWx2VzvE_YKg582OBXgXc,3389
120
123
  openapi_client/cyberdesk_cloud_client/models/mouse_move_request.py,sha256=D5sWQwnRvs_IvRocctMeE2czciI-KvuuYh73PLutkPo,1548
121
124
  openapi_client/cyberdesk_cloud_client/models/mouse_position.py,sha256=t8PW-7xKfyHb3LVnZQglSu4Hrlp7W_xmoqS-UYOqG2U,1530
122
125
  openapi_client/cyberdesk_cloud_client/models/mouse_scroll_request.py,sha256=Q0QG8UweABu0BJXOBQVh8HCgMMyCSvHzoXf4Gkm6A5s,2980
@@ -166,15 +169,15 @@ openapi_client/cyberdesk_cloud_client/models/run_update.py,sha256=EY8zP-Dd3WgGNd
166
169
  openapi_client/cyberdesk_cloud_client/models/run_update_input_values_type_0.py,sha256=Dg_CSahXf_M8x7go8K0BoUrHWnoKpc6l-IFPeT15DNk,1282
167
170
  openapi_client/cyberdesk_cloud_client/models/run_update_output_data_type_0.py,sha256=XyksD89ENT2TgzGiS7bU32rs1rHSFAhiamjz78nUft4,1277
168
171
  openapi_client/cyberdesk_cloud_client/models/run_update_run_message_history_type_0_item.py,sha256=j-SrGOc1EgVNQlUk189qUzQLBYCgBvzR23yjvZ71LGw,1338
169
- openapi_client/cyberdesk_cloud_client/models/trajectory_create.py,sha256=zSniVutKhLEH7QmJ4xoYCICTl5gPq_JNhlxVDlMD6aI,6481
172
+ openapi_client/cyberdesk_cloud_client/models/trajectory_create.py,sha256=Hef2LUv6NVAIcw0mLy4DukGzT4XZIw_THqxKH1rrPbk,6844
170
173
  openapi_client/cyberdesk_cloud_client/models/trajectory_create_dimensions.py,sha256=PRX7oM8sseKD0nhJsQ8SYP4aOzjkMtfcza7_jWFVl9Y,1324
171
174
  openapi_client/cyberdesk_cloud_client/models/trajectory_create_original_input_values_type_0.py,sha256=Rz80esN5_oDA-dXeZ9WFhe6POtNJXWvZjoOqw1KUVJM,1360
172
175
  openapi_client/cyberdesk_cloud_client/models/trajectory_create_trajectory_data_item.py,sha256=_8TzdjPWMx4YzsSTCiA_45R2TrNjWhu3nlknQ8KCy_U,1324
173
- openapi_client/cyberdesk_cloud_client/models/trajectory_response.py,sha256=kdW1TehIHTigyLz4MMq6cCf6jxx4xX753p8dyxXHV3M,9020
176
+ openapi_client/cyberdesk_cloud_client/models/trajectory_response.py,sha256=TFesZ-VyHzCYFpsVVBpvooj5Cu438Z2-cd-5xygUstE,9235
174
177
  openapi_client/cyberdesk_cloud_client/models/trajectory_response_dimensions.py,sha256=MG0Le6-JKmCF9oIymTWw1BSNYuk61CX8-EJCWhSRUjE,1334
175
178
  openapi_client/cyberdesk_cloud_client/models/trajectory_response_original_input_values_type_0.py,sha256=ZzFZTF9Z3U8WJWrH8J5yaUOd9QN0v_T8wW9LQgYoEC8,1370
176
179
  openapi_client/cyberdesk_cloud_client/models/trajectory_response_trajectory_data_item.py,sha256=h0JpPrd5qzo3ue4l9jBXk-R49ipVr75W_RsZw6e5cjk,1334
177
- openapi_client/cyberdesk_cloud_client/models/trajectory_update.py,sha256=EF-O37EgyVd9qmdMZk7frNFsSdiiWC7_ZWEoDGMxWnY,4916
180
+ openapi_client/cyberdesk_cloud_client/models/trajectory_update.py,sha256=R9gyxkYkO3Q3bVQ7DWJ7vO01jypNXzJHU4J1ThiwFMM,5695
178
181
  openapi_client/cyberdesk_cloud_client/models/trajectory_update_trajectory_data_type_0_item.py,sha256=3Zt8-nV3ZHjXzL1y5xKQdrHb-7ILG4EjHvtA4xabde4,1355
179
182
  openapi_client/cyberdesk_cloud_client/models/validation_error.py,sha256=ZlK9hbhWr4zSC-dxZh9giERvMiYf9s2k8e1O9Rch_NI,2181
180
183
  openapi_client/cyberdesk_cloud_client/models/workflow_chain_create.py,sha256=SVFhPy0aNBgWWUJwCBhxUmMHfoJSOohbjgW-0_DYLy0,12580
@@ -185,7 +188,7 @@ openapi_client/cyberdesk_cloud_client/models/workflow_create.py,sha256=d0bfNbNBF
185
188
  openapi_client/cyberdesk_cloud_client/models/workflow_response.py,sha256=k48mouJ6Dcisz2vyM7Rb_cbjU66JudGVPsq4UC7grHA,8977
186
189
  openapi_client/cyberdesk_cloud_client/models/workflow_response_old_versions_type_0_item.py,sha256=W9AxxlBlN3rUwLDcoUx5H7MUiYA9UztfX9iEpNGlgAs,1340
187
190
  openapi_client/cyberdesk_cloud_client/models/workflow_update.py,sha256=TG2jEitXixS2thtz7lTxTZaE0RBVSWd-apVxWxsvnrg,5333
188
- cyberdesk-2.1.13.dist-info/METADATA,sha256=_Kn235EGIG2rCMgXEVjYWMY3YsUhrA5R8ew7mRMOvIU,6792
189
- cyberdesk-2.1.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
190
- cyberdesk-2.1.13.dist-info/top_level.txt,sha256=qTYHZHVHh3VClNPQsiFFA8p8tmJgFGhq9G1COd-pX_A,25
191
- cyberdesk-2.1.13.dist-info/RECORD,,
191
+ cyberdesk-2.1.15.dist-info/METADATA,sha256=Tgp2QIE8YLrdVNANalJavpYhhJHLaUpOXjj4kantgTs,6792
192
+ cyberdesk-2.1.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
193
+ cyberdesk-2.1.15.dist-info/top_level.txt,sha256=qTYHZHVHh3VClNPQsiFFA8p8tmJgFGhq9G1COd-pX_A,25
194
+ cyberdesk-2.1.15.dist-info/RECORD,,
@@ -0,0 +1,183 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, Optional, Union, cast
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.http_validation_error import HTTPValidationError
9
+ from ...models.mouse_drag_request import MouseDragRequest
10
+ from ...types import Response
11
+
12
+
13
+ def _get_kwargs(
14
+ machine_id: str,
15
+ *,
16
+ body: MouseDragRequest,
17
+ ) -> dict[str, Any]:
18
+ headers: dict[str, Any] = {}
19
+
20
+ _kwargs: dict[str, Any] = {
21
+ "method": "post",
22
+ "url": f"/v1/computer/{machine_id}/input/mouse/drag",
23
+ }
24
+
25
+ _kwargs["json"] = body.to_dict()
26
+
27
+ headers["Content-Type"] = "application/json"
28
+
29
+ _kwargs["headers"] = headers
30
+ return _kwargs
31
+
32
+
33
+ def _parse_response(
34
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
35
+ ) -> Optional[Union[Any, HTTPValidationError]]:
36
+ if response.status_code == 204:
37
+ response_204 = cast(Any, None)
38
+ return response_204
39
+ if response.status_code == 422:
40
+ response_422 = HTTPValidationError.from_dict(response.json())
41
+
42
+ return response_422
43
+ if client.raise_on_unexpected_status:
44
+ raise errors.UnexpectedStatus(response.status_code, response.content)
45
+ else:
46
+ return None
47
+
48
+
49
+ def _build_response(
50
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
51
+ ) -> Response[Union[Any, HTTPValidationError]]:
52
+ return Response(
53
+ status_code=HTTPStatus(response.status_code),
54
+ content=response.content,
55
+ headers=response.headers,
56
+ parsed=_parse_response(client=client, response=response),
57
+ )
58
+
59
+
60
+ def sync_detailed(
61
+ machine_id: str,
62
+ *,
63
+ client: AuthenticatedClient,
64
+ body: MouseDragRequest,
65
+ ) -> Response[Union[Any, HTTPValidationError]]:
66
+ """Drag mouse (native)
67
+
68
+ Perform a drag operation using absolute coordinates with required start and optional duration.
69
+
70
+ Args:
71
+ machine_id (str):
72
+ body (MouseDragRequest):
73
+
74
+ Raises:
75
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
76
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
77
+
78
+ Returns:
79
+ Response[Union[Any, HTTPValidationError]]
80
+ """
81
+
82
+ kwargs = _get_kwargs(
83
+ machine_id=machine_id,
84
+ body=body,
85
+ )
86
+
87
+ response = client.get_httpx_client().request(
88
+ **kwargs,
89
+ )
90
+
91
+ return _build_response(client=client, response=response)
92
+
93
+
94
+ def sync(
95
+ machine_id: str,
96
+ *,
97
+ client: AuthenticatedClient,
98
+ body: MouseDragRequest,
99
+ ) -> Optional[Union[Any, HTTPValidationError]]:
100
+ """Drag mouse (native)
101
+
102
+ Perform a drag operation using absolute coordinates with required start and optional duration.
103
+
104
+ Args:
105
+ machine_id (str):
106
+ body (MouseDragRequest):
107
+
108
+ Raises:
109
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
110
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
111
+
112
+ Returns:
113
+ Union[Any, HTTPValidationError]
114
+ """
115
+
116
+ return sync_detailed(
117
+ machine_id=machine_id,
118
+ client=client,
119
+ body=body,
120
+ ).parsed
121
+
122
+
123
+ async def asyncio_detailed(
124
+ machine_id: str,
125
+ *,
126
+ client: AuthenticatedClient,
127
+ body: MouseDragRequest,
128
+ ) -> Response[Union[Any, HTTPValidationError]]:
129
+ """Drag mouse (native)
130
+
131
+ Perform a drag operation using absolute coordinates with required start and optional duration.
132
+
133
+ Args:
134
+ machine_id (str):
135
+ body (MouseDragRequest):
136
+
137
+ Raises:
138
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
139
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
140
+
141
+ Returns:
142
+ Response[Union[Any, HTTPValidationError]]
143
+ """
144
+
145
+ kwargs = _get_kwargs(
146
+ machine_id=machine_id,
147
+ body=body,
148
+ )
149
+
150
+ response = await client.get_async_httpx_client().request(**kwargs)
151
+
152
+ return _build_response(client=client, response=response)
153
+
154
+
155
+ async def asyncio(
156
+ machine_id: str,
157
+ *,
158
+ client: AuthenticatedClient,
159
+ body: MouseDragRequest,
160
+ ) -> Optional[Union[Any, HTTPValidationError]]:
161
+ """Drag mouse (native)
162
+
163
+ Perform a drag operation using absolute coordinates with required start and optional duration.
164
+
165
+ Args:
166
+ machine_id (str):
167
+ body (MouseDragRequest):
168
+
169
+ Raises:
170
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
171
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
172
+
173
+ Returns:
174
+ Union[Any, HTTPValidationError]
175
+ """
176
+
177
+ return (
178
+ await asyncio_detailed(
179
+ machine_id=machine_id,
180
+ client=client,
181
+ body=body,
182
+ )
183
+ ).parsed
@@ -15,6 +15,7 @@ from ...types import UNSET, Response, Unset
15
15
  def _get_kwargs(
16
16
  *,
17
17
  workflow_id: Union[None, UUID, Unset] = UNSET,
18
+ is_approved: Union[None, Unset, bool] = UNSET,
18
19
  created_at_from: Union[None, Unset, datetime.datetime] = UNSET,
19
20
  created_at_to: Union[None, Unset, datetime.datetime] = UNSET,
20
21
  updated_at_from: Union[None, Unset, datetime.datetime] = UNSET,
@@ -33,6 +34,13 @@ def _get_kwargs(
33
34
  json_workflow_id = workflow_id
34
35
  params["workflow_id"] = json_workflow_id
35
36
 
37
+ json_is_approved: Union[None, Unset, bool]
38
+ if isinstance(is_approved, Unset):
39
+ json_is_approved = UNSET
40
+ else:
41
+ json_is_approved = is_approved
42
+ params["is_approved"] = json_is_approved
43
+
36
44
  json_created_at_from: Union[None, Unset, str]
37
45
  if isinstance(created_at_from, Unset):
38
46
  json_created_at_from = UNSET
@@ -116,6 +124,7 @@ def sync_detailed(
116
124
  *,
117
125
  client: AuthenticatedClient,
118
126
  workflow_id: Union[None, UUID, Unset] = UNSET,
127
+ is_approved: Union[None, Unset, bool] = UNSET,
119
128
  created_at_from: Union[None, Unset, datetime.datetime] = UNSET,
120
129
  created_at_to: Union[None, Unset, datetime.datetime] = UNSET,
121
130
  updated_at_from: Union[None, Unset, datetime.datetime] = UNSET,
@@ -127,11 +136,14 @@ def sync_detailed(
127
136
 
128
137
  List all trajectories for the authenticated organization.
129
138
 
130
- Supports pagination and filtering by workflow.
139
+ Supports pagination and filtering by workflow and approval status.
140
+ Only approved trajectories are used during workflow execution.
131
141
  Returns trajectories with their associated workflow data.
132
142
 
133
143
  Args:
134
144
  workflow_id (Union[None, UUID, Unset]): Filter by workflow ID
145
+ is_approved (Union[None, Unset, bool]): Filter by approval status (true=approved,
146
+ false=not approved)
135
147
  created_at_from (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
136
148
  after this ISO timestamp (UTC)
137
149
  created_at_to (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
@@ -153,6 +165,7 @@ def sync_detailed(
153
165
 
154
166
  kwargs = _get_kwargs(
155
167
  workflow_id=workflow_id,
168
+ is_approved=is_approved,
156
169
  created_at_from=created_at_from,
157
170
  created_at_to=created_at_to,
158
171
  updated_at_from=updated_at_from,
@@ -172,6 +185,7 @@ def sync(
172
185
  *,
173
186
  client: AuthenticatedClient,
174
187
  workflow_id: Union[None, UUID, Unset] = UNSET,
188
+ is_approved: Union[None, Unset, bool] = UNSET,
175
189
  created_at_from: Union[None, Unset, datetime.datetime] = UNSET,
176
190
  created_at_to: Union[None, Unset, datetime.datetime] = UNSET,
177
191
  updated_at_from: Union[None, Unset, datetime.datetime] = UNSET,
@@ -183,11 +197,14 @@ def sync(
183
197
 
184
198
  List all trajectories for the authenticated organization.
185
199
 
186
- Supports pagination and filtering by workflow.
200
+ Supports pagination and filtering by workflow and approval status.
201
+ Only approved trajectories are used during workflow execution.
187
202
  Returns trajectories with their associated workflow data.
188
203
 
189
204
  Args:
190
205
  workflow_id (Union[None, UUID, Unset]): Filter by workflow ID
206
+ is_approved (Union[None, Unset, bool]): Filter by approval status (true=approved,
207
+ false=not approved)
191
208
  created_at_from (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
192
209
  after this ISO timestamp (UTC)
193
210
  created_at_to (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
@@ -210,6 +227,7 @@ def sync(
210
227
  return sync_detailed(
211
228
  client=client,
212
229
  workflow_id=workflow_id,
230
+ is_approved=is_approved,
213
231
  created_at_from=created_at_from,
214
232
  created_at_to=created_at_to,
215
233
  updated_at_from=updated_at_from,
@@ -223,6 +241,7 @@ async def asyncio_detailed(
223
241
  *,
224
242
  client: AuthenticatedClient,
225
243
  workflow_id: Union[None, UUID, Unset] = UNSET,
244
+ is_approved: Union[None, Unset, bool] = UNSET,
226
245
  created_at_from: Union[None, Unset, datetime.datetime] = UNSET,
227
246
  created_at_to: Union[None, Unset, datetime.datetime] = UNSET,
228
247
  updated_at_from: Union[None, Unset, datetime.datetime] = UNSET,
@@ -234,11 +253,14 @@ async def asyncio_detailed(
234
253
 
235
254
  List all trajectories for the authenticated organization.
236
255
 
237
- Supports pagination and filtering by workflow.
256
+ Supports pagination and filtering by workflow and approval status.
257
+ Only approved trajectories are used during workflow execution.
238
258
  Returns trajectories with their associated workflow data.
239
259
 
240
260
  Args:
241
261
  workflow_id (Union[None, UUID, Unset]): Filter by workflow ID
262
+ is_approved (Union[None, Unset, bool]): Filter by approval status (true=approved,
263
+ false=not approved)
242
264
  created_at_from (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
243
265
  after this ISO timestamp (UTC)
244
266
  created_at_to (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
@@ -260,6 +282,7 @@ async def asyncio_detailed(
260
282
 
261
283
  kwargs = _get_kwargs(
262
284
  workflow_id=workflow_id,
285
+ is_approved=is_approved,
263
286
  created_at_from=created_at_from,
264
287
  created_at_to=created_at_to,
265
288
  updated_at_from=updated_at_from,
@@ -277,6 +300,7 @@ async def asyncio(
277
300
  *,
278
301
  client: AuthenticatedClient,
279
302
  workflow_id: Union[None, UUID, Unset] = UNSET,
303
+ is_approved: Union[None, Unset, bool] = UNSET,
280
304
  created_at_from: Union[None, Unset, datetime.datetime] = UNSET,
281
305
  created_at_to: Union[None, Unset, datetime.datetime] = UNSET,
282
306
  updated_at_from: Union[None, Unset, datetime.datetime] = UNSET,
@@ -288,11 +312,14 @@ async def asyncio(
288
312
 
289
313
  List all trajectories for the authenticated organization.
290
314
 
291
- Supports pagination and filtering by workflow.
315
+ Supports pagination and filtering by workflow and approval status.
316
+ Only approved trajectories are used during workflow execution.
292
317
  Returns trajectories with their associated workflow data.
293
318
 
294
319
  Args:
295
320
  workflow_id (Union[None, UUID, Unset]): Filter by workflow ID
321
+ is_approved (Union[None, Unset, bool]): Filter by approval status (true=approved,
322
+ false=not approved)
296
323
  created_at_from (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
297
324
  after this ISO timestamp (UTC)
298
325
  created_at_to (Union[None, Unset, datetime.datetime]): Filter trajectories created at or
@@ -316,6 +343,7 @@ async def asyncio(
316
343
  await asyncio_detailed(
317
344
  client=client,
318
345
  workflow_id=workflow_id,
346
+ is_approved=is_approved,
319
347
  created_at_from=created_at_from,
320
348
  created_at_to=created_at_to,
321
349
  updated_at_from=updated_at_from,
@@ -3,6 +3,7 @@
3
3
  from .attachment_type import AttachmentType
4
4
  from .chain_step import ChainStep
5
5
  from .chain_step_inputs_type_0 import ChainStepInputsType0
6
+ from .chain_step_sensitive_inputs_type_0 import ChainStepSensitiveInputsType0
6
7
  from .connection_create import ConnectionCreate
7
8
  from .connection_response import ConnectionResponse
8
9
  from .connection_status import ConnectionStatus
@@ -41,6 +42,7 @@ from .machine_response import MachineResponse
41
42
  from .machine_status import MachineStatus
42
43
  from .machine_update import MachineUpdate
43
44
  from .mouse_click_request import MouseClickRequest
45
+ from .mouse_drag_request import MouseDragRequest
44
46
  from .mouse_move_request import MouseMoveRequest
45
47
  from .mouse_position import MousePosition
46
48
  from .mouse_scroll_request import MouseScrollRequest
@@ -118,6 +120,7 @@ __all__ = (
118
120
  "AttachmentType",
119
121
  "ChainStep",
120
122
  "ChainStepInputsType0",
123
+ "ChainStepSensitiveInputsType0",
121
124
  "ConnectionCreate",
122
125
  "ConnectionResponse",
123
126
  "ConnectionStatus",
@@ -142,6 +145,7 @@ __all__ = (
142
145
  "MachineStatus",
143
146
  "MachineUpdate",
144
147
  "MouseClickRequest",
148
+ "MouseDragRequest",
145
149
  "MouseMoveRequest",
146
150
  "MousePosition",
147
151
  "MouseScrollRequest",
@@ -9,6 +9,7 @@ from ..types import UNSET, Unset
9
9
 
10
10
  if TYPE_CHECKING:
11
11
  from ..models.chain_step_inputs_type_0 import ChainStepInputsType0
12
+ from ..models.chain_step_sensitive_inputs_type_0 import ChainStepSensitiveInputsType0
12
13
 
13
14
 
14
15
  T = TypeVar("T", bound="ChainStep")
@@ -23,15 +24,19 @@ class ChainStep:
23
24
  session_alias (Union[None, Unset, str]): Alias to persist this step's outputs within the session
24
25
  inputs (Union['ChainStepInputsType0', None, Unset]): Step-specific inputs; values must be string or {$ref:
25
26
  'alias.outputs.path'}
27
+ sensitive_inputs (Union['ChainStepSensitiveInputsType0', None, Unset]): Step-specific sensitive inputs that
28
+ override or extend shared_sensitive_inputs
26
29
  """
27
30
 
28
31
  workflow_id: UUID
29
32
  session_alias: Union[None, Unset, str] = UNSET
30
33
  inputs: Union["ChainStepInputsType0", None, Unset] = UNSET
34
+ sensitive_inputs: Union["ChainStepSensitiveInputsType0", None, Unset] = UNSET
31
35
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
32
36
 
33
37
  def to_dict(self) -> dict[str, Any]:
34
38
  from ..models.chain_step_inputs_type_0 import ChainStepInputsType0
39
+ from ..models.chain_step_sensitive_inputs_type_0 import ChainStepSensitiveInputsType0
35
40
 
36
41
  workflow_id = str(self.workflow_id)
37
42
 
@@ -49,6 +54,14 @@ class ChainStep:
49
54
  else:
50
55
  inputs = self.inputs
51
56
 
57
+ sensitive_inputs: Union[None, Unset, dict[str, Any]]
58
+ if isinstance(self.sensitive_inputs, Unset):
59
+ sensitive_inputs = UNSET
60
+ elif isinstance(self.sensitive_inputs, ChainStepSensitiveInputsType0):
61
+ sensitive_inputs = self.sensitive_inputs.to_dict()
62
+ else:
63
+ sensitive_inputs = self.sensitive_inputs
64
+
52
65
  field_dict: dict[str, Any] = {}
53
66
  field_dict.update(self.additional_properties)
54
67
  field_dict.update(
@@ -60,12 +73,15 @@ class ChainStep:
60
73
  field_dict["session_alias"] = session_alias
61
74
  if inputs is not UNSET:
62
75
  field_dict["inputs"] = inputs
76
+ if sensitive_inputs is not UNSET:
77
+ field_dict["sensitive_inputs"] = sensitive_inputs
63
78
 
64
79
  return field_dict
65
80
 
66
81
  @classmethod
67
82
  def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
68
83
  from ..models.chain_step_inputs_type_0 import ChainStepInputsType0
84
+ from ..models.chain_step_sensitive_inputs_type_0 import ChainStepSensitiveInputsType0
69
85
 
70
86
  d = dict(src_dict)
71
87
  workflow_id = UUID(d.pop("workflow_id"))
@@ -96,10 +112,28 @@ class ChainStep:
96
112
 
97
113
  inputs = _parse_inputs(d.pop("inputs", UNSET))
98
114
 
115
+ def _parse_sensitive_inputs(data: object) -> Union["ChainStepSensitiveInputsType0", None, Unset]:
116
+ if data is None:
117
+ return data
118
+ if isinstance(data, Unset):
119
+ return data
120
+ try:
121
+ if not isinstance(data, dict):
122
+ raise TypeError()
123
+ sensitive_inputs_type_0 = ChainStepSensitiveInputsType0.from_dict(data)
124
+
125
+ return sensitive_inputs_type_0
126
+ except: # noqa: E722
127
+ pass
128
+ return cast(Union["ChainStepSensitiveInputsType0", None, Unset], data)
129
+
130
+ sensitive_inputs = _parse_sensitive_inputs(d.pop("sensitive_inputs", UNSET))
131
+
99
132
  chain_step = cls(
100
133
  workflow_id=workflow_id,
101
134
  session_alias=session_alias,
102
135
  inputs=inputs,
136
+ sensitive_inputs=sensitive_inputs,
103
137
  )
104
138
 
105
139
  chain_step.additional_properties = d
@@ -0,0 +1,44 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ T = TypeVar("T", bound="ChainStepSensitiveInputsType0")
8
+
9
+
10
+ @_attrs_define
11
+ class ChainStepSensitiveInputsType0:
12
+ """ """
13
+
14
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ chain_step_sensitive_inputs_type_0 = cls()
26
+
27
+ chain_step_sensitive_inputs_type_0.additional_properties = d
28
+ return chain_step_sensitive_inputs_type_0
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> str:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: str) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,125 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar, Union, cast
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ from ..types import UNSET, Unset
8
+
9
+ T = TypeVar("T", bound="MouseDragRequest")
10
+
11
+
12
+ @_attrs_define
13
+ class MouseDragRequest:
14
+ """
15
+ Attributes:
16
+ to_x (int):
17
+ to_y (int):
18
+ start_x (int):
19
+ start_y (int):
20
+ duration (Union[None, Unset, float]):
21
+ button (Union[None, Unset, str]): 'left' | 'right' | 'middle' Default: 'left'.
22
+ """
23
+
24
+ to_x: int
25
+ to_y: int
26
+ start_x: int
27
+ start_y: int
28
+ duration: Union[None, Unset, float] = UNSET
29
+ button: Union[None, Unset, str] = "left"
30
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
31
+
32
+ def to_dict(self) -> dict[str, Any]:
33
+ to_x = self.to_x
34
+
35
+ to_y = self.to_y
36
+
37
+ start_x = self.start_x
38
+
39
+ start_y = self.start_y
40
+
41
+ duration: Union[None, Unset, float]
42
+ if isinstance(self.duration, Unset):
43
+ duration = UNSET
44
+ else:
45
+ duration = self.duration
46
+
47
+ button: Union[None, Unset, str]
48
+ if isinstance(self.button, Unset):
49
+ button = UNSET
50
+ else:
51
+ button = self.button
52
+
53
+ field_dict: dict[str, Any] = {}
54
+ field_dict.update(self.additional_properties)
55
+ field_dict.update(
56
+ {
57
+ "to_x": to_x,
58
+ "to_y": to_y,
59
+ "start_x": start_x,
60
+ "start_y": start_y,
61
+ }
62
+ )
63
+ if duration is not UNSET:
64
+ field_dict["duration"] = duration
65
+ if button is not UNSET:
66
+ field_dict["button"] = button
67
+
68
+ return field_dict
69
+
70
+ @classmethod
71
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
72
+ d = dict(src_dict)
73
+ to_x = d.pop("to_x")
74
+
75
+ to_y = d.pop("to_y")
76
+
77
+ start_x = d.pop("start_x")
78
+
79
+ start_y = d.pop("start_y")
80
+
81
+ def _parse_duration(data: object) -> Union[None, Unset, float]:
82
+ if data is None:
83
+ return data
84
+ if isinstance(data, Unset):
85
+ return data
86
+ return cast(Union[None, Unset, float], data)
87
+
88
+ duration = _parse_duration(d.pop("duration", UNSET))
89
+
90
+ def _parse_button(data: object) -> Union[None, Unset, str]:
91
+ if data is None:
92
+ return data
93
+ if isinstance(data, Unset):
94
+ return data
95
+ return cast(Union[None, Unset, str], data)
96
+
97
+ button = _parse_button(d.pop("button", UNSET))
98
+
99
+ mouse_drag_request = cls(
100
+ to_x=to_x,
101
+ to_y=to_y,
102
+ start_x=start_x,
103
+ start_y=start_y,
104
+ duration=duration,
105
+ button=button,
106
+ )
107
+
108
+ mouse_drag_request.additional_properties = d
109
+ return mouse_drag_request
110
+
111
+ @property
112
+ def additional_keys(self) -> list[str]:
113
+ return list(self.additional_properties.keys())
114
+
115
+ def __getitem__(self, key: str) -> Any:
116
+ return self.additional_properties[key]
117
+
118
+ def __setitem__(self, key: str, value: Any) -> None:
119
+ self.additional_properties[key] = value
120
+
121
+ def __delitem__(self, key: str) -> None:
122
+ del self.additional_properties[key]
123
+
124
+ def __contains__(self, key: str) -> bool:
125
+ return key in self.additional_properties
@@ -28,6 +28,7 @@ class TrajectoryCreate:
28
28
  description (Union[None, Unset, str]):
29
29
  original_input_values (Union['TrajectoryCreateOriginalInputValuesType0', None, Unset]): Original input values
30
30
  used when trajectory was created
31
+ is_approved (Union[Unset, bool]): Whether this trajectory is approved for use Default: False.
31
32
  """
32
33
 
33
34
  workflow_id: UUID
@@ -36,6 +37,7 @@ class TrajectoryCreate:
36
37
  name: Union[None, Unset, str] = UNSET
37
38
  description: Union[None, Unset, str] = UNSET
38
39
  original_input_values: Union["TrajectoryCreateOriginalInputValuesType0", None, Unset] = UNSET
40
+ is_approved: Union[Unset, bool] = False
39
41
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
40
42
 
41
43
  def to_dict(self) -> dict[str, Any]:
@@ -70,6 +72,8 @@ class TrajectoryCreate:
70
72
  else:
71
73
  original_input_values = self.original_input_values
72
74
 
75
+ is_approved = self.is_approved
76
+
73
77
  field_dict: dict[str, Any] = {}
74
78
  field_dict.update(self.additional_properties)
75
79
  field_dict.update(
@@ -85,6 +89,8 @@ class TrajectoryCreate:
85
89
  field_dict["description"] = description
86
90
  if original_input_values is not UNSET:
87
91
  field_dict["original_input_values"] = original_input_values
92
+ if is_approved is not UNSET:
93
+ field_dict["is_approved"] = is_approved
88
94
 
89
95
  return field_dict
90
96
 
@@ -143,6 +149,8 @@ class TrajectoryCreate:
143
149
 
144
150
  original_input_values = _parse_original_input_values(d.pop("original_input_values", UNSET))
145
151
 
152
+ is_approved = d.pop("is_approved", UNSET)
153
+
146
154
  trajectory_create = cls(
147
155
  workflow_id=workflow_id,
148
156
  trajectory_data=trajectory_data,
@@ -150,6 +158,7 @@ class TrajectoryCreate:
150
158
  name=name,
151
159
  description=description,
152
160
  original_input_values=original_input_values,
161
+ is_approved=is_approved,
153
162
  )
154
163
 
155
164
  trajectory_create.additional_properties = d
@@ -26,6 +26,7 @@ class TrajectoryResponse:
26
26
  workflow_id (UUID):
27
27
  trajectory_data (list['TrajectoryResponseTrajectoryDataItem']):
28
28
  dimensions (TrajectoryResponseDimensions): Display dimensions when trajectory was recorded
29
+ is_approved (bool):
29
30
  id (UUID):
30
31
  created_at (datetime.datetime):
31
32
  updated_at (datetime.datetime):
@@ -40,6 +41,7 @@ class TrajectoryResponse:
40
41
  workflow_id: UUID
41
42
  trajectory_data: list["TrajectoryResponseTrajectoryDataItem"]
42
43
  dimensions: "TrajectoryResponseDimensions"
44
+ is_approved: bool
43
45
  id: UUID
44
46
  created_at: datetime.datetime
45
47
  updated_at: datetime.datetime
@@ -62,6 +64,8 @@ class TrajectoryResponse:
62
64
 
63
65
  dimensions = self.dimensions.to_dict()
64
66
 
67
+ is_approved = self.is_approved
68
+
65
69
  id = str(self.id)
66
70
 
67
71
  created_at = self.created_at.isoformat()
@@ -109,6 +113,7 @@ class TrajectoryResponse:
109
113
  "workflow_id": workflow_id,
110
114
  "trajectory_data": trajectory_data,
111
115
  "dimensions": dimensions,
116
+ "is_approved": is_approved,
112
117
  "id": id,
113
118
  "created_at": created_at,
114
119
  "updated_at": updated_at,
@@ -145,6 +150,8 @@ class TrajectoryResponse:
145
150
 
146
151
  dimensions = TrajectoryResponseDimensions.from_dict(d.pop("dimensions"))
147
152
 
153
+ is_approved = d.pop("is_approved")
154
+
148
155
  id = UUID(d.pop("id"))
149
156
 
150
157
  created_at = isoparse(d.pop("created_at"))
@@ -218,6 +225,7 @@ class TrajectoryResponse:
218
225
  workflow_id=workflow_id,
219
226
  trajectory_data=trajectory_data,
220
227
  dimensions=dimensions,
228
+ is_approved=is_approved,
221
229
  id=id,
222
230
  created_at=created_at,
223
231
  updated_at=updated_at,
@@ -21,11 +21,13 @@ class TrajectoryUpdate:
21
21
  name (Union[None, Unset, str]):
22
22
  description (Union[None, Unset, str]):
23
23
  trajectory_data (Union[None, Unset, list['TrajectoryUpdateTrajectoryDataType0Item']]):
24
+ is_approved (Union[None, Unset, bool]): Whether this trajectory is approved for use
24
25
  """
25
26
 
26
27
  name: Union[None, Unset, str] = UNSET
27
28
  description: Union[None, Unset, str] = UNSET
28
29
  trajectory_data: Union[None, Unset, list["TrajectoryUpdateTrajectoryDataType0Item"]] = UNSET
30
+ is_approved: Union[None, Unset, bool] = UNSET
29
31
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
32
 
31
33
  def to_dict(self) -> dict[str, Any]:
@@ -53,6 +55,12 @@ class TrajectoryUpdate:
53
55
  else:
54
56
  trajectory_data = self.trajectory_data
55
57
 
58
+ is_approved: Union[None, Unset, bool]
59
+ if isinstance(self.is_approved, Unset):
60
+ is_approved = UNSET
61
+ else:
62
+ is_approved = self.is_approved
63
+
56
64
  field_dict: dict[str, Any] = {}
57
65
  field_dict.update(self.additional_properties)
58
66
  field_dict.update({})
@@ -62,6 +70,8 @@ class TrajectoryUpdate:
62
70
  field_dict["description"] = description
63
71
  if trajectory_data is not UNSET:
64
72
  field_dict["trajectory_data"] = trajectory_data
73
+ if is_approved is not UNSET:
74
+ field_dict["is_approved"] = is_approved
65
75
 
66
76
  return field_dict
67
77
 
@@ -113,10 +123,20 @@ class TrajectoryUpdate:
113
123
 
114
124
  trajectory_data = _parse_trajectory_data(d.pop("trajectory_data", UNSET))
115
125
 
126
+ def _parse_is_approved(data: object) -> Union[None, Unset, bool]:
127
+ if data is None:
128
+ return data
129
+ if isinstance(data, Unset):
130
+ return data
131
+ return cast(Union[None, Unset, bool], data)
132
+
133
+ is_approved = _parse_is_approved(d.pop("is_approved", UNSET))
134
+
116
135
  trajectory_update = cls(
117
136
  name=name,
118
137
  description=description,
119
138
  trajectory_data=trajectory_data,
139
+ is_approved=is_approved,
120
140
  )
121
141
 
122
142
  trajectory_update.additional_properties = d