moru 0.1.0__py3-none-any.whl → 0.2.0__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.
- moru/__init__.py +8 -0
- moru/api/__init__.py +4 -0
- moru/api/client/__init__.py +1 -1
- moru/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py +4 -0
- moru/api/client/api/sandboxes/get_sandboxes.py +4 -0
- moru/api/client/api/sandboxes/get_sandboxes_metrics.py +5 -1
- moru/api/client/api/sandboxes/get_sandboxes_sandbox_id.py +4 -0
- moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py +67 -23
- moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_metrics.py +5 -0
- moru/api/client/api/sandboxes/get_v2_sandbox_runs.py +218 -0
- moru/api/client/api/sandboxes/get_v2_sandboxes.py +5 -2
- moru/api/client/api/sandboxes/post_sandboxes.py +4 -0
- moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_connect.py +6 -0
- moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_pause.py +5 -0
- moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_refreshes.py +3 -0
- moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_resume.py +5 -0
- moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_timeout.py +4 -0
- moru/api/client/api/templates/delete_templates_template_id.py +3 -0
- moru/api/client/api/templates/get_templates.py +3 -0
- moru/api/client/api/templates/get_templates_template_id.py +3 -0
- moru/api/client/api/templates/get_templates_template_id_builds_build_id_logs.py +276 -0
- moru/api/client/api/templates/get_templates_template_id_builds_build_id_status.py +23 -4
- moru/api/client/api/templates/get_templates_template_id_files_hash.py +5 -0
- moru/api/client/api/templates/patch_templates_template_id.py +4 -0
- moru/api/client/api/templates/post_templates.py +4 -0
- moru/api/client/api/templates/post_templates_template_id.py +3 -0
- moru/api/client/api/templates/post_templates_template_id_builds_build_id.py +3 -0
- moru/api/client/api/templates/post_v2_templates.py +4 -0
- moru/api/client/api/templates/post_v3_templates.py +4 -0
- moru/api/client/api/templates/post_v_2_templates_template_id_builds_build_id.py +3 -0
- moru/api/client/models/__init__.py +30 -0
- moru/api/client/models/admin_sandbox_kill_result.py +67 -0
- moru/api/client/models/build_log_entry.py +1 -1
- moru/api/client/models/create_volume_request.py +59 -0
- moru/api/client/models/file_info.py +105 -0
- moru/api/client/models/file_info_type.py +9 -0
- moru/api/client/models/file_list_response.py +84 -0
- moru/api/client/models/logs_direction.py +9 -0
- moru/api/client/models/logs_source.py +9 -0
- moru/api/client/models/machine_info.py +83 -0
- moru/api/client/models/new_sandbox.py +19 -0
- moru/api/client/models/node.py +10 -0
- moru/api/client/models/node_detail.py +10 -0
- moru/api/client/models/sandbox_log_entry.py +9 -9
- moru/api/client/models/sandbox_log_event_type.py +11 -0
- moru/api/client/models/sandbox_run.py +130 -0
- moru/api/client/models/sandbox_run_end_reason.py +11 -0
- moru/api/client/models/sandbox_run_status.py +10 -0
- moru/api/client/models/template_build_logs_response.py +73 -0
- moru/api/client/models/upload_response.py +67 -0
- moru/api/client/models/volume.py +105 -0
- moru/sandbox/mcp.py +835 -6
- moru/sandbox_async/commands/command.py +5 -1
- moru/sandbox_async/filesystem/filesystem.py +5 -1
- moru/sandbox_async/main.py +21 -0
- moru/sandbox_async/sandbox_api.py +17 -11
- moru/sandbox_sync/filesystem/filesystem.py +5 -1
- moru/sandbox_sync/main.py +21 -0
- moru/sandbox_sync/sandbox_api.py +17 -11
- moru/volume/__init__.py +11 -0
- moru/volume/types.py +83 -0
- moru/volume/volume_api.py +330 -0
- moru/volume_async/__init__.py +5 -0
- moru/volume_async/main.py +327 -0
- moru/volume_async/volume_api.py +290 -0
- moru/volume_sync/__init__.py +5 -0
- moru/volume_sync/main.py +325 -0
- moru-0.2.0.dist-info/METADATA +122 -0
- {moru-0.1.0.dist-info → moru-0.2.0.dist-info}/RECORD +71 -46
- {moru-0.1.0.dist-info → moru-0.2.0.dist-info}/WHEEL +1 -1
- moru-0.1.0.dist-info/METADATA +0 -63
- {moru-0.1.0.dist-info/licenses → moru-0.2.0.dist-info}/LICENSE +0 -0
moru/volume_sync/main.py
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"""Synchronous Volume class for persistent storage operations."""
|
|
2
|
+
|
|
3
|
+
from typing import BinaryIO, List, Optional, Union
|
|
4
|
+
|
|
5
|
+
from typing_extensions import Self, Unpack
|
|
6
|
+
|
|
7
|
+
from moru.connection_config import ApiParams, ConnectionConfig
|
|
8
|
+
from moru.volume.types import FileInfo, VolumeInfo
|
|
9
|
+
from moru.volume.volume_api import VolumeApi
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Volume:
|
|
13
|
+
"""
|
|
14
|
+
Moru volume is persistent storage for sandboxes.
|
|
15
|
+
|
|
16
|
+
Volumes provide crash-durable file storage that persists across sandbox
|
|
17
|
+
lifecycle. Data is accessible even when no sandbox is running.
|
|
18
|
+
|
|
19
|
+
Use `Volume.create()` to create a new volume (idempotent).
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
```python
|
|
23
|
+
from moru import Volume, Sandbox
|
|
24
|
+
|
|
25
|
+
# Create a volume (idempotent - returns existing if name matches)
|
|
26
|
+
vol = Volume.create(name="my-workspace")
|
|
27
|
+
|
|
28
|
+
# Attach to sandbox
|
|
29
|
+
sbx = Sandbox.create(
|
|
30
|
+
template="base",
|
|
31
|
+
volume_id=vol.volume_id,
|
|
32
|
+
volume_mount_path="/workspace",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
# Work with files
|
|
36
|
+
files = vol.list_files("/")
|
|
37
|
+
vol.upload("/data/input.csv", b"col1,col2\\n1,2\\n")
|
|
38
|
+
content = vol.download("/output/result.csv")
|
|
39
|
+
|
|
40
|
+
# Delete volume
|
|
41
|
+
vol.delete()
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
volume_id: str,
|
|
48
|
+
name: str,
|
|
49
|
+
total_size_bytes: int = 0,
|
|
50
|
+
total_file_count: int = 0,
|
|
51
|
+
connection_config: Optional[ConnectionConfig] = None,
|
|
52
|
+
**opts: Unpack[ApiParams],
|
|
53
|
+
):
|
|
54
|
+
"""
|
|
55
|
+
Initialize a Volume instance.
|
|
56
|
+
|
|
57
|
+
:param volume_id: Unique volume identifier
|
|
58
|
+
:param name: Volume name
|
|
59
|
+
:param total_size_bytes: Total size of files in volume
|
|
60
|
+
:param total_file_count: Total number of files in volume
|
|
61
|
+
:param connection_config: Connection configuration
|
|
62
|
+
"""
|
|
63
|
+
self._volume_id = volume_id
|
|
64
|
+
self._name = name
|
|
65
|
+
self._total_size_bytes = total_size_bytes
|
|
66
|
+
self._total_file_count = total_file_count
|
|
67
|
+
self._connection_config = connection_config or ConnectionConfig(**opts)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def volume_id(self) -> str:
|
|
71
|
+
"""Unique volume identifier."""
|
|
72
|
+
return self._volume_id
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def name(self) -> str:
|
|
76
|
+
"""Volume name."""
|
|
77
|
+
return self._name
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def total_size_bytes(self) -> int:
|
|
81
|
+
"""Total size of files in volume (bytes)."""
|
|
82
|
+
return self._total_size_bytes
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def total_file_count(self) -> int:
|
|
86
|
+
"""Total number of files in volume."""
|
|
87
|
+
return self._total_file_count
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def create(
|
|
91
|
+
cls,
|
|
92
|
+
name: str,
|
|
93
|
+
**opts: Unpack[ApiParams],
|
|
94
|
+
) -> Self:
|
|
95
|
+
"""
|
|
96
|
+
Create a new volume (idempotent).
|
|
97
|
+
|
|
98
|
+
If a volume with the same name already exists for this team,
|
|
99
|
+
the existing volume is returned.
|
|
100
|
+
|
|
101
|
+
:param name: Volume name (unique per team, slug format: lowercase, hyphens)
|
|
102
|
+
|
|
103
|
+
:return: Volume instance
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
```python
|
|
107
|
+
vol = Volume.create(name="my-workspace")
|
|
108
|
+
print(f"Volume: {vol.volume_id}")
|
|
109
|
+
```
|
|
110
|
+
"""
|
|
111
|
+
info = VolumeApi._create_volume(name=name, **opts)
|
|
112
|
+
|
|
113
|
+
return cls(
|
|
114
|
+
volume_id=info.volume_id,
|
|
115
|
+
name=info.name,
|
|
116
|
+
total_size_bytes=info.total_size_bytes,
|
|
117
|
+
total_file_count=info.total_file_count,
|
|
118
|
+
**opts,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@classmethod
|
|
122
|
+
def get(
|
|
123
|
+
cls,
|
|
124
|
+
volume_id_or_name: str,
|
|
125
|
+
**opts: Unpack[ApiParams],
|
|
126
|
+
) -> Self:
|
|
127
|
+
"""
|
|
128
|
+
Get a volume by ID or name.
|
|
129
|
+
|
|
130
|
+
:param volume_id_or_name: Volume ID (vol_xxx) or name
|
|
131
|
+
|
|
132
|
+
:return: Volume instance
|
|
133
|
+
|
|
134
|
+
Example:
|
|
135
|
+
```python
|
|
136
|
+
vol = Volume.get("vol_abc123")
|
|
137
|
+
# or
|
|
138
|
+
vol = Volume.get("my-workspace")
|
|
139
|
+
```
|
|
140
|
+
"""
|
|
141
|
+
info = VolumeApi._get_volume(volume_id_or_name=volume_id_or_name, **opts)
|
|
142
|
+
|
|
143
|
+
return cls(
|
|
144
|
+
volume_id=info.volume_id,
|
|
145
|
+
name=info.name,
|
|
146
|
+
total_size_bytes=info.total_size_bytes,
|
|
147
|
+
total_file_count=info.total_file_count,
|
|
148
|
+
**opts,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def list(**opts: Unpack[ApiParams]) -> List[VolumeInfo]:
|
|
153
|
+
"""
|
|
154
|
+
List all volumes.
|
|
155
|
+
|
|
156
|
+
:return: List of volume info objects
|
|
157
|
+
|
|
158
|
+
Example:
|
|
159
|
+
```python
|
|
160
|
+
volumes = Volume.list()
|
|
161
|
+
for vol in volumes:
|
|
162
|
+
print(f"{vol.name}: {vol.total_size_bytes} bytes")
|
|
163
|
+
```
|
|
164
|
+
"""
|
|
165
|
+
volumes, _ = VolumeApi._list_volumes(**opts)
|
|
166
|
+
return volumes
|
|
167
|
+
|
|
168
|
+
def delete(self, **opts: Unpack[ApiParams]) -> bool:
|
|
169
|
+
"""
|
|
170
|
+
Delete the volume.
|
|
171
|
+
|
|
172
|
+
:return: True if deleted, False if not found
|
|
173
|
+
|
|
174
|
+
Example:
|
|
175
|
+
```python
|
|
176
|
+
vol = Volume.create(name="temp-workspace")
|
|
177
|
+
vol.delete()
|
|
178
|
+
```
|
|
179
|
+
"""
|
|
180
|
+
return VolumeApi._delete_volume(
|
|
181
|
+
volume_id_or_name=self._volume_id,
|
|
182
|
+
**self._connection_config.get_api_params(**opts),
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
def get_info(self, **opts: Unpack[ApiParams]) -> VolumeInfo:
|
|
186
|
+
"""
|
|
187
|
+
Get updated volume information.
|
|
188
|
+
|
|
189
|
+
:return: Volume info with current size and file count
|
|
190
|
+
|
|
191
|
+
Example:
|
|
192
|
+
```python
|
|
193
|
+
vol = Volume.get("my-workspace")
|
|
194
|
+
info = vol.get_info()
|
|
195
|
+
print(f"Size: {info.total_size_bytes} bytes, Files: {info.total_file_count}")
|
|
196
|
+
```
|
|
197
|
+
"""
|
|
198
|
+
info = VolumeApi._get_volume(
|
|
199
|
+
volume_id_or_name=self._volume_id,
|
|
200
|
+
**self._connection_config.get_api_params(**opts),
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# Update cached values
|
|
204
|
+
self._total_size_bytes = info.total_size_bytes
|
|
205
|
+
self._total_file_count = info.total_file_count
|
|
206
|
+
|
|
207
|
+
return info
|
|
208
|
+
|
|
209
|
+
def list_files(
|
|
210
|
+
self,
|
|
211
|
+
path: str = "/",
|
|
212
|
+
**opts: Unpack[ApiParams],
|
|
213
|
+
) -> List[FileInfo]:
|
|
214
|
+
"""
|
|
215
|
+
List files and directories at a path.
|
|
216
|
+
|
|
217
|
+
Works even while volume is attached to a sandbox.
|
|
218
|
+
|
|
219
|
+
:param path: Directory path to list (default: "/")
|
|
220
|
+
|
|
221
|
+
:return: List of file info objects
|
|
222
|
+
|
|
223
|
+
Example:
|
|
224
|
+
```python
|
|
225
|
+
files = vol.list_files("/src")
|
|
226
|
+
for f in files:
|
|
227
|
+
print(f"{f.name} ({f.type})")
|
|
228
|
+
```
|
|
229
|
+
"""
|
|
230
|
+
files, _ = VolumeApi._list_files(
|
|
231
|
+
volume_id=self._volume_id,
|
|
232
|
+
path=path,
|
|
233
|
+
**self._connection_config.get_api_params(**opts),
|
|
234
|
+
)
|
|
235
|
+
return files
|
|
236
|
+
|
|
237
|
+
def upload(
|
|
238
|
+
self,
|
|
239
|
+
path: str,
|
|
240
|
+
content: Union[bytes, BinaryIO],
|
|
241
|
+
**opts: Unpack[ApiParams],
|
|
242
|
+
) -> None:
|
|
243
|
+
"""
|
|
244
|
+
Upload file content to the volume.
|
|
245
|
+
|
|
246
|
+
Creates parent directories as needed. Works even while volume
|
|
247
|
+
is attached to a sandbox - changes are visible immediately.
|
|
248
|
+
|
|
249
|
+
:param path: Destination path in volume
|
|
250
|
+
:param content: File content as bytes or file-like object
|
|
251
|
+
|
|
252
|
+
Example:
|
|
253
|
+
```python
|
|
254
|
+
vol.upload("/data/input.csv", b"col1,col2\\n1,2\\n")
|
|
255
|
+
|
|
256
|
+
# Or with a file
|
|
257
|
+
with open("local_file.txt", "rb") as f:
|
|
258
|
+
vol.upload("/remote/file.txt", f.read())
|
|
259
|
+
```
|
|
260
|
+
"""
|
|
261
|
+
if hasattr(content, "read"):
|
|
262
|
+
content = content.read()
|
|
263
|
+
|
|
264
|
+
VolumeApi._upload_file(
|
|
265
|
+
volume_id=self._volume_id,
|
|
266
|
+
path=path,
|
|
267
|
+
content=content,
|
|
268
|
+
**self._connection_config.get_api_params(**opts),
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
def download(
|
|
272
|
+
self,
|
|
273
|
+
path: str,
|
|
274
|
+
**opts: Unpack[ApiParams],
|
|
275
|
+
) -> bytes:
|
|
276
|
+
"""
|
|
277
|
+
Download file content from the volume.
|
|
278
|
+
|
|
279
|
+
Works even while volume is attached to a sandbox.
|
|
280
|
+
|
|
281
|
+
:param path: File path in volume
|
|
282
|
+
|
|
283
|
+
:return: File content as bytes
|
|
284
|
+
|
|
285
|
+
Example:
|
|
286
|
+
```python
|
|
287
|
+
content = vol.download("/output/result.csv")
|
|
288
|
+
print(content.decode("utf-8"))
|
|
289
|
+
```
|
|
290
|
+
"""
|
|
291
|
+
return VolumeApi._download_file(
|
|
292
|
+
volume_id=self._volume_id,
|
|
293
|
+
path=path,
|
|
294
|
+
**self._connection_config.get_api_params(**opts),
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def delete_file(
|
|
298
|
+
self,
|
|
299
|
+
path: str,
|
|
300
|
+
recursive: bool = False,
|
|
301
|
+
**opts: Unpack[ApiParams],
|
|
302
|
+
) -> bool:
|
|
303
|
+
"""
|
|
304
|
+
Delete file or directory from the volume.
|
|
305
|
+
|
|
306
|
+
:param path: Path to delete
|
|
307
|
+
:param recursive: Delete directory recursively
|
|
308
|
+
|
|
309
|
+
:return: True if deleted
|
|
310
|
+
|
|
311
|
+
Example:
|
|
312
|
+
```python
|
|
313
|
+
vol.delete_file("/temp/cache.txt")
|
|
314
|
+
vol.delete_file("/temp/", recursive=True)
|
|
315
|
+
```
|
|
316
|
+
"""
|
|
317
|
+
return VolumeApi._delete_file(
|
|
318
|
+
volume_id=self._volume_id,
|
|
319
|
+
path=path,
|
|
320
|
+
recursive=recursive,
|
|
321
|
+
**self._connection_config.get_api_params(**opts),
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
def __repr__(self) -> str:
|
|
325
|
+
return f"Volume(volume_id={self._volume_id!r}, name={self._name!r})"
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: moru
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Moru SDK that gives agents cloud environments
|
|
5
|
+
License: MIT
|
|
6
|
+
Author: Moru AI
|
|
7
|
+
Author-email: hello@moru.ai
|
|
8
|
+
Requires-Python: >=3.9,<4.0
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Dist: attrs (>=23.2.0)
|
|
17
|
+
Requires-Dist: dockerfile-parse (>=2.0.1,<3.0.0)
|
|
18
|
+
Requires-Dist: httpcore (>=1.0.5,<2.0.0)
|
|
19
|
+
Requires-Dist: httpx (>=0.27.0,<1.0.0)
|
|
20
|
+
Requires-Dist: packaging (>=24.1)
|
|
21
|
+
Requires-Dist: protobuf (>=4.21.0)
|
|
22
|
+
Requires-Dist: python-dateutil (>=2.8.2)
|
|
23
|
+
Requires-Dist: rich (>=14.0.0)
|
|
24
|
+
Requires-Dist: typing-extensions (>=4.1.0)
|
|
25
|
+
Requires-Dist: wcmatch (>=10.1,<11.0)
|
|
26
|
+
Project-URL: Bug Tracker, https://github.com/moru-ai/moru/issues
|
|
27
|
+
Project-URL: Homepage, https://github.com/moru-ai/moru
|
|
28
|
+
Project-URL: Repository, https://github.com/moru-ai/moru/tree/main/packages/python-sdk
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
# Moru Python SDK
|
|
32
|
+
|
|
33
|
+
Moru SDK for Python provides cloud sandbox environments for AI agents.
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
### 1. Create an Account
|
|
38
|
+
|
|
39
|
+
Sign up for a free account at [moru.io/dashboard](https://moru.io/dashboard).
|
|
40
|
+
|
|
41
|
+
### 2. Get Your API Key
|
|
42
|
+
|
|
43
|
+
1. Go to the [API Keys tab](https://moru.io/dashboard?tab=keys) in your dashboard
|
|
44
|
+
2. Click **Create API Key**
|
|
45
|
+
3. Copy your new API key
|
|
46
|
+
|
|
47
|
+
### 3. Install the SDK
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pip install moru
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 4. Set Your API Key
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
export MORU_API_KEY=your_api_key
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 5. Create a Sandbox and Run Commands
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from moru import Sandbox
|
|
63
|
+
|
|
64
|
+
# Create a sandbox using the 'base' template (default)
|
|
65
|
+
sandbox = Sandbox.create()
|
|
66
|
+
print(f"Sandbox created: {sandbox.sandbox_id}")
|
|
67
|
+
|
|
68
|
+
# Run a command
|
|
69
|
+
result = sandbox.commands.run("echo 'Hello from Moru!'")
|
|
70
|
+
print(f"Output: {result.stdout}")
|
|
71
|
+
print(f"Exit code: {result.exit_code}")
|
|
72
|
+
|
|
73
|
+
# Write and read files
|
|
74
|
+
sandbox.files.write("/tmp/hello.txt", "Hello from Moru!")
|
|
75
|
+
content = sandbox.files.read("/tmp/hello.txt")
|
|
76
|
+
print(f"File content: {content}")
|
|
77
|
+
|
|
78
|
+
# Clean up
|
|
79
|
+
sandbox.kill()
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Using Async
|
|
83
|
+
|
|
84
|
+
For async applications, use `AsyncSandbox`:
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
import asyncio
|
|
88
|
+
from moru import AsyncSandbox
|
|
89
|
+
|
|
90
|
+
async def main():
|
|
91
|
+
sandbox = await AsyncSandbox.create()
|
|
92
|
+
|
|
93
|
+
result = await sandbox.commands.run("python3 --version")
|
|
94
|
+
print(result.stdout)
|
|
95
|
+
|
|
96
|
+
await sandbox.kill()
|
|
97
|
+
|
|
98
|
+
asyncio.run(main())
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Using a Custom Template
|
|
102
|
+
|
|
103
|
+
Create templates via the [dashboard](https://moru.io/dashboard) or CLI.
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
# Use a custom template
|
|
107
|
+
sandbox = Sandbox.create("my-template")
|
|
108
|
+
|
|
109
|
+
result = sandbox.commands.run("echo 'Running in custom template'")
|
|
110
|
+
print(result.stdout)
|
|
111
|
+
|
|
112
|
+
sandbox.kill()
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Documentation
|
|
116
|
+
|
|
117
|
+
For full documentation, visit [docs.moru.io](https://docs.moru.io).
|
|
118
|
+
|
|
119
|
+
## Acknowledgement
|
|
120
|
+
|
|
121
|
+
This project is a fork of [E2B](https://github.com/e2b-dev/E2B).
|
|
122
|
+
|
|
@@ -1,46 +1,53 @@
|
|
|
1
|
-
moru/__init__.py,sha256=
|
|
2
|
-
moru/api/__init__.py,sha256=
|
|
3
|
-
moru/api/client/__init__.py,sha256=
|
|
1
|
+
moru/__init__.py,sha256=M04RpUahWlL92pX9kRthQxINs28T3pBiCMf57cfBlRE,4276
|
|
2
|
+
moru/api/__init__.py,sha256=iR0xKRJoBWZQkoHCbD-h44yicfHBTyiyJK8ke5BJrj0,5393
|
|
3
|
+
moru/api/client/__init__.py,sha256=Ou1lhGx3SMUxhJ0Ali14DnZfO3YvBOAVdzEYPl2ua2w,159
|
|
4
4
|
moru/api/client/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
|
|
5
5
|
moru/api/client/api/sandboxes/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
6
|
-
moru/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py,sha256=
|
|
7
|
-
moru/api/client/api/sandboxes/get_sandboxes.py,sha256=
|
|
8
|
-
moru/api/client/api/sandboxes/get_sandboxes_metrics.py,sha256
|
|
9
|
-
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id.py,sha256=
|
|
10
|
-
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py,sha256=
|
|
11
|
-
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_metrics.py,sha256=
|
|
12
|
-
moru/api/client/api/sandboxes/
|
|
13
|
-
moru/api/client/api/sandboxes/
|
|
14
|
-
moru/api/client/api/sandboxes/
|
|
15
|
-
moru/api/client/api/sandboxes/
|
|
16
|
-
moru/api/client/api/sandboxes/
|
|
17
|
-
moru/api/client/api/sandboxes/
|
|
18
|
-
moru/api/client/api/sandboxes/
|
|
6
|
+
moru/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py,sha256=Vpdw4cPW0UluR5rbScPe_K-Hcfn0ebtNJLk860u5xJA,3949
|
|
7
|
+
moru/api/client/api/sandboxes/get_sandboxes.py,sha256=r1zAM3amxOKCd9f20MhMS_9L_IyZMoQsobx7KOzBr5o,4749
|
|
8
|
+
moru/api/client/api/sandboxes/get_sandboxes_metrics.py,sha256=-weJP1ADfnTIvQmznlJKc2ssnmDZfw2gfWthTNklt_M,4585
|
|
9
|
+
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id.py,sha256=pnZD5pmppTbOhEWsUCdveDFXRahfoOFufqoW9d8NJi0,4137
|
|
10
|
+
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py,sha256=XhDS-0nTJms_9WqyXgZQ-rikbMmkO-LCcXxtmtpsqzw,7205
|
|
11
|
+
moru/api/client/api/sandboxes/get_sandboxes_sandbox_id_metrics.py,sha256=OK5r22LZN2LO-m84l7FU1uXpJKEaUUnCcb7hiHUEgG4,5914
|
|
12
|
+
moru/api/client/api/sandboxes/get_v2_sandbox_runs.py,sha256=Lrfr-E_wZsNzdxR89kVOyjLlyzvWDTHm6DxyZ9O0g1s,6284
|
|
13
|
+
moru/api/client/api/sandboxes/get_v2_sandboxes.py,sha256=P8ypKNwB_vrgspDWbeYsU3YVoNYqCjsh8c2knA-UE0k,6631
|
|
14
|
+
moru/api/client/api/sandboxes/post_sandboxes.py,sha256=QZoB1SxDnY1Kwdn2pXfSrcfM3cbk6xpAbIDqRiAsGGI,4273
|
|
15
|
+
moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_connect.py,sha256=8av-s-HcHmEgUN4z7JefvWxDjaqTXdOQLhMrgmEjFlI,5154
|
|
16
|
+
moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_pause.py,sha256=VIX4RxcTX-VaUiB_rxY3a2JbkAD14gcruSnGhzNmfH0,4087
|
|
17
|
+
moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_refreshes.py,sha256=B2CmkM6POWmxV7rI8T6gMLUDVdhtbGdDv6XykPBelk0,4756
|
|
18
|
+
moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_resume.py,sha256=LayX3Tx-Z54mbVmTQdIZXqgizADR1_-Carc4kqx3vYw,4733
|
|
19
|
+
moru/api/client/api/sandboxes/post_sandboxes_sandbox_id_timeout.py,sha256=2U1My_vsoGneGty5kHqSCaM1sFbU3gZ-S7-tGKkxAik,5678
|
|
19
20
|
moru/api/client/api/templates/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
20
|
-
moru/api/client/api/templates/delete_templates_template_id.py,sha256=
|
|
21
|
-
moru/api/client/api/templates/get_templates.py,sha256=
|
|
22
|
-
moru/api/client/api/templates/get_templates_template_id.py,sha256=
|
|
23
|
-
moru/api/client/api/templates/
|
|
24
|
-
moru/api/client/api/templates/
|
|
25
|
-
moru/api/client/api/templates/
|
|
26
|
-
moru/api/client/api/templates/
|
|
27
|
-
moru/api/client/api/templates/
|
|
28
|
-
moru/api/client/api/templates/
|
|
29
|
-
moru/api/client/api/templates/
|
|
30
|
-
moru/api/client/api/templates/
|
|
31
|
-
moru/api/client/api/templates/
|
|
21
|
+
moru/api/client/api/templates/delete_templates_template_id.py,sha256=Ljejd58GzX8fvveR-MlZjM8njqzCMCdFGMK9FYXZDqM,3857
|
|
22
|
+
moru/api/client/api/templates/get_templates.py,sha256=qGLya9pXJg6XDQaqyOou0hh8njpql8tK6v0Kqg9UjcM,4601
|
|
23
|
+
moru/api/client/api/templates/get_templates_template_id.py,sha256=RZsJRmOH7p2Yj5QUSpy9Ps4s4egSDcWTKsg3Qmj2gss,5345
|
|
24
|
+
moru/api/client/api/templates/get_templates_template_id_builds_build_id_logs.py,sha256=IWBU26Wy7CC27IiJKtGyAdMjM1Zif6xV3nstyfVJeXA,8383
|
|
25
|
+
moru/api/client/api/templates/get_templates_template_id_builds_build_id_status.py,sha256=hCDyW8Gu4HcABaOwvMiADlwvRr7PNlI5vxwxBdJWioc,6556
|
|
26
|
+
moru/api/client/api/templates/get_templates_template_id_files_hash.py,sha256=YlLcOlJoQq2ftKl1GlAsUDUFSKSWGI9fgzCn5zpErI8,4919
|
|
27
|
+
moru/api/client/api/templates/patch_templates_template_id.py,sha256=H3xFgjUsPz40uNnWMkdOxWJG8FF5_bKmT6Mr-VwaKms,4597
|
|
28
|
+
moru/api/client/api/templates/post_templates.py,sha256=4lpMFU8BurPiZ6SbafHFLUnm7iTv4VfSWT3MjYFVfWM,4424
|
|
29
|
+
moru/api/client/api/templates/post_templates_template_id.py,sha256=kzt8gTZ-8VN7_pOjdHMSImbT1cdNigaT1JXxKw8ZhD0,4663
|
|
30
|
+
moru/api/client/api/templates/post_templates_template_id_builds_build_id.py,sha256=rVAzFd6hUONuY4H9J1Hp0Sm56toju2a8Gm4pEkCiayI,4168
|
|
31
|
+
moru/api/client/api/templates/post_v2_templates.py,sha256=0qi4O5FdA074jDi9G8SR0JMNmkaiu7nMp_5qy105Mq0,4450
|
|
32
|
+
moru/api/client/api/templates/post_v3_templates.py,sha256=KWqhEWn3HtM2fmebVdK3H2Rl1KoILkzzoo0nhZMWC5A,4595
|
|
33
|
+
moru/api/client/api/templates/post_v_2_templates_template_id_builds_build_id.py,sha256=0oh2IbFnwjWvN6_rWaufvIEin4J3dIqOGl3fL376SO4,4788
|
|
32
34
|
moru/api/client/client.py,sha256=O6MiIbTg_Z-szhiNi8RhaBwI7chi3y9xvPfnYiGXMb4,12581
|
|
33
35
|
moru/api/client/errors.py,sha256=gO8GBmKqmSNgAg-E5oT-oOyxztvp7V_6XG7OUTT15q0,546
|
|
34
|
-
moru/api/client/models/__init__.py,sha256
|
|
36
|
+
moru/api/client/models/__init__.py,sha256=-z52LAHDkQpgIgSXd-ULiUB4VjT-zlmPM1KSVUvU1BE,5130
|
|
37
|
+
moru/api/client/models/admin_sandbox_kill_result.py,sha256=VJ09DaP9OHATS3cvUvTTVHCdIBRM2IgyiWUSfTTA2hg,1877
|
|
35
38
|
moru/api/client/models/aws_registry.py,sha256=YKwQXCuutv3XwgEJWbBTyX6KmLi866-ASsHpu-n0H2w,2486
|
|
36
39
|
moru/api/client/models/aws_registry_type.py,sha256=8gBrOkfd2OaBDPRRJDmF6t2luvz01A0QExzfHRsgUg8,136
|
|
37
|
-
moru/api/client/models/build_log_entry.py,sha256=
|
|
40
|
+
moru/api/client/models/build_log_entry.py,sha256=0h-bSi3bT5PTtm-BIiOW85bpg7qwP4UBLVldMpZzFS0,2383
|
|
38
41
|
moru/api/client/models/build_status_reason.py,sha256=rGwEYbmIFjSG3QPpPm-iX1rDVDPC3Jkn33dDljbLyWM,2878
|
|
39
42
|
moru/api/client/models/connect_sandbox.py,sha256=095nNrudNKwrD1fjsTTNeaf-4D_jJ2NsvIEQhYAVBHY,1561
|
|
43
|
+
moru/api/client/models/create_volume_request.py,sha256=MM0sU8kmNXkaYCAZqTKbeccV_PmzVaXFhaEYCG3lFIw,1523
|
|
40
44
|
moru/api/client/models/created_access_token.py,sha256=VjU_tuW67zrtc3V1po-MVtPo8J1dtRkwy-6uTe2AEf0,2639
|
|
41
45
|
moru/api/client/models/created_team_api_key.py,sha256=QO2jAIR8u1Xxn26jnftkDNYCI1mEqDMt-ZUIQS1y1NU,5040
|
|
42
46
|
moru/api/client/models/disk_metrics.py,sha256=2bZEe84P2wBqQb9_RR-xR743ZDKCzjbzXmjmTDsXwI8,2442
|
|
43
47
|
moru/api/client/models/error.py,sha256=xGvyYQQHv0ZrxvhrVvFlXPaosmt24ivIh3U4gItpBKY,1594
|
|
48
|
+
moru/api/client/models/file_info.py,sha256=uHTJLNci1HfIKOEBb5zPytbd1hoeVbrpVurQaP441uo,2873
|
|
49
|
+
moru/api/client/models/file_info_type.py,sha256=2Y86g5qVD723iLNHylvmXssE9lKj78plRqrnmXXTFmY,163
|
|
50
|
+
moru/api/client/models/file_list_response.py,sha256=patbBYSOlc2Zs80Dzqc3Egfa3maDq9UhU9UYOgnbOMw,2270
|
|
44
51
|
moru/api/client/models/gcp_registry.py,sha256=jU0_iH1H0JBGHyl0IVuQl44yQ18qyTqYaPNd8S_yZyg,1923
|
|
45
52
|
moru/api/client/models/gcp_registry_type.py,sha256=QcMwg9qUyr6e7VRinI0iRa9lhYvryj7vZEeTK0yEZVM,136
|
|
46
53
|
moru/api/client/models/general_registry.py,sha256=J_-i7kLmsPy018YFhBKDH5YAToey4MnCIivPUKSpTc8,2052
|
|
@@ -48,13 +55,16 @@ moru/api/client/models/general_registry_type.py,sha256=VwyEKt25wUh0y8Qj4Wpeolus-
|
|
|
48
55
|
moru/api/client/models/identifier_masking_details.py,sha256=97xSg4Nr3D5xbjGDuZ16doEMOlck0EtyjMxtHQR9TKk,2496
|
|
49
56
|
moru/api/client/models/listed_sandbox.py,sha256=zyuxeHjkrar1GTnKVCvgRXV4Zvdfq8FcZGOXnxHQ5a8,4382
|
|
50
57
|
moru/api/client/models/log_level.py,sha256=uv6u1nkqfzdxTjJAxLZdWuH5goVI_g-ULLhh6TU5dw8,189
|
|
58
|
+
moru/api/client/models/logs_direction.py,sha256=c2QsexQz8bqzMvQ01vmseed-mcnzjQ4C0Y8QTrFuCmE,168
|
|
59
|
+
moru/api/client/models/logs_source.py,sha256=OJ_SgUZo3YIXn_KIET0vzcTdtmb5eiHdtMn1YdetFNk,173
|
|
60
|
+
moru/api/client/models/machine_info.py,sha256=_qukINhbGU-TBwUDq5aC5OTZXCatgq2aNlheJjEEj6g,2287
|
|
51
61
|
moru/api/client/models/max_team_metric.py,sha256=HQuDBFHMIsTJbWTl0kOX4ADIfWb1E97J-PB0NNoRJCw,2187
|
|
52
62
|
moru/api/client/models/mcp_type_0.py,sha256=U_8DsmxiUkD4s4_ODbE6sAlURThIqS6v1rUpt3CE1FE,1220
|
|
53
63
|
moru/api/client/models/new_access_token.py,sha256=sjlQ7dEj4ByCgwud750SbxwyjggAKB1s-o_N7dRCo7s,1480
|
|
54
|
-
moru/api/client/models/new_sandbox.py,sha256=
|
|
64
|
+
moru/api/client/models/new_sandbox.py,sha256=ITrj86gFfGVL3l-1jUnHdfdOx7brOFUsDEZlI1sO_HE,6464
|
|
55
65
|
moru/api/client/models/new_team_api_key.py,sha256=neYLvvvzyPcpXYV5gDHVkv_ovjKdIBKUTX04cD5QKGA,1473
|
|
56
|
-
moru/api/client/models/node.py,sha256=
|
|
57
|
-
moru/api/client/models/node_detail.py,sha256=
|
|
66
|
+
moru/api/client/models/node.py,sha256=hEbN097bx1LIIwyr0KDS7lELhgpttetVjD9KiysrpzQ,4728
|
|
67
|
+
moru/api/client/models/node_detail.py,sha256=RzhmTIQnrrNsi-OILEIVMVmrs4giEXALMcsRZl1Cnek,5158
|
|
58
68
|
moru/api/client/models/node_metrics.py,sha256=EveG1M2dLWteatFWvFQMa9aKzz8urRlOOZ7QD_8Xd0o,3642
|
|
59
69
|
moru/api/client/models/node_status.py,sha256=bZkWsNgKncRmFxatPdKlJTu9H4GTBbgQ2XF9JNvW16I,219
|
|
60
70
|
moru/api/client/models/node_status_change.py,sha256=g59HSBpip8R7egNghe7QxYZ_MH-bgijGac36S5-WdYg,2236
|
|
@@ -64,11 +74,15 @@ moru/api/client/models/resumed_sandbox.py,sha256=spSSP0TXWz8QmDoJprqIRToktgd8pvm
|
|
|
64
74
|
moru/api/client/models/sandbox.py,sha256=z5OUJActzzFq2us2ttM-BQU-pJ9esi0qBjKtrqNhjE0,4600
|
|
65
75
|
moru/api/client/models/sandbox_detail.py,sha256=L3QNx7SlJyrqpWtchieKmXRh5MrOJfP2CF2CCibJpiI,5494
|
|
66
76
|
moru/api/client/models/sandbox_log.py,sha256=tXw35j3poz7DMJrLeoxr4oYdbcYJV5ep3E0bVdQsS2o,1806
|
|
67
|
-
moru/api/client/models/sandbox_log_entry.py,sha256=
|
|
77
|
+
moru/api/client/models/sandbox_log_entry.py,sha256=hNSx9__xDPw2v50s1XJzOlw6PPiTYC32H4_Qwk8XBfg,2612
|
|
68
78
|
moru/api/client/models/sandbox_log_entry_fields.py,sha256=SYwtEgNOKPtmf9BqIiRS44bEgcbbbHMq2qdCShpj8QI,1256
|
|
79
|
+
moru/api/client/models/sandbox_log_event_type.py,sha256=bBq8rv0PSk6g7O1XUk-4qsj8qQ2FenEXRizzTo66ct0,236
|
|
69
80
|
moru/api/client/models/sandbox_logs.py,sha256=3UC3ngilUpl7Wye7rl5Md9DR1loa_7chGTBx9tRb6LY,2658
|
|
70
81
|
moru/api/client/models/sandbox_metric.py,sha256=j90tDplFtQwdzHKpBVk5044T4uVrLwVTGBvAAkVaGdI,3280
|
|
71
82
|
moru/api/client/models/sandbox_network_config.py,sha256=iBSiOsOpPBkdHvIfwlVSxRRjgdffkMP_p7hDNFEhKco,3290
|
|
83
|
+
moru/api/client/models/sandbox_run.py,sha256=prItgPUZb7bTWcerGmfsqxoILe4SFB7tx1pWVbObTN4,4006
|
|
84
|
+
moru/api/client/models/sandbox_run_end_reason.py,sha256=LHsNhojfDuVlCkecJY8AhwiXAzOeJfNksBYj7nR23Xs,216
|
|
85
|
+
moru/api/client/models/sandbox_run_status.py,sha256=IIjsCRnBPuJvvUGYVrrx7gL6T9NHGAxZ7XR1eachMbE,191
|
|
72
86
|
moru/api/client/models/sandbox_state.py,sha256=iztDupSF2SrYQGV2UTcnZRH_U3GxSmHYKHMMUksO_7M,163
|
|
73
87
|
moru/api/client/models/sandboxes_with_metrics.py,sha256=CuOZ1ismyjPLrxPcKaDqLKZL5Iun0njN70Qqhubc1Ps,1535
|
|
74
88
|
moru/api/client/models/team.py,sha256=rGLOfphzsP7VA9SLmQn8vnUfxB9KILfMwNfh4hVy3IE,2042
|
|
@@ -79,6 +93,7 @@ moru/api/client/models/template.py,sha256=HcA4xZqCf-YyNhALo3ysvM9_V0dRc8fXsBjo2D
|
|
|
79
93
|
moru/api/client/models/template_build.py,sha256=5GpCKpvI6vi86r7wV2Ylv3qQxJEL3wBbrXCRx7lTFQo,4323
|
|
80
94
|
moru/api/client/models/template_build_file_upload.py,sha256=iqgQEKVJxWD8ezd_w44NoYmFCVDyTSUcH474KRCaXDY,1879
|
|
81
95
|
moru/api/client/models/template_build_info.py,sha256=IXZM16g5tWbwqtGMnzUj3IRkd3H9HmsYwpNCEEp_AkQ,3798
|
|
96
|
+
moru/api/client/models/template_build_logs_response.py,sha256=beU1eM2sOXO6SgHC8AnTY7LzsBQxi2MXYBAt6QUjyr4,1995
|
|
82
97
|
moru/api/client/models/template_build_request.py,sha256=iMy655tp09fTr8gNgu8uHwQm4IA_8IUx4xWQxZQnzjI,3433
|
|
83
98
|
moru/api/client/models/template_build_request_v2.py,sha256=KoETYShWCXHBo6Mt4WF_WHHJnHxd66cbAQ0JMum8Ino,2459
|
|
84
99
|
moru/api/client/models/template_build_request_v3.py,sha256=jfEfMfOtUyGRPOId16RJgocDd1uBcb32-mtCBHUF7mE,2459
|
|
@@ -90,6 +105,8 @@ moru/api/client/models/template_step.py,sha256=qmCseK5OJXN2Ffirl0A0J4neqyfDqA-a-
|
|
|
90
105
|
moru/api/client/models/template_update_request.py,sha256=KMlSyGf7hX75GqXxEP-OiExnABql4MKdLBfHPd02gFo,1663
|
|
91
106
|
moru/api/client/models/template_with_builds.py,sha256=D_euGW7ByyN8BKHUNN_SEgF6YbZl5ZsCbWDRhwz3J_0,4606
|
|
92
107
|
moru/api/client/models/update_team_api_key.py,sha256=UEHHUJxwHWTOd-AuDE-Z26E4lX2Ck9SPq8MO-Trc9Uc,1493
|
|
108
|
+
moru/api/client/models/upload_response.py,sha256=3t1cG1N5PzcHjelSK8L5MnUoE8Wy9M4KUi75dx3qr-Q,1648
|
|
109
|
+
moru/api/client/models/volume.py,sha256=-mIL3CZsusR-poUyzGqp4fk0tPBLYYUkGa0qUPoyHe8,3068
|
|
93
110
|
moru/api/client/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
|
|
94
111
|
moru/api/client/types.py,sha256=AX4orxQZQJat3vZrgjJ-TYb2sNBL8kNo9yqYDT-n8y8,1391
|
|
95
112
|
moru/api/client_async/__init__.py,sha256=AZ3Ju_yzZLdWwZ98AR2__PGr5t-uClxOJ4Y22HII7Sk,1337
|
|
@@ -111,28 +128,28 @@ moru/sandbox/commands/main.py,sha256=t8hk44wZX27OqRrYHo_FhvhzfOvIVK-6NO4HpfiOhpo
|
|
|
111
128
|
moru/sandbox/filesystem/filesystem.py,sha256=Yk2DBMkTDkVz_c6XVwHNLhTRPVECo2tHeDl6cTtNOJE,1880
|
|
112
129
|
moru/sandbox/filesystem/watch_handle.py,sha256=8oUe5mx0xIvv40LzBDYCYeDOirya-2pbut7FDaM86aQ,1387
|
|
113
130
|
moru/sandbox/main.py,sha256=6t_MR9IIO6XTmk38vu3vqwmSz5DmfM0MjDklDAl3w4o,6267
|
|
114
|
-
moru/sandbox/mcp.py,sha256=
|
|
131
|
+
moru/sandbox/mcp.py,sha256=z_nZuDtYOkvPtFrNSrBVC3sUHNcsRhbOTQoeF819itQ,59982
|
|
115
132
|
moru/sandbox/network.py,sha256=tmOG2Ya1MyYk58_BnV546xsQVQHfqnHgsa-H5HB6XZE,133
|
|
116
133
|
moru/sandbox/sandbox_api.py,sha256=vfqzl-rCF51YQFTtHUioOwiI05bEC4LUq7Wrffeipgg,5923
|
|
117
134
|
moru/sandbox/signature.py,sha256=QIMpJHE_UD00iQiwsGAdO8gJpqoP2MP1zHV8bbGWKDc,1203
|
|
118
135
|
moru/sandbox/utils.py,sha256=grMOJpeyk9YeS6dE7qCwBaJUaqgvrE4aKkGc9nVVfhI,1300
|
|
119
|
-
moru/sandbox_async/commands/command.py,sha256=
|
|
136
|
+
moru/sandbox_async/commands/command.py,sha256=bQm5qJeGeNzI78Gr45pwSd00BTm2176nq2ILjOr4AMM,12502
|
|
120
137
|
moru/sandbox_async/commands/command_handle.py,sha256=5M05YMdMrNxboOpOSqy9htlGQOq9jCNkU78zBWzg5t4,5771
|
|
121
138
|
moru/sandbox_async/commands/pty.py,sha256=yIi-e_iWg0XWBXnze9UXyZTtQ8PNNEuV8cbXSopDKwA,7982
|
|
122
|
-
moru/sandbox_async/filesystem/filesystem.py,sha256=
|
|
139
|
+
moru/sandbox_async/filesystem/filesystem.py,sha256=6rMACkZCcb1Gp3jju2QYWVaOFvlQlirQ_JdTWiUCR9A,18724
|
|
123
140
|
moru/sandbox_async/filesystem/watch_handle.py,sha256=EWe7Rd5r3LkCtF8jAKSNO400FxBnGqiXfVMYWEyXlgc,1969
|
|
124
|
-
moru/sandbox_async/main.py,sha256=
|
|
141
|
+
moru/sandbox_async/main.py,sha256=gpvtsMWJSkExC6rI2X_gCQJyZD89TL8WzCEBGG9wiqw,24729
|
|
125
142
|
moru/sandbox_async/paginator.py,sha256=eW5hKXItevPPEuuAuItSao2zvLBOOQjeMaoJ3NlnbUI,2296
|
|
126
|
-
moru/sandbox_async/sandbox_api.py,sha256=
|
|
143
|
+
moru/sandbox_async/sandbox_api.py,sha256=lMFocI9rzqRLYpwUMI8TQeXYVYqi1wsTMJxTp7MIGQA,10180
|
|
127
144
|
moru/sandbox_async/utils.py,sha256=mplhnoDat1PswDksAlnz2Zp4zzUGSIdr_76kiFYZQK8,159
|
|
128
145
|
moru/sandbox_sync/commands/command.py,sha256=dI1GrzzdUBB4wnzFegPh3oWfzVSRltNRtzcld_M1f4g,11626
|
|
129
146
|
moru/sandbox_sync/commands/command_handle.py,sha256=d1HDROr_hw3I9JW2yaCJcKOyDnSI2V1JHvTKHWwgG3k,4633
|
|
130
147
|
moru/sandbox_sync/commands/pty.py,sha256=IZUpyR0-XaEDcEn2MLxb-WtF9DFa3eK0bzdLKkeqLac,7590
|
|
131
|
-
moru/sandbox_sync/filesystem/filesystem.py,sha256=
|
|
148
|
+
moru/sandbox_sync/filesystem/filesystem.py,sha256=b-GqJRAYDYt9XMR0nFvEvfJ4GiO_f0Lr0vovr2YM9ts,17869
|
|
132
149
|
moru/sandbox_sync/filesystem/watch_handle.py,sha256=R5KnqUFQjb_nfQ29B0jfG4Imm-YjK09tYrRUU36n5hM,2059
|
|
133
|
-
moru/sandbox_sync/main.py,sha256=
|
|
150
|
+
moru/sandbox_sync/main.py,sha256=cWwehBoaaj4p0u46LX-nYnQm7lTURpIolY5SVV9Wgnk,24094
|
|
134
151
|
moru/sandbox_sync/paginator.py,sha256=FqWhMm7ykqmDYITc8cz7muUH-AUsi3cydBiJYWqsaZo,2264
|
|
135
|
-
moru/sandbox_sync/sandbox_api.py,sha256=
|
|
152
|
+
moru/sandbox_sync/sandbox_api.py,sha256=5qWqtMlkKkRs0gb-Mp9Y252FvPhKWabPrW3nUD5vLwY,9356
|
|
136
153
|
moru/template/consts.py,sha256=opZ2iHQxt1gpR67PlbJvpxYfHlzsAB8q7XD0a98cu5o,756
|
|
137
154
|
moru/template/dockerfile_parser.py,sha256=SzOeZdyk5bI0f9PDTP4ST4ZTBUOoBwsC0vUvY2PoilM,8996
|
|
138
155
|
moru/template/logger.py,sha256=_L8HSaoAcWaBHcqbJ-7gUkAf_ccqSi2ZtQfGGL6rwQg,6088
|
|
@@ -144,9 +161,17 @@ moru/template_async/build_api.py,sha256=98OrYIGcuDroT5bihx8RejAm0ge0ADg_YX1ms6ax
|
|
|
144
161
|
moru/template_async/main.py,sha256=T9AKqw7ekdagDj8WKBAmAEvkqpj8kOMwdVENagyoLZE,11943
|
|
145
162
|
moru/template_sync/build_api.py,sha256=4SM9WDlX5HyVlA2NdJAquM1c8ax_9cc_wKr1MGwu9p4,5951
|
|
146
163
|
moru/template_sync/main.py,sha256=NSFhKjhv_n5vV4Ra2bc1zBDxcBFRumBlUnV_lPfBZCI,11901
|
|
164
|
+
moru/volume/__init__.py,sha256=3U6dN2gUwQq5OftGWfAwitj4gh-g8mITGuBfretLPM4,211
|
|
165
|
+
moru/volume/types.py,sha256=IUhNHXLCQXlcFX868VyxY6QQUTQXTr_3CsQMUZI6l-8,2135
|
|
166
|
+
moru/volume/volume_api.py,sha256=7uAVZYrx4xwsAd3kjXJqpwxysydfCTUI-h3h_0norgE,9604
|
|
167
|
+
moru/volume_async/__init__.py,sha256=BoA5sMz6Oq1ShuDvkGBaJcP5chJqL1B8O8qv3arFk7g,92
|
|
168
|
+
moru/volume_async/main.py,sha256=y6J6mfFrR-kyqvmphssl_5qKu9YBSpp97cbQ3BtaDlo,9118
|
|
169
|
+
moru/volume_async/volume_api.py,sha256=inI-TTB9LVz3ZQQNTehFAyu8wUAdpKTv7PadOVAMDJw,8459
|
|
170
|
+
moru/volume_sync/__init__.py,sha256=9hQQZhkWrGpsQ6pjzS7-nt2T-cnSwZGvPyX2zLb3jvI,81
|
|
171
|
+
moru/volume_sync/main.py,sha256=zHwG5PdXuygcsisxhDoyelq5sBpH1uJSpViomM2AxKQ,8718
|
|
147
172
|
moru_connect/__init__.py,sha256=ToGN4_2p-tV3QVUKcfHNg6U1qbbERaUjym8SJN3VCls,81
|
|
148
173
|
moru_connect/client.py,sha256=u1kYyb1wuE0-rdGw-ymCftxGH_o-8mb1w3Q8NFVSJ8E,13030
|
|
149
|
-
moru-0.
|
|
150
|
-
moru-0.
|
|
151
|
-
moru-0.
|
|
152
|
-
moru-0.
|
|
174
|
+
moru-0.2.0.dist-info/LICENSE,sha256=ONtx_RW5j6C0mPjF7nBaSVcOMREIXCd_uJteoQfsTcs,1074
|
|
175
|
+
moru-0.2.0.dist-info/METADATA,sha256=PEwwsIgp2uX-Jzn2LNDoebnbG7j72h8gfGC4OWIfAwQ,2997
|
|
176
|
+
moru-0.2.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
|
177
|
+
moru-0.2.0.dist-info/RECORD,,
|