kscale 0.3.16__py3-none-any.whl → 0.3.18__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.
kscale/web/gen/api.py CHANGED
@@ -2,15 +2,31 @@
2
2
 
3
3
  # generated by datamodel-codegen:
4
4
  # filename: openapi.json
5
- # timestamp: 2025-05-24T14:48:07+00:00
5
+ # timestamp: 2025-09-03T23:04:34+00:00
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ from datetime import datetime
9
10
  from typing import Dict, List, Optional, Union
10
11
 
11
12
  from pydantic import BaseModel, Field
12
13
 
13
14
 
15
+ class APIKey(BaseModel):
16
+ id: str = Field(..., title="Id")
17
+ user_id: str = Field(..., title="User Id")
18
+ name: str = Field(..., title="Name")
19
+ key_hash: str = Field(..., title="Key Hash")
20
+ permissions: List[str] = Field(..., title="Permissions")
21
+ email: str = Field(..., title="Email")
22
+ email_verified: bool = Field(..., title="Email Verified")
23
+ created_at: datetime = Field(..., title="Created At")
24
+ last_used_at: Optional[datetime] = Field(None, title="Last Used At")
25
+ expires_at: Optional[datetime] = Field(None, title="Expires At")
26
+ is_active: Optional[bool] = Field(True, title="Is Active")
27
+ is_admin: Optional[bool] = Field(False, title="Is Admin")
28
+
29
+
14
30
  class APIKeyRequest(BaseModel):
15
31
  num_hours: Optional[int] = Field(24, title="Num Hours")
16
32
 
@@ -19,6 +35,16 @@ class APIKeyResponse(BaseModel):
19
35
  api_key: str = Field(..., title="Api Key")
20
36
 
21
37
 
38
+ class APIKeySummaryResponse(BaseModel):
39
+ id: str = Field(..., title="Id")
40
+ name: str = Field(..., title="Name")
41
+ permissions: List[str] = Field(..., title="Permissions")
42
+ created_at: datetime = Field(..., title="Created At")
43
+ last_used_at: Optional[datetime] = Field(..., title="Last Used At")
44
+ expires_at: Optional[datetime] = Field(..., title="Expires At")
45
+ is_active: bool = Field(..., title="Is Active")
46
+
47
+
22
48
  class ActuatorMetadataInput(BaseModel):
23
49
  actuator_type: Optional[str] = Field(None, title="Actuator Type")
24
50
  sysid: Optional[str] = Field(None, title="Sysid")
@@ -53,6 +79,14 @@ class ActuatorMetadataOutput(BaseModel):
53
79
  error_gain: Optional[str] = Field(None, title="Error Gain")
54
80
 
55
81
 
82
+ class AddClipRequest(BaseModel):
83
+ description: Optional[str] = Field(None, title="Description")
84
+
85
+
86
+ class AddPermissionRequest(BaseModel):
87
+ permission: str = Field(..., title="Permission")
88
+
89
+
56
90
  class AddRobotClassRequest(BaseModel):
57
91
  description: Optional[str] = Field(None, title="Description")
58
92
 
@@ -62,6 +96,109 @@ class AddRobotRequest(BaseModel):
62
96
  class_name: str = Field(..., title="Class Name")
63
97
 
64
98
 
