meshagent-cli 0.5.7__tar.gz → 0.5.8b1__tar.gz

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.

Files changed (39) hide show
  1. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/PKG-INFO +13 -9
  2. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/agent.py +2 -1
  3. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/call.py +2 -0
  4. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/developer.py +7 -1
  5. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/exec.py +161 -55
  6. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/helper.py +3 -1
  7. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/participant_token.py +3 -2
  8. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/queue.py +4 -2
  9. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/services.py +27 -5
  10. meshagent_cli-0.5.8b1/meshagent/cli/version.py +1 -0
  11. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent_cli.egg-info/PKG-INFO +13 -9
  12. meshagent_cli-0.5.8b1/meshagent_cli.egg-info/requires.txt +20 -0
  13. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/pyproject.toml +18 -8
  14. meshagent_cli-0.5.7/meshagent/cli/version.py +0 -1
  15. meshagent_cli-0.5.7/meshagent_cli.egg-info/requires.txt +0 -14
  16. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/README.md +0 -0
  17. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/__init__.py +0 -0
  18. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/api_keys.py +0 -0
  19. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/async_typer.py +0 -0
  20. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/auth.py +0 -0
  21. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/auth_async.py +0 -0
  22. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/chatbot.py +0 -0
  23. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/cli.py +0 -0
  24. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/cli_mcp.py +0 -0
  25. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/cli_secrets.py +0 -0
  26. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/common_options.py +0 -0
  27. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/mailbot.py +0 -0
  28. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/messaging.py +0 -0
  29. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/otel.py +0 -0
  30. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/projects.py +0 -0
  31. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/sessions.py +0 -0
  32. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/storage.py +0 -0
  33. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/voicebot.py +0 -0
  34. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent/cli/webhook.py +0 -0
  35. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent_cli.egg-info/SOURCES.txt +0 -0
  36. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent_cli.egg-info/dependency_links.txt +0 -0
  37. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent_cli.egg-info/entry_points.txt +0 -0
  38. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/meshagent_cli.egg-info/top_level.txt +0 -0
  39. {meshagent_cli-0.5.7 → meshagent_cli-0.5.8b1}/setup.cfg +0 -0
@@ -1,27 +1,31 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.5.7
3
+ Version: 0.5.8b1
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.12
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.8-beta.1; extra == "all"
20
+ Requires-Dist: meshagent-agents~=0.5.8-beta.1; extra == "all"
21
+ Requires-Dist: meshagent-computers~=0.5.8-beta.1; extra == "all"
22
+ Requires-Dist: meshagent-openai~=0.5.8-beta.1; extra == "all"
23
+ Requires-Dist: meshagent-tools~=0.5.8-beta.1; extra == "all"
24
+ Requires-Dist: meshagent-mcp~=0.5.8-beta.1; extra == "all"
25
+ Provides-Extra: mcp-service
26
+ Requires-Dist: meshagent-api~=0.5.8-beta.1; extra == "mcp-service"
27
+ Requires-Dist: meshagent-tools~=0.5.8-beta.1; extra == "mcp-service"
28
+ Requires-Dist: meshagent-mcp~=0.5.8-beta.1; extra == "mcp-service"
25
29
 
26
30
  # [Meshagent](https://www.meshagent.com)
27
31
 
@@ -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
 
@@ -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"))
@@ -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 RoomClient, ParticipantToken, WebSocketClientProtocol
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
 
@@ -1,6 +1,5 @@
1
1
  import sys
