meshagent-cli 0.5.7__py3-none-any.whl → 0.5.8b2__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 meshagent-cli might be problematic. Click here for more details.
- meshagent/cli/agent.py +2 -1
- meshagent/cli/call.py +2 -0
- meshagent/cli/developer.py +7 -1
- meshagent/cli/exec.py +161 -55
- meshagent/cli/helper.py +3 -1
- meshagent/cli/participant_token.py +3 -2
- meshagent/cli/queue.py +4 -2
- meshagent/cli/services.py +27 -5
- meshagent/cli/version.py +1 -1
- {meshagent_cli-0.5.7.dist-info → meshagent_cli-0.5.8b2.dist-info}/METADATA +13 -9
- {meshagent_cli-0.5.7.dist-info → meshagent_cli-0.5.8b2.dist-info}/RECORD +14 -14
- {meshagent_cli-0.5.7.dist-info → meshagent_cli-0.5.8b2.dist-info}/WHEEL +0 -0
- {meshagent_cli-0.5.7.dist-info → meshagent_cli-0.5.8b2.dist-info}/entry_points.txt +0 -0
- {meshagent_cli-0.5.7.dist-info → meshagent_cli-0.5.8b2.dist-info}/top_level.txt +0 -0
meshagent/cli/agent.py
CHANGED
|
@@ -11,6 +11,7 @@ from meshagent.api import (
|
|
|
11
11
|
ParticipantToken,
|
|
12
12
|
WebSocketClientProtocol,
|
|
13
13
|
RoomException,
|
|
14
|
+
ApiScope,
|
|
14
15
|
)
|
|
15
16
|
from meshagent.cli.helper import resolve_project_id, resolve_api_key
|
|
16
17
|
from meshagent.cli import async_typer
|
|
@@ -51,7 +52,7 @@ async def ask(
|
|
|
51
52
|
token = ParticipantToken(
|
|
52
53
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
53
54
|
)
|
|
54
|
-
|
|
55
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
55
56
|
token.add_role_grant(role=role)
|
|
56
57
|
token.add_room_grant(room)
|
|
57
58
|
|
meshagent/cli/call.py
CHANGED
|
@@ -9,6 +9,7 @@ from meshagent.api import (
|
|
|
9
9
|
ParticipantToken,
|
|
10
10
|
WebSocketClientProtocol,
|
|
11
11
|
ParticipantGrant,
|
|
12
|
+
ApiScope,
|
|
12
13
|
)
|
|
13
14
|
from meshagent.api.helpers import meshagent_base_url, websocket_room_url
|
|
14
15
|
from meshagent.api.services import send_webhook
|
|
@@ -121,6 +122,7 @@ async def make_call(
|
|
|
121
122
|
token = ParticipantToken(
|
|
122
123
|
name=participant_name, project_id=project_id, api_key_id=api_key_id
|
|
123
124
|
)
|
|
125
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
124
126
|
token.add_role_grant(role=role)
|
|
125
127
|
token.add_room_grant(room)
|
|
126
128
|
token.grants.append(ParticipantGrant(name="tunnel_ports", scope="9000"))
|
meshagent/cli/developer.py
CHANGED
|
@@ -11,7 +11,12 @@ from meshagent.cli.helper import (
|
|
|
11
11
|
resolve_api_key,
|
|
12
12
|
resolve_room,
|
|
13
13
|
)
|
|
14
|
-
from meshagent.api import
|
|
14
|
+
from meshagent.api import (
|
|
15
|
+
RoomClient,
|
|
16
|
+
ParticipantToken,
|
|
17
|
+
WebSocketClientProtocol,
|
|
18
|
+
ApiScope,
|
|
19
|
+
)
|
|
15
20
|
from meshagent.api.helpers import meshagent_base_url, websocket_room_url
|
|
16
21
|
|
|
17
22
|
app = async_typer.AsyncTyper()
|
|
@@ -50,6 +55,7 @@ async def watch_logs(
|
|
|
50
55
|
token = ParticipantToken(
|
|
51
56
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
52
57
|
)
|
|
58
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
53
59
|
token.add_role_grant(role=role)
|
|
54
60
|
token.add_room_grant(room)
|
|
55
61
|
|
meshagent/cli/exec.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
import
|
|
3
|
-
import termios
|
|
2
|
+
import os
|
|
4
3
|
from meshagent.api.websocket_protocol import WebSocketClientProtocol
|
|
5
4
|
from meshagent.api import RoomClient
|
|
6
5
|
from meshagent.api.helpers import websocket_room_url
|
|
@@ -15,8 +14,11 @@ import signal
|
|
|
15
14
|
import shutil
|
|
16
15
|
import json
|
|
17
16
|
from urllib.parse import quote
|
|
17
|
+
import threading
|
|
18
|
+
import time
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
|
|
21
|
+
from meshagent.api import ParticipantToken, ApiScope
|
|
20
22
|
|
|
21
23
|
import logging
|
|
22
24
|
|
|
@@ -27,6 +29,57 @@ from meshagent.cli.helper import (
|
|
|
27
29
|
resolve_room,
|
|
28
30
|
)
|
|
29
31
|
|
|
32
|
+
if os.name == "nt":
|
|
33
|
+
import msvcrt
|
|
34
|
+
import ctypes
|
|
35
|
+
from ctypes import wintypes
|
|
36
|
+
|
|
37
|
+
_kernel32 = ctypes.windll.kernel32
|
|
38
|
+
_ENABLE_ECHO_INPUT = 0x0004
|
|
39
|
+
_ENABLE_LINE_INPUT = 0x0002
|
|
40
|
+
|
|
41
|
+
def set_raw(f):
|
|
42
|
+
"""Disable line and echo mode for the given file handle."""
|
|
43
|
+
handle = msvcrt.get_osfhandle(f.fileno())
|
|
44
|
+
original_mode = wintypes.DWORD()
|
|
45
|
+
if not _kernel32.GetConsoleMode(handle, ctypes.byref(original_mode)):
|
|
46
|
+
return None
|
|
47
|
+
new_mode = original_mode.value & ~(_ENABLE_ECHO_INPUT | _ENABLE_LINE_INPUT)
|
|
48
|
+
_kernel32.SetConsoleMode(handle, new_mode)
|
|
49
|
+
return handle, original_mode.value
|
|
50
|
+
|
|
51
|
+
def restore(f, state):
|
|
52
|
+
if state is None:
|
|
53
|
+
return None
|
|
54
|
+
handle, mode = state
|
|
55
|
+
_kernel32.SetConsoleMode(handle, mode)
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
else:
|
|
59
|
+
import termios
|
|
60
|
+
import tty as _tty
|
|
61
|
+
|
|
62
|
+
def set_raw(fd):
|
|
63
|
+
old = termios.tcgetattr(fd)
|
|
64
|
+
_tty.setraw(fd)
|
|
65
|
+
return old
|
|
66
|
+
|
|
67
|
+
def restore(fd, old_settings):
|
|
68
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class _StdWriter:
|
|
72
|
+
"""Simple asyncio-friendly wrapper for standard streams on Windows."""
|
|
73
|
+
|
|
74
|
+
def __init__(self, file):
|
|
75
|
+
self._file = file
|
|
76
|
+
|
|
77
|
+
def write(self, data: bytes) -> None:
|
|
78
|
+
self._file.buffer.write(data)
|
|
79
|
+
|
|
80
|
+
async def drain(self) -> None:
|
|
81
|
+
await asyncio.get_running_loop().run_in_executor(None, self._file.flush)
|
|
82
|
+
|
|
30
83
|
|
|
31
84
|
def register(app: typer.Typer):
|
|
32
85
|
@app.async_command("exec")
|
|
@@ -53,6 +106,7 @@ def register(app: typer.Typer):
|
|
|
53
106
|
token = ParticipantToken(
|
|
54
107
|
name="tty", project_id=project_id, api_key_id=api_key_id
|
|
55
108
|
)
|
|
109
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
56
110
|
|
|
57
111
|
key = (
|
|
58
112
|
await client.decrypt_project_api_key(
|
|
@@ -98,8 +152,7 @@ def register(app: typer.Typer):
|
|
|
98
152
|
|
|
99
153
|
if tty:
|
|
100
154
|
# Save current terminal settings so we can restore them later.
|
|
101
|
-
old_tty_settings =
|
|
102
|
-
_tty.setraw(sys.stdin)
|
|
155
|
+
old_tty_settings = set_raw(sys.stdin)
|
|
103
156
|
|
|
104
157
|
async with RoomClient(
|
|
105
158
|
protocol=WebSocketClientProtocol(
|
|
@@ -113,25 +166,29 @@ def register(app: typer.Typer):
|
|
|
113
166
|
send_queue = asyncio.Queue[bytes]()
|
|
114
167
|
|
|
115
168
|
loop = asyncio.get_running_loop()
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
169
|
+
if os.name == "nt":
|
|
170
|
+
stdout_writer = _StdWriter(sys.stdout)
|
|
171
|
+
stderr_writer = _StdWriter(sys.stderr)
|
|
172
|
+
else:
|
|
173
|
+
(
|
|
174
|
+
stdout_transport,
|
|
175
|
+
stdout_protocol,
|
|
176
|
+
) = await loop.connect_write_pipe(
|
|
177
|
+
asyncio.streams.FlowControlMixin, sys.stdout
|
|
178
|
+
)
|
|
179
|
+
stdout_writer = asyncio.StreamWriter(
|
|
180
|
+
stdout_transport, stdout_protocol, None, loop
|
|
181
|
+
)
|
|
125
182
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
183
|
+
(
|
|
184
|
+
stderr_transport,
|
|
185
|
+
stderr_protocol,
|
|
186
|
+
) = await loop.connect_write_pipe(
|
|
187
|
+
asyncio.streams.FlowControlMixin, sys.stderr
|
|
188
|
+
)
|
|
189
|
+
stderr_writer = asyncio.StreamWriter(
|
|
190
|
+
stderr_transport, stderr_protocol, None, loop
|
|
191
|
+
)
|
|
135
192
|
|
|
136
193
|
async def recv_from_websocket():
|
|
137
194
|
while True:
|
|
@@ -206,46 +263,97 @@ def register(app: typer.Typer):
|
|
|
206
263
|
|
|
207
264
|
task.add_done_callback(on_done)
|
|
208
265
|
|
|
209
|
-
|
|
266
|
+
if hasattr(signal, "SIGWINCH"):
|
|
267
|
+
loop.add_signal_handler(signal.SIGWINCH, on_sigwinch)
|
|
210
268
|
|
|
211
269
|
async def read_stdin():
|
|
212
270
|
loop = asyncio.get_running_loop()
|
|
213
271
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
272
|
+
if os.name == "nt":
|
|
273
|
+
queue: asyncio.Queue[bytes] = asyncio.Queue()
|
|
274
|
+
stop_event = threading.Event()
|
|
275
|
+
|
|
276
|
+
if sys.stdin.isatty():
|
|
277
|
+
|
|
278
|
+
def reader() -> None:
|
|
279
|
+
try:
|
|
280
|
+
while not stop_event.is_set():
|
|
281
|
+
if msvcrt.kbhit():
|
|
282
|
+
data = msvcrt.getch()
|
|
283
|
+
loop.call_soon_threadsafe(
|
|
284
|
+
queue.put_nowait, data
|
|
285
|
+
)
|
|
286
|
+
else:
|
|
287
|
+
time.sleep(0.01)
|
|
288
|
+
finally:
|
|
289
|
+
loop.call_soon_threadsafe(
|
|
290
|
+
queue.put_nowait, b""
|
|
291
|
+
)
|
|
292
|
+
else:
|
|
219
293
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
294
|
+
def reader() -> None:
|
|
295
|
+
try:
|
|
296
|
+
while not stop_event.is_set():
|
|
297
|
+
data = sys.stdin.buffer.read(1)
|
|
298
|
+
loop.call_soon_threadsafe(
|
|
299
|
+
queue.put_nowait, data
|
|
300
|
+
)
|
|
301
|
+
if not data:
|
|
302
|
+
break
|
|
303
|
+
finally:
|
|
304
|
+
loop.call_soon_threadsafe(
|
|
305
|
+
queue.put_nowait, b""
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
thread = threading.Thread(target=reader)
|
|
309
|
+
thread.start()
|
|
310
|
+
|
|
311
|
+
async def reader_task() -> bytes:
|
|
312
|
+
return await queue.get()
|
|
313
|
+
else:
|
|
314
|
+
reader = asyncio.StreamReader()
|
|
315
|
+
protocol = asyncio.StreamReaderProtocol(reader)
|
|
316
|
+
await loop.connect_read_pipe(
|
|
317
|
+
lambda: protocol, sys.stdin
|
|
228
318
|
)
|
|
229
319
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
320
|
+
async def reader_task():
|
|
321
|
+
return await reader.read(1)
|
|
322
|
+
|
|
323
|
+
try:
|
|
324
|
+
while True:
|
|
325
|
+
# Read one character at a time from stdin without blocking the event loop.
|
|
326
|
+
done, pending = await asyncio.wait(
|
|
327
|
+
[
|
|
328
|
+
asyncio.create_task(reader_task()),
|
|
329
|
+
websocket_recv_task,
|
|
330
|
+
],
|
|
331
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
first = done.pop()
|
|
335
|
+
if first == websocket_recv_task:
|
|
336
|
+
break
|
|
237
337
|
|
|
238
|
-
|
|
239
|
-
|
|
338
|
+
data = first.result()
|
|
339
|
+
if not data:
|
|
340
|
+
break
|
|
240
341
|
|
|
241
|
-
|
|
242
|
-
if data == b"\x04":
|
|
342
|
+
if websocket.closed:
|
|
243
343
|
break
|
|
244
344
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
345
|
+
if tty:
|
|
346
|
+
if data == b"\x04":
|
|
347
|
+
break
|
|
348
|
+
|
|
349
|
+
if data:
|
|
350
|
+
send_queue.put_nowait(b"\0" + data)
|
|
351
|
+
else:
|
|
352
|
+
break
|
|
353
|
+
finally:
|
|
354
|
+
if os.name == "nt":
|
|
355
|
+
stop_event.set()
|
|
356
|
+
thread.join()
|
|
249
357
|
|
|
250
358
|
send_queue.put_nowait(b"\0")
|
|
251
359
|
|
|
@@ -283,9 +391,7 @@ def register(app: typer.Typer):
|
|
|
283
391
|
finally:
|
|
284
392
|
if not sys.stdin.closed and tty:
|
|
285
393
|
# Restore original terminal settings even if the coroutine is cancelled.
|
|
286
|
-
|
|
287
|
-
sys.stdin, termios.TCSADRAIN, old_tty_settings
|
|
288
|
-
)
|
|
394
|
+
restore(sys.stdin, old_tty_settings)
|
|
289
395
|
|
|
290
396
|
except Exception as e:
|
|
291
397
|
print(f"[red]{e}[/red]")
|
meshagent/cli/helper.py
CHANGED
|
@@ -8,7 +8,7 @@ from meshagent.cli import auth_async
|
|
|
8
8
|
from meshagent.cli import async_typer
|
|
9
9
|
from meshagent.api.helpers import meshagent_base_url
|
|
10
10
|
from meshagent.api.accounts_client import AccountsClient
|
|
11
|
-
from meshagent.api.participant_token import ParticipantToken
|
|
11
|
+
from meshagent.api.participant_token import ParticipantToken, ApiScope
|
|
12
12
|
|
|
13
13
|
import os
|
|
14
14
|
|
|
@@ -169,6 +169,8 @@ async def resolve_token_jwt(
|
|
|
169
169
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
170
170
|
)
|
|
171
171
|
|
|
172
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
173
|
+
|
|
172
174
|
token.add_role_grant(role=role)
|
|
173
175
|
token.add_room_grant(room)
|
|
174
176
|
|
|
@@ -2,7 +2,7 @@ import typer
|
|
|
2
2
|
from rich import print
|
|
3
3
|
from typing import Annotated
|
|
4
4
|
from meshagent.cli.common_options import ProjectIdOption, ApiKeyIdOption, RoomOption
|
|
5
|
-
from meshagent.api import ParticipantToken
|
|
5
|
+
from meshagent.api import ParticipantToken, ApiScope
|
|
6
6
|
from meshagent.cli.helper import resolve_project_id, resolve_api_key, resolve_room
|
|
7
7
|
from meshagent.cli import async_typer
|
|
8
8
|
from meshagent.cli.helper import get_client
|
|
@@ -15,7 +15,7 @@ app = async_typer.AsyncTyper()
|
|
|
15
15
|
async def generate(
|
|
16
16
|
*,
|
|
17
17
|
project_id: ProjectIdOption = None,
|
|
18
|
-
token_path: Annotated[str, typer.Option()],
|
|
18
|
+
token_path: Annotated[str, typer.Option()] = None,
|
|
19
19
|
room: RoomOption,
|
|
20
20
|
api_key_id: ApiKeyIdOption = None,
|
|
21
21
|
name: Annotated[str, typer.Option()],
|
|
@@ -37,6 +37,7 @@ async def generate(
|
|
|
37
37
|
token.add_role_grant(role=role)
|
|
38
38
|
|
|
39
39
|
token.add_room_grant(room)
|
|
40
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
40
41
|
|
|
41
42
|
if token_path is None:
|
|
42
43
|
print(token.to_jwt(token=key))
|
meshagent/cli/queue.py
CHANGED
|
@@ -10,6 +10,7 @@ from meshagent.api import (
|
|
|
10
10
|
ParticipantToken,
|
|
11
11
|
WebSocketClientProtocol,
|
|
12
12
|
RoomException,
|
|
13
|
+
ApiScope,
|
|
13
14
|
)
|
|
14
15
|
from meshagent.cli.helper import resolve_project_id, resolve_api_key, resolve_room
|
|
15
16
|
from meshagent.cli import async_typer
|
|
@@ -48,9 +49,10 @@ async def send(
|
|
|
48
49
|
token = ParticipantToken(
|
|
49
50
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
50
51
|
)
|
|
51
|
-
|
|
52
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
52
53
|
token.add_role_grant(role=role)
|
|
53
54
|
token.add_room_grant(room)
|
|
55
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
54
56
|
|
|
55
57
|
print("[bold green]Connecting to room...[/bold green]")
|
|
56
58
|
async with RoomClient(
|
|
@@ -98,7 +100,7 @@ async def receive(
|
|
|
98
100
|
token = ParticipantToken(
|
|
99
101
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
100
102
|
)
|
|
101
|
-
|
|
103
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
102
104
|
token.add_role_grant(role=role)
|
|
103
105
|
token.add_room_grant(room)
|
|
104
106
|
|
meshagent/cli/services.py
CHANGED
|
@@ -11,7 +11,11 @@ from pydantic import PositiveInt
|
|
|
11
11
|
import pydantic
|
|
12
12
|
from typing import Literal
|
|
13
13
|
from meshagent.cli import async_typer
|
|
14
|
-
from meshagent.api.specs.service import
|
|
14
|
+
from meshagent.api.specs.service import (
|
|
15
|
+
ServiceSpec,
|
|
16
|
+
ServiceStorageMounts,
|
|
17
|
+
RoomStorageMount,
|
|
18
|
+
)
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
from meshagent.cli.helper import (
|
|
@@ -27,6 +31,7 @@ from meshagent.api import (
|
|
|
27
31
|
WebSocketClientProtocol,
|
|
28
32
|
websocket_room_url,
|
|
29
33
|
meshagent_base_url,
|
|
34
|
+
ApiScope,
|
|
30
35
|
)
|
|
31
36
|
from meshagent.cli.common_options import OutputFormatOption
|
|
32
37
|
|
|
@@ -169,6 +174,15 @@ async def service_create(
|
|
|
169
174
|
for ps in port_specs
|
|
170
175
|
} or None
|
|
171
176
|
|
|
177
|
+
storage = ServiceStorageMounts(room=[])
|
|
178
|
+
|
|
179
|
+
if room_storage_path is not None:
|
|
180
|
+
storage.room.append(
|
|
181
|
+
RoomStorageMount(
|
|
182
|
+
path=room_storage_path, subpath=room_storage_subpath
|
|
183
|
+
)
|
|
184
|
+
)
|
|
185
|
+
|
|
172
186
|
service_obj = Service(
|
|
173
187
|
created_at=datetime.now(timezone.utc).isoformat(),
|
|
174
188
|
name=name,
|
|
@@ -176,12 +190,11 @@ async def service_create(
|
|
|
176
190
|
image=image,
|
|
177
191
|
command=command,
|
|
178
192
|
pull_secret=pull_secret,
|
|
179
|
-
room_storage_path=room_storage_path,
|
|
180
|
-
room_storage_subpath=room_storage_subpath,
|
|
181
193
|
environment=_kv_to_dict(env),
|
|
182
194
|
environment_secrets=env_secret or None,
|
|
183
195
|
runtime_secrets=_kv_to_dict(runtime_secret),
|
|
184
196
|
ports=ports_dict,
|
|
197
|
+
storage=storage,
|
|
185
198
|
)
|
|
186
199
|
|
|
187
200
|
try:
|
|
@@ -282,6 +295,15 @@ async def service_update(
|
|
|
282
295
|
for ps in port_specs
|
|
283
296
|
} or None
|
|
284
297
|
|
|
298
|
+
storage = ServiceStorageMounts(room=[])
|
|
299
|
+
|
|
300
|
+
if room_storage_path is not None:
|
|
301
|
+
storage.room.append(
|
|
302
|
+
RoomStorageMount(
|
|
303
|
+
path=room_storage_path, subpath=room_storage_subpath
|
|
304
|
+
)
|
|
305
|
+
)
|
|
306
|
+
|
|
285
307
|
service_obj = Service(
|
|
286
308
|
created_at=datetime.now(timezone.utc).isoformat(),
|
|
287
309
|
name=name,
|
|
@@ -289,12 +311,11 @@ async def service_update(
|
|
|
289
311
|
image=image,
|
|
290
312
|
command=command,
|
|
291
313
|
pull_secret=pull_secret,
|
|
292
|
-
room_storage_path=room_storage_path,
|
|
293
|
-
room_storage_subpath=room_storage_subpath,
|
|
294
314
|
environment=_kv_to_dict(env),
|
|
295
315
|
environment_secrets=env_secret or None,
|
|
296
316
|
runtime_secrets=_kv_to_dict(runtime_secret),
|
|
297
317
|
ports=ports_dict,
|
|
318
|
+
storage=storage,
|
|
298
319
|
)
|
|
299
320
|
|
|
300
321
|
try:
|
|
@@ -430,6 +451,7 @@ async def service_test(
|
|
|
430
451
|
token = ParticipantToken(
|
|
431
452
|
name=name, project_id=project_id, api_key_id=api_key_id
|
|
432
453
|
)
|
|
454
|
+
token.add_api_grant(ApiScope.agent_default())
|
|
433
455
|
token.add_role_grant("user")
|
|
434
456
|
token.add_room_grant(room)
|
|
435
457
|
token.extra_payload = {
|
meshagent/cli/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.5.
|
|
1
|
+
__version__ = "0.5.8b2"
|
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.8b2
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
7
7
|
Project-URL: Website, https://www.meshagent.com
|
|
8
8
|
Project-URL: Source, https://www.meshagent.com
|
|
9
|
-
Requires-Python: >=3.
|
|
9
|
+
Requires-Python: >=3.13
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
Requires-Dist: typer~=0.15
|
|
12
|
-
Requires-Dist: pydantic-yaml~=1.4
|
|
13
|
-
Requires-Dist: meshagent-api~=0.5.7
|
|
14
|
-
Requires-Dist: meshagent-agents~=0.5.7
|
|
15
|
-
Requires-Dist: meshagent-computers~=0.5.7
|
|
16
|
-
Requires-Dist: meshagent-openai~=0.5.7
|
|
17
|
-
Requires-Dist: meshagent-tools~=0.5.7
|
|
18
|
-
Requires-Dist: meshagent-mcp~=0.5.7
|
|
19
12
|
Requires-Dist: supabase~=2.15
|
|
20
13
|
Requires-Dist: fastmcp~=2.8
|
|
21
14
|
Requires-Dist: opentelemetry-distro~=0.54b1
|
|
22
15
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http~=1.33
|
|
23
16
|
Requires-Dist: art~=6.5
|
|
24
17
|
Requires-Dist: pydantic-yaml~=1.5
|
|
18
|
+
Provides-Extra: all
|
|
19
|
+
Requires-Dist: meshagent-api~=0.5.8b2; extra == "all"
|
|
20
|
+
Requires-Dist: meshagent-agents~=0.5.8b2; extra == "all"
|
|
21
|
+
Requires-Dist: meshagent-computers~=0.5.8b2; extra == "all"
|
|
22
|
+
Requires-Dist: meshagent-openai~=0.5.8b2; extra == "all"
|
|
23
|
+
Requires-Dist: meshagent-tools~=0.5.8b2; extra == "all"
|
|
24
|
+
Requires-Dist: meshagent-mcp~=0.5.8b2; extra == "all"
|
|
25
|
+
Provides-Extra: mcp-service
|
|
26
|
+
Requires-Dist: meshagent-api~=0.5.8b2; extra == "mcp-service"
|
|
27
|
+
Requires-Dist: meshagent-tools~=0.5.8b2; extra == "mcp-service"
|
|
28
|
+
Requires-Dist: meshagent-mcp~=0.5.8b2; extra == "mcp-service"
|
|
25
29
|
|
|
26
30
|
# [Meshagent](https://www.meshagent.com)
|
|
27
31
|
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
meshagent/cli/__init__.py,sha256=X78Z4yEg5XfkNKH0HiIdG4k1q5ktB-ampTuXHLNFrAw,58
|
|
2
|
-
meshagent/cli/agent.py,sha256=
|
|
2
|
+
meshagent/cli/agent.py,sha256=uP2VNkEPlwglG0sdbOwfk3KHvSKvi7lvNuX2MnJ3V8Y,10758
|
|
3
3
|
meshagent/cli/api_keys.py,sha256=l288EXciwj7C3ooSb-kQIjLInq7QVs2QuTtbMewTgM4,5026
|
|
4
4
|
meshagent/cli/async_typer.py,sha256=GCeSefBDbpd-V4V8LrvHGUTBMth3HspVMfFa-HUZ0cg,898
|
|
5
5
|
meshagent/cli/auth.py,sha256=wpGTomrFH0uvbwv262sTqK0DgB4ltAuurEmI9tYedIs,815
|
|
6
6
|
meshagent/cli/auth_async.py,sha256=mi2-u949M412PAMN-PCdHEiF9hGf0W3m1RAseZX07-w,4058
|
|
7
|
-
meshagent/cli/call.py,sha256=
|
|
7
|
+
meshagent/cli/call.py,sha256=XGJXOyU4v7dct-eCJ6eVG5n46_DQgU2z19kbDOvq-eg,5473
|
|
8
8
|
meshagent/cli/chatbot.py,sha256=q-W3GdbvT9YgTrwwxZRnTV1E_tzBIrkmn0ngJHjB1tU,8946
|
|
9
9
|
meshagent/cli/cli.py,sha256=a3wOL1uZVQqb8wE1fzL1-PCkDQxd5XZ06m-7oenR20Q,6677
|
|
10
10
|
meshagent/cli/cli_mcp.py,sha256=Wh3brbzBIs3h15qLrZltLOKxpJoImIEuBEb5ISDOKGY,10656
|
|
11
11
|
meshagent/cli/cli_secrets.py,sha256=RC236eYGV4sl4gOzaBYAGl23RNIAs7qXnwOSJpDMt-4,13722
|
|
12
12
|
meshagent/cli/common_options.py,sha256=-eNhLfHxbVG3DXME5ONySMfMel8nZsOBwXHKsGtLSq4,726
|
|
13
|
-
meshagent/cli/developer.py,sha256=
|
|
14
|
-
meshagent/cli/exec.py,sha256=
|
|
15
|
-
meshagent/cli/helper.py,sha256=
|
|
13
|
+
meshagent/cli/developer.py,sha256=BHCVENfp6MkYohVBZCCqP0R0n673lG88xSBqtBOOzAM,3059
|
|
14
|
+
meshagent/cli/exec.py,sha256=Pymq3I3uwRAoCwyTKYFo9fOl9VYhQqaYBhPe-s9LdII,16295
|
|
15
|
+
meshagent/cli/helper.py,sha256=Y_RP5SzGIgJXSlYhIOfN85bFrMvrA6gUN_9QOASQrAo,4942
|
|
16
16
|
meshagent/cli/mailbot.py,sha256=LttSEpR15947OYSlN6B_eFDTxesahA0ZxNIC_-s3vfE,8204
|
|
17
17
|
meshagent/cli/messaging.py,sha256=2_wd71vvG71ctTBXW9FdnwSUnoPy_W6I8aw2f3SUD24,6407
|
|
18
18
|
meshagent/cli/otel.py,sha256=1yoMGivskLV9f7M_LqCLKbttTTAPmFY5yhWXqFzvRN8,4066
|
|
19
|
-
meshagent/cli/participant_token.py,sha256=
|
|
19
|
+
meshagent/cli/participant_token.py,sha256=hi15CIdL0DbIAgIRJWHb2mowTNHTbsF6BjQwwUwEcVM,1559
|
|
20
20
|
meshagent/cli/projects.py,sha256=-s5xIfd2pCW8HsuqRsNoKZr5hsF6xYxfEjyYI6Nm4YI,3511
|
|
21
|
-
meshagent/cli/queue.py,sha256=
|
|
22
|
-
meshagent/cli/services.py,sha256=
|
|
21
|
+
meshagent/cli/queue.py,sha256=pxSwL_W8_BXHWcFekzRrL5pfDc3RMGBbuE6yT7RAaTA,4120
|
|
22
|
+
meshagent/cli/services.py,sha256=3hC0nFnL_uMgD6chdMX-GQmFVUEj5ljiwIlxUlou8Ic,18096
|
|
23
23
|
meshagent/cli/sessions.py,sha256=bUwrPkzeEWE8gTqD4E-tfr2ChBns3Fvv9MsSV4RRNTQ,881
|
|
24
24
|
meshagent/cli/storage.py,sha256=aqSLojVF-aTEvSaVRyPh2dfOd2LrO_kcbUbhQYj8g5E,34827
|
|
25
|
-
meshagent/cli/version.py,sha256=
|
|
25
|
+
meshagent/cli/version.py,sha256=XjZfthvgCzJfBN1zyOivtozYnnpMJSIPIW-kSUEAjkY,24
|
|
26
26
|
meshagent/cli/voicebot.py,sha256=DCSvsa2EeGQTxI2i6xA6tS1dM2U4op8MsMNy99KQfjo,5775
|
|
27
27
|
meshagent/cli/webhook.py,sha256=3vSZAGC19A8GN26uogh-ZUFeAOOCUOeqn80RVXj4qaA,2995
|
|
28
|
-
meshagent_cli-0.5.
|
|
29
|
-
meshagent_cli-0.5.
|
|
30
|
-
meshagent_cli-0.5.
|
|
31
|
-
meshagent_cli-0.5.
|
|
32
|
-
meshagent_cli-0.5.
|
|
28
|
+
meshagent_cli-0.5.8b2.dist-info/METADATA,sha256=1uPkkKqlVBFnQlnI6YxtnBKQMmumFOLHoD3h2mV7Mcs,1802
|
|
29
|
+
meshagent_cli-0.5.8b2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
30
|
+
meshagent_cli-0.5.8b2.dist-info/entry_points.txt,sha256=WRcGGN4vMtvC5Pgl3uRFqsJiQXNoHuLLa-TCSY3gAhQ,52
|
|
31
|
+
meshagent_cli-0.5.8b2.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
|
|
32
|
+
meshagent_cli-0.5.8b2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|