99
+ class Agent(BaseModel):
100
+ id: str = Field(..., title="Id")
101
+ user_id: str = Field(..., title="User Id")
102
+ upload_time: str = Field(..., title="Upload Time")
103
+ description: Optional[str] = Field(None, title="Description")
104
+ num_downloads: Optional[int] = Field(0, title="Num Downloads")
105
+
106
+
107
+ class AgentDownloadResponse(BaseModel):
108
+ url: str = Field(..., title="Url")
109
+ md5_hash: str = Field(..., title="Md5 Hash")
110
+
111
+
112
+ class AgentUploadRequest(BaseModel):
113
+ filename: str = Field(..., title="Filename")
114
+ content_type: str = Field(..., title="Content Type")
115
+
116
+
117
+ class AgentUploadResponse(BaseModel):
118
+ url: str = Field(..., title="Url")
119
+ filename: str = Field(..., title="Filename")
120
+ content_type: str = Field(..., title="Content Type")
121
+
122
+
123
+ class Clip(BaseModel):
124
+ id: str = Field(..., title="Id")
125
+ description: Optional[str] = Field(None, title="Description")
126
+ user_id: str = Field(..., title="User Id")
127
+ created_at: datetime = Field(..., title="Created At")
128
+ num_downloads: Optional[int] = Field(0, title="Num Downloads")
129
+ file_size: Optional[int] = Field(None, title="File Size")
130
+
131
+
132
+ class ClipDownloadResponse(BaseModel):
133
+ url: str = Field(..., title="Url")
134
+ md5_hash: str = Field(..., title="Md5 Hash")
135
+
136
+
137
+ class ClipUploadRequest(BaseModel):
138
+ filename: str = Field(..., title="Filename")
139
+ content_type: str = Field(..., title="Content Type")
140
+
141
+
142
+ class ClipUploadResponse(BaseModel):
143
+ url: str = Field(..., title="Url")
144
+ filename: str = Field(..., title="Filename")
145
+ content_type: str = Field(..., title="Content Type")
146
+
147
+
148
+ class CreateAPIKeyRequest(BaseModel):
149
+ name: str = Field(..., title="Name")
150
+ permissions: List[str] = Field(..., title="Permissions")
151
+ expires_at: Optional[datetime] = Field(None, title="Expires At")
152
+
153
+
154
+ class CreateAPIKeyResponse(BaseModel):
155
+ api_key: APIKey
156
+ plain_key: str = Field(..., title="Plain Key")
157
+
158
+
159
+ class CreateAgentRequest(BaseModel):
160
+ description: Optional[str] = Field(None, title="Description")
161
+
162
+
163
+ class CreateGroupRequest(BaseModel):
164
+ name: str = Field(..., title="Name")
165
+ description: Optional[str] = Field(None, title="Description")
166
+
167
+
168
+ class GroupMembershipResponse(BaseModel):
169
+ id: str = Field(..., title="Id")
170
+ group_id: str = Field(..., title="Group Id")
171
+ user_id: str = Field(..., title="User Id")
172
+ status: str = Field(..., title="Status")
173
+ requested_at: str = Field(..., title="Requested At")
174
+ approved_at: Optional[str] = Field(..., title="Approved At")
175
+ approved_by: Optional[str] = Field(..., title="Approved By")
176
+
177
+
178
+ class GroupResponse(BaseModel):
179
+ id: str = Field(..., title="Id")
180
+ name: str = Field(..., title="Name")
181
+ description: Optional[str] = Field(..., title="Description")
182
+ owner_id: str = Field(..., title="Owner Id")
183
+ created_at: str = Field(..., title="Created At")
184
+ updated_at: str = Field(..., title="Updated At")
185
+ is_active: bool = Field(..., title="Is Active")
186
+
187
+
188
+ class GroupShareRequest(BaseModel):
189
+ resource_type: str = Field(..., title="Resource Type")
190
+ resource_id: str = Field(..., title="Resource Id")
191
+
192
+
193
+ class GroupShareResponse(BaseModel):
194
+ id: str = Field(..., title="Id")
195
+ group_id: str = Field(..., title="Group Id")
196
+ resource_type: str = Field(..., title="Resource Type")
197
+ resource_id: str = Field(..., title="Resource Id")
198
+ shared_by: str = Field(..., title="Shared By")
199
+ shared_at: str = Field(..., title="Shared At")
200
+
201
+
65
202
  class JointMetadataInput(BaseModel):
66
203
  id: Optional[int] = Field(None, title="Id")
67
204
  kp: Optional[Union[float, str]] = Field(None, title="Kp")
@@ -92,11 +229,16 @@ class JointMetadataOutput(BaseModel):
92
229
  max_angle_deg: Optional[str] = Field(None, title="Max Angle Deg")
93
230
 
94
231
 
95
- class OICDInfo(BaseModel):
232
+ class OIDCInfo(BaseModel):
96
233
  authority: str = Field(..., title="Authority")
97
234
  client_id: str = Field(..., title="Client Id")
98
235
 
99
236
 
237
+ class PermissionResponse(BaseModel):
238
+ permission: str = Field(..., title="Permission")
239
+ description: str = Field(..., title="Description")
240
+
241
+
100
242
  class Robot(BaseModel):
101
243
  id: str = Field(..., title="Id")
102
244
  robot_name: str = Field(..., title="Robot Name")
@@ -145,6 +287,23 @@ class RobotUploadURDFResponse(BaseModel):
145
287
  content_type: str = Field(..., title="Content Type")
146
288
 
147
289
 