2
- import tty as _tty
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
- from meshagent.api import ParticipantToken
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 = termios.tcgetattr(sys.stdin)
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
- stdout_transport,
118
- stdout_protocol,
119
- ) = await loop.connect_write_pipe(
120
- asyncio.streams.FlowControlMixin, sys.stdout
121
- )
122
- stdout_writer = asyncio.StreamWriter(
123
- stdout_transport, stdout_protocol, None, loop
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
- stderr_transport,
128
- stderr_protocol,
129
- ) = await loop.connect_write_pipe(
130
- asyncio.streams.FlowControlMixin, sys.stderr
131
- )
132
- stderr_writer = asyncio.StreamWriter(
133
- stderr_transport, stderr_protocol, None, loop
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
- loop.add_signal_handler(signal.SIGWINCH, on_sigwinch)
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
- reader = asyncio.StreamReader()
215
- protocol = asyncio.StreamReaderProtocol(reader)
216
- await loop.connect_read_pipe(
217
- lambda: protocol, sys.stdin
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
- while True:
221
- # Read one character at a time from stdin without blocking the event loop.
222
- done, pending = await asyncio.wait(
223
- [
224
- asyncio.create_task(reader.read(1)),
225
- websocket_recv_task,
226
- ],
227
- return_when=asyncio.FIRST_COMPLETED,
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
- first = done.pop()
231
- if first == websocket_recv_task:
232
- break
233
-
234
- data = first.result()
235
- if not data:
236
- break
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
- if websocket.closed:
239
- break
338
+ data = first.result()
339
+ if not data:
340
+ break
240
341
 
241
- if tty:
242
- if data == b"\x04":
342
+ if websocket.closed:
243
343
  break
244
344
 
245
- if data:
246
- send_queue.put_nowait(b"\0" + data)
247
- else:
248
- break
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
- termios.tcsetattr(
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]")
@@ -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))
@@ -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
 
@@ -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 ServiceSpec
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 = {
@@ -0,0 +1 @@
1
+ __version__ = "0.5.8-beta.1"
@@ -1,27 +1,31 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-cli
3
- Version: 0.5.7
3
+ Version: 0.5.8b1
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.12
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.8-beta.1; extra == "all"
20
+ Requires-Dist: meshagent-agents~=0.5.8-beta.1; extra == "all"
21
+ Requires-Dist: meshagent-computers~=0.5.8-beta.1; extra == "all"
22
+ Requires-Dist: meshagent-openai~=0.5.8-beta.1; extra == "all"
23
+ Requires-Dist: meshagent-tools~=0.5.8-beta.1; extra == "all"
24
+ Requires-Dist: meshagent-mcp~=0.5.8-beta.1; extra == "all"
25
+ Provides-Extra: mcp-service
26
+ Requires-Dist: meshagent-api~=0.5.8-beta.1; extra == "mcp-service"
27
+ Requires-Dist: meshagent-tools~=0.5.8-beta.1; extra == "mcp-service"
28
+ Requires-Dist: meshagent-mcp~=0.5.8-beta.1; extra == "mcp-service"
25
29
 
26
30
  # [Meshagent](https://www.meshagent.com)
27
31
 
@@ -0,0 +1,20 @@
1
+ typer~=0.15
2
+ supabase~=2.15
3
+ fastmcp~=2.8
4
+ opentelemetry-distro~=0.54b1
5
+ opentelemetry-exporter-otlp-proto-http~=1.33
6
+ art~=6.5
7
+ pydantic-yaml~=1.5
8
+
9
+ [all]
10
+ meshagent-api~=0.5.8-beta.1
11
+ meshagent-agents~=0.5.8-beta.1
12
+ meshagent-computers~=0.5.8-beta.1
13
+ meshagent-openai~=0.5.8-beta.1
14
+ meshagent-tools~=0.5.8-beta.1
15
+ meshagent-mcp~=0.5.8-beta.1
16
+
17
+ [mcp-service]
18
+ meshagent-api~=0.5.8-beta.1
19
+ meshagent-tools~=0.5.8-beta.1
20
+ meshagent-mcp~=0.5.8-beta.1
@@ -5,18 +5,11 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "meshagent-cli"
7
7
  description = "CLI for Meshagent"
8
- requires-python = ">=3.12"
8
+ requires-python = ">=3.13"
9
9
  license = "Apache-2.0"
10
10
  keywords = []
11
11
  dependencies = [
12
12
  "typer~=0.15",
13
- "pydantic-yaml~=1.4",
14
- "meshagent-api~=0.5.7",
15
- "meshagent-agents~=0.5.7",
16
- "meshagent-computers~=0.5.7",
17
- "meshagent-openai~=0.5.7",
18
- "meshagent-tools~=0.5.7",
19
- "meshagent-mcp~=0.5.7",
20
13
  "supabase~=2.15",
21
14
  "fastmcp~=2.8",
22
15
  "opentelemetry-distro~=0.54b1",
@@ -27,6 +20,23 @@ dependencies = [
27
20
 
28
21
  dynamic = ["version", "readme"]
29
22
 
23
+ [project.optional-dependencies]
24
+
25
+ all = [
26
+ "meshagent-api~=0.5.8-beta.1",
27
+ "meshagent-agents~=0.5.8-beta.1",
28
+ "meshagent-computers~=0.5.8-beta.1",
29
+ "meshagent-openai~=0.5.8-beta.1",
30
+ "meshagent-tools~=0.5.8-beta.1",
31
+ "meshagent-mcp~=0.5.8-beta.1"
32
+ ]
33
+
34
+ mcp-service = [
35
+ "meshagent-api~=0.5.8-beta.1",
36
+ "meshagent-tools~=0.5.8-beta.1",
37
+ "meshagent-mcp~=0.5.8-beta.1"
38
+ ]
39
+
30
40
  [project.scripts]
31
41
  meshagent = "meshagent.cli.cli:app"
32
42
 
@@ -1 +0,0 @@
1
- __version__ = "0.5.7"
@@ -1,14 +0,0 @@
1
- typer~=0.15
2
- pydantic-yaml~=1.4
3
- meshagent-api~=0.5.7
4
- meshagent-agents~=0.5.7
5
- meshagent-computers~=0.5.7
6
- meshagent-openai~=0.5.7
7
- meshagent-tools~=0.5.7
8
- meshagent-mcp~=0.5.7
9
- supabase~=2.15
10
- fastmcp~=2.8
11
- opentelemetry-distro~=0.54b1
12
- opentelemetry-exporter-otlp-proto-http~=1.33
13
- art~=6.5
14
- pydantic-yaml~=1.5
File without changes
File without changes