290
+ class UpdateAPIKeyPermissionsRequest(BaseModel):
291
+ permissions: List[str] = Field(..., title="Permissions")
292
+
293
+
294
+ class UpdateAgentRequest(BaseModel):
295
+ description: Optional[str] = Field(None, title="Description")
296
+
297
+
298
+ class UpdateClipRequest(BaseModel):
299
+ new_description: Optional[str] = Field(None, title="New Description")
300
+
301
+
302
+ class UpdateGroupRequest(BaseModel):
303
+ name: Optional[str] = Field(None, title="Name")
304
+ description: Optional[str] = Field(None, title="Description")
305
+
306
+
148
307
  class UpdateRobotClassRequest(BaseModel):
149
308
  new_class_name: Optional[str] = Field(None, title="New Class Name")
150
309
  new_description: Optional[str] = Field(None, title="New Description")
@@ -156,11 +315,21 @@ class UpdateRobotRequest(BaseModel):
156
315
  new_description: Optional[str] = Field(None, title="New Description")
157
316
 
158
317
 
318
+ class UpdateUserPermissionsRequest(BaseModel):
319
+ permissions: List[str] = Field(..., title="Permissions")
320
+
321
+
322
+ class UserPermissionsResponse(BaseModel):
323
+ user_id: str = Field(..., title="User Id")
324
+ display_name: str = Field(..., title="Display Name")
325
+ email: str = Field(..., title="Email")
326
+ permissions: List[str] = Field(..., title="Permissions")
327
+ is_active: bool = Field(..., title="Is Active")
328
+
329
+
159
330
  class UserResponse(BaseModel):
160
331
  user_id: str = Field(..., title="User Id")
161
332
  is_admin: bool = Field(..., title="Is Admin")
162
- can_upload: bool = Field(..., title="Can Upload")
163
- can_test: bool = Field(..., title="Can Test")
164
333
 
165
334
 
166
335
  class ValidationError(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kscale
3
- Version: 0.3.16
3
+ Version: 0.3.18
4
4
  Summary: The kscale project
5
5
  Home-page: https://github.com/kscalelabs/kscale
6
6
  Author: Benjamin Bolte
@@ -1,5 +1,5 @@
1
- kscale/__init__.py,sha256=5x-_pHWpOD5zG1UOxmRMHWvFPV0wM_MPn7MhE8xYFgg,201
2
- kscale/cli.py,sha256=JvaPtmWvF7s0D4I3K98eZAItf3oOi2ULsn5aPGxDcu4,795
1
+ kscale/__init__.py,sha256=yFIa0TyrRcBHZxIJp6qoKq_e2RFK9vspsF4A72f87ZA,201
2
+ kscale/cli.py,sha256=Yj_2ru8OP7LtI-wMaM1eXiigK__CHf85UgAikapwXMU,1072
3
3
  kscale/conf.py,sha256=dm35XSnzJp93St-ixVtYN4Nvqvb5upPGBrWkSI6Yb-4,1743
4
4
  kscale/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  kscale/requirements-dev.txt,sha256=WI7-ea4IRJakmqVMN8QKhOsDGrghwtvk03aIsFaNSIw,130
@@ -14,20 +14,26 @@ kscale/utils/cli.py,sha256=JoaY5x5SdUx97KmMM9j5AjRRUqqrTlJ9qVckZptEsYA,827
14
14
  kscale/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  kscale/web/utils.py,sha256=Mme-FAQ0_zbjjOQeX8wyq8F4kL4i9fH7ytri16U6qOA,1046
16
16
  kscale/web/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ kscale/web/cli/clip.py,sha256=JkGImMqEYiAkvhlNG3LtV2JJMRVAHhsEU3U7ztYIB6s,4450
18
+ kscale/web/cli/group.py,sha256=jIlnPViLosb19xPB_6_jEgrX-oLE1FxnfBIApWEJQps,7909
19
+ kscale/web/cli/permission.py,sha256=P0ZPexAD6qhTyyp--xpOFni3Q0VmKhhUyk75aNW7YzI,3617
17
20
  kscale/web/cli/robot.py,sha256=rI-A4_0uvJPeA71Apl4Z3mV5fIfWkgmzT9JRmJYxz3A,3307
18
- kscale/web/cli/robot_class.py,sha256=dOmB1z1l0bkSXnwgb4M6kbcJpHV4YAdT9l_po83C05w,19647
19
- kscale/web/cli/user.py,sha256=9IGsJBPyhjsmT04mZ2RGOs35ePfqB2RltYP0Ty5zF5o,1290
21
+ kscale/web/cli/robot_class.py,sha256=lmA0gxXiFTMoUtq6FBPwr8gRfM_hkAMJ7KOog5RUZII,19715
22
+ kscale/web/cli/user.py,sha256=acerUkVjAG7n3pPAs_HWJ_GNf9n-7t6sTlOrVh_O5Vs,939
20
23
  kscale/web/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- kscale/web/clients/base.py,sha256=P5AZdoawNpocgx_8j5v0eauowG5suUf8SnnD7q1_gx0,16213
22
- kscale/web/clients/client.py,sha256=rzW2s8T7bKVuybOSQ65-ghl02rcXBoOxnx_nUDwgEPw,362
24
+ kscale/web/clients/base.py,sha256=rgo0Td5OoqYJxK-QkXafVvVMJzJkecAi1wLpPtARZrQ,4147
25
+ kscale/web/clients/client.py,sha256=POkyqkN8fJXAfpSSfmNI4IsV9FJZdcmQwU7azNMWWFk,572
26
+ kscale/web/clients/clip.py,sha256=XZTl_ZK-m_VgDVAOZKA3ge904RCp2bsUrL4NPUe565Q,4487
27
+ kscale/web/clients/group.py,sha256=LpMtX3gbqWKSltWbuMIYVpL8BSO_iI1WE-4r0XgwrHY,3938
28
+ kscale/web/clients/permission.py,sha256=lhT9kwhsxS6HImcOSP1i0uhfYKPlDjAht7uJwkgS0Bo,1964
23
29
  kscale/web/clients/robot.py,sha256=PI8HHkU-4Re9I5rLpp6dGbekRE-rBNVfXZxR_mO2MqE,1485
24
30
  kscale/web/clients/robot_class.py,sha256=LCKje6nNsDBeKDxZAGCO9vQXdyOwtx0woMmB5vDoUmE,7230
25
- kscale/web/clients/user.py,sha256=jsa1_s6qXRM-AGBbHlPhd1NierUtynjY9tVAPNr6_Os,568
31
+ kscale/web/clients/user.py,sha256=9iv8J-ROm_yBIwi-0oqldReLkNBFktdHRv3UCOxBzjY,377
26
32
  kscale/web/gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- kscale/web/gen/api.py,sha256=eV_IiF6-RhD7fd8naqKwK56bQtG1_-XVlr5PMpYr38E,7607
28
- kscale-0.3.16.dist-info/licenses/LICENSE,sha256=HCN2bImAzUOXldAZZI7JZ9PYq6OwMlDAP_PpX1HnuN0,1071
29
- kscale-0.3.16.dist-info/METADATA,sha256=cI35QIX6j-cVeWr_if6dv-5EQIneJk3jsqd_72Nph94,2350
30
- kscale-0.3.16.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
31
- kscale-0.3.16.dist-info/entry_points.txt,sha256=N_0pCpPnwGDYVzOeuaSOrbJkS5L3lS9d8CxpJF1f8UI,62
32
- kscale-0.3.16.dist-info/top_level.txt,sha256=C2ynjYwopg6YjgttnI2dJjasyq3EKNmYp-IfQg9Xms4,7
33
- kscale-0.3.16.dist-info/RECORD,,
33
+ kscale/web/gen/api.py,sha256=hJ7FdrRTIwxQUZr4VKkZbAjKALYwqEDO7CxZs_dxhAY,13335
34
+ kscale-0.3.18.dist-info/licenses/LICENSE,sha256=HCN2bImAzUOXldAZZI7JZ9PYq6OwMlDAP_PpX1HnuN0,1071
35
+ kscale-0.3.18.dist-info/METADATA,sha256=yYiLryxgKKmYfMjiwpY_ke9w_x6-Uv-CPMQBXerKdEs,2350
36
+ kscale-0.3.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
37
+ kscale-0.3.18.dist-info/entry_points.txt,sha256=N_0pCpPnwGDYVzOeuaSOrbJkS5L3lS9d8CxpJF1f8UI,62
38
+ kscale-0.3.18.dist-info/top_level.txt,sha256=C2ynjYwopg6YjgttnI2dJjasyq3EKNmYp-IfQg9Xms4,7
39
+ kscale-0.3.18.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5