meshagent-cli 0.47.1__tar.gz → 0.48.0__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.
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/PKG-INFO +17 -17
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/cli.py +5 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/cli_test.py +31 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/contact-form/server.py +12 -2
- meshagent_cli-0.48.0/meshagent/cli/mounts.py +64 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/process_live_test.py +6 -7
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/process_test.py +26 -4
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/room.py +5 -0
- meshagent_cli-0.48.0/meshagent/cli/version.py +1 -0
- meshagent_cli-0.48.0/meshagent/cli/volumes.py +252 -0
- meshagent_cli-0.48.0/meshagent/cli/volumes_test.py +31 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/SOURCES.txt +3 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/pyproject.toml +16 -16
- meshagent_cli-0.47.1/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/LICENSE +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/README.md +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/slack-channel/channel.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/configure-slack.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/slack-channel/scripts/setup-slack-dev-route.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/slack-channel/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/task-queue-dashboard/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/telegram-channel/channel.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/configure-telegram.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/telegram-channel/scripts/create-bot-token.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/telegram-channel/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/twilio-channel/channel.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/twilio-channel/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/channel.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_project_templates/python/whatsapp-channel/server.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/create_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/feeds_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/iam.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/iam_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/image.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/image_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/mailboxes_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/messaging_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/process.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/room_services_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/rooms.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/rooms_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/routes_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sample_channel_http_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sample_channel_live_e2e_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/secrets.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/secrets_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/service_accounts.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/service_accounts_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sqlite.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sqlite_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/testing.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/thread_inspect.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/thread_inspect_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.47.1 → meshagent_cli-0.48.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.48.0
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -22,8 +22,8 @@ Requires-Dist: openpyxl~=3.1
|
|
|
22
22
|
Requires-Dist: xlsxwriter~=3.2
|
|
23
23
|
Requires-Dist: pathspec<2,>=1.0.3
|
|
24
24
|
Requires-Dist: zstandard~=0.25.0
|
|
25
|
-
Requires-Dist: meshagent-llm-proxy==0.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.48.0
|
|
26
|
+
Requires-Dist: meshagent-codex==0.48.0
|
|
27
27
|
Requires-Dist: rich~=14.3.0
|
|
28
28
|
Requires-Dist: sounddevice~=0.5
|
|
29
29
|
Requires-Dist: textual<9.0,>=8.2.3
|
|
@@ -32,23 +32,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
|
|
|
32
32
|
Requires-Dist: ascii-magic~=2.3
|
|
33
33
|
Requires-Dist: pillow~=11.3.0
|
|
34
34
|
Provides-Extra: all
|
|
35
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.48.0; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.48.0; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.48.0; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.48.0; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.48.0; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.48.0; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.48.0; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.48.0; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.48.0; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.48.0; extra == "all"
|
|
45
45
|
Requires-Dist: supabase-auth~=2.28.0; extra == "all"
|
|
46
46
|
Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
|
|
47
47
|
Provides-Extra: mcp-service
|
|
48
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
49
|
-
Requires-Dist: meshagent-api==0.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.48.0; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.48.0; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.48.0; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.48.0; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -180,6 +180,11 @@ app.add_lazy_command(
|
|
|
180
180
|
module="meshagent.cli.rooms",
|
|
181
181
|
help="Create, list, and manage rooms in a project",
|
|
182
182
|
)
|
|
183
|
+
app.add_lazy_command(
|
|
184
|
+
name="volumes",
|
|
185
|
+
module="meshagent.cli.volumes",
|
|
186
|
+
help="Manage durable storage volumes for a room",
|
|
187
|
+
)
|
|
183
188
|
app.add_lazy_command(
|
|
184
189
|
name="agent",
|
|
185
190
|
module="meshagent.cli.agents",
|
|
@@ -58,6 +58,7 @@ def test_root_help_lists_create_and_doctor_but_hides_legacy_command_namespaces()
|
|
|
58
58
|
assert "│ api-key" not in result.output
|
|
59
59
|
assert "│ launch" in result.output
|
|
60
60
|
assert "│ room" in result.output
|
|
61
|
+
assert "│ volumes" in result.output
|
|
61
62
|
assert "│ call" not in result.output
|
|
62
63
|
assert "│ package" not in result.output
|
|
63
64
|
assert "│ multi" not in result.output
|
|
@@ -151,6 +152,36 @@ def test_room_help_lists_agents_command() -> None:
|
|
|
151
152
|
assert "│ agents" in result.output
|
|
152
153
|
|
|
153
154
|
|
|
155
|
+
def test_volumes_help_lists_durable_lifecycle_commands() -> None:
|
|
156
|
+
result = CliRunner().invoke(cli.app, ["volumes", "--help"])
|
|
157
|
+
|
|
158
|
+
assert result.exit_code == 0
|
|
159
|
+
assert "│ list" in result.output
|
|
160
|
+
assert "│ create" in result.output
|
|
161
|
+
assert "│ expand" in result.output
|
|
162
|
+
assert "│ delete" in result.output
|
|
163
|
+
assert "lease" not in result.output.lower()
|
|
164
|
+
|
|
165
|
+
create_result = CliRunner().invoke(cli.app, ["volumes", "create", "--help"])
|
|
166
|
+
assert create_result.exit_code == 0
|
|
167
|
+
assert "--type" in create_result.output
|
|
168
|
+
assert "--max-size" in create_result.output
|
|
169
|
+
|
|
170
|
+
expand_result = CliRunner().invoke(cli.app, ["volumes", "expand", "--help"])
|
|
171
|
+
assert expand_result.exit_code == 0
|
|
172
|
+
assert "--max-size" in expand_result.output
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def test_room_mounts_help_is_list_only() -> None:
|
|
176
|
+
result = CliRunner().invoke(cli.app, ["room", "mounts", "--help"])
|
|
177
|
+
|
|
178
|
+
assert result.exit_code == 0
|
|
179
|
+
assert "│ list" in result.output
|
|
180
|
+
assert "│ mount" not in result.output
|
|
181
|
+
assert "│ unmount" not in result.output
|
|
182
|
+
assert "lease" not in result.output.lower()
|
|
183
|
+
|
|
184
|
+
|
|
154
185
|
def test_room_agents_help_lists_call_command() -> None:
|
|
155
186
|
result = CliRunner().invoke(cli.app, ["room", "agents", "--help"])
|
|
156
187
|
|
|
@@ -25,7 +25,8 @@ logging.basicConfig(
|
|
|
25
25
|
)
|
|
26
26
|
LOGGER = logging.getLogger("contact_form")
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
DEFAULT_MAIL_DOMAIN = "mail.meshagent.com"
|
|
29
|
+
DEFAULT_FROM_ADDRESS = f"contact@{DEFAULT_MAIL_DOMAIN}"
|
|
29
30
|
DEFAULT_TO_ADDRESS = ""
|
|
30
31
|
PRIVATE_MAILBOX_PERMISSION_ERROR = "5.7.1 Permission denied"
|
|
31
32
|
TRUE_ENV_VALUES = {"1", "true", "yes", "on"}
|
|
@@ -181,10 +182,19 @@ def room_slug_from_name(room_name: str) -> str:
|
|
|
181
182
|
return room_slug or "room"
|
|
182
183
|
|
|
183
184
|
|
|
185
|
+
def mail_domain() -> str:
|
|
186
|
+
return (
|
|
187
|
+
os.getenv("MESHAGENT_MAIL_DOMAIN", DEFAULT_MAIL_DOMAIN)
|
|
188
|
+
.strip()
|
|
189
|
+
.removeprefix("@")
|
|
190
|
+
or DEFAULT_MAIL_DOMAIN
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
|
|
184
194
|
def default_from_address() -> str:
|
|
185
195
|
room_name = os.getenv("MESHAGENT_ROOM", "").strip()
|
|
186
196
|
if room_name:
|
|
187
|
-
return f"contact-{room_slug_from_name(room_name)}@
|
|
197
|
+
return f"contact-{room_slug_from_name(room_name)}@{mail_domain()}"
|
|
188
198
|
return DEFAULT_FROM_ADDRESS
|
|
189
199
|
|
|
190
200
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from rich import print
|
|
4
|
+
|
|
5
|
+
from meshagent.api import RoomClient, RoomException, WebSocketClientProtocol
|
|
6
|
+
from meshagent.api.helpers import websocket_room_url
|
|
7
|
+
from meshagent.cli import async_typer
|
|
8
|
+
from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption, RoomOption
|
|
9
|
+
from meshagent.cli.helper import (
|
|
10
|
+
get_client,
|
|
11
|
+
print_json_table,
|
|
12
|
+
resolve_project_id,
|
|
13
|
+
resolve_room,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
app = async_typer.AsyncTyper(help="List storage mounts currently ready in a room")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@app.callback()
|
|
21
|
+
def _mounts_callback() -> None:
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@app.async_command("list")
|
|
26
|
+
async def list_mounts_command(
|
|
27
|
+
*,
|
|
28
|
+
project_id: ProjectIdOption,
|
|
29
|
+
room: RoomOption,
|
|
30
|
+
output: OutputFormatOption = "table",
|
|
31
|
+
) -> None:
|
|
32
|
+
account_client = await get_client()
|
|
33
|
+
try:
|
|
34
|
+
project_id = await resolve_project_id(project_id=project_id)
|
|
35
|
+
room_name = resolve_room(room)
|
|
36
|
+
if room_name is None:
|
|
37
|
+
raise RoomException("--room is required")
|
|
38
|
+
connection = await account_client.connect_room(
|
|
39
|
+
project_id=project_id,
|
|
40
|
+
room=room_name,
|
|
41
|
+
)
|
|
42
|
+
async with RoomClient(
|
|
43
|
+
protocol_factory=WebSocketClientProtocol(
|
|
44
|
+
url=websocket_room_url(room_name=room_name),
|
|
45
|
+
token=connection.jwt,
|
|
46
|
+
).create_factory()
|
|
47
|
+
) as room_client:
|
|
48
|
+
mounts = await room_client.mounts.list()
|
|
49
|
+
records = [mount.model_dump(mode="json") for mount in mounts]
|
|
50
|
+
if output == "json":
|
|
51
|
+
print(json.dumps(records, indent=2))
|
|
52
|
+
elif records:
|
|
53
|
+
print_json_table(
|
|
54
|
+
records,
|
|
55
|
+
"id",
|
|
56
|
+
"name",
|
|
57
|
+
"required",
|
|
58
|
+
"description",
|
|
59
|
+
"consumers",
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
print("No storage mounts are ready.")
|
|
63
|
+
finally:
|
|
64
|
+
await account_client.close()
|
|
@@ -299,14 +299,13 @@ class _RestoringThreadStorage:
|
|
|
299
299
|
def agent_messages(self) -> list[AgentMessage]:
|
|
300
300
|
return [*self.messages]
|
|
301
301
|
|
|
302
|
-
async def
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
302
|
+
async def restore_session_context(
|
|
303
|
+
self, *, context, llm_adapter, file_reader=None
|
|
304
|
+
) -> None:
|
|
305
|
+
restored_messages = await llm_adapter.project_agent_messages(
|
|
306
|
+
messages=self.messages,
|
|
307
|
+
file_reader=file_reader,
|
|
306
308
|
)
|
|
307
|
-
for message in self.messages:
|
|
308
|
-
reader.consume(message)
|
|
309
|
-
reader.finalize()
|
|
310
309
|
llm_adapter.restore_context_messages(
|
|
311
310
|
context=context,
|
|
312
311
|
messages=restored_messages,
|
|
@@ -5442,12 +5442,12 @@ class _FakeProcessThreadAdapter:
|
|
|
5442
5442
|
def agent_messages(self):
|
|
5443
5443
|
return []
|
|
5444
5444
|
|
|
5445
|
-
def restore_session_context(
|
|
5445
|
+
async def restore_session_context(
|
|
5446
|
+
self, *, context, llm_adapter=None, file_reader=None
|
|
5447
|
+
) -> None:
|
|
5446
5448
|
del context
|
|
5447
5449
|
del llm_adapter
|
|
5448
|
-
|
|
5449
|
-
async def restore_session_context_async(self, *, context, llm_adapter=None) -> None:
|
|
5450
|
-
self.restore_session_context(context=context, llm_adapter=llm_adapter)
|
|
5450
|
+
del file_reader
|
|
5451
5451
|
|
|
5452
5452
|
def make_toolkit(self):
|
|
5453
5453
|
return Toolkit(name="thread", tools=[])
|
|
@@ -5547,6 +5547,28 @@ class _SteeringRecordingAdapter:
|
|
|
5547
5547
|
del custom_event_callback
|
|
5548
5548
|
return lambda message: None
|
|
5549
5549
|
|
|
5550
|
+
async def project_agent_messages(
|
|
5551
|
+
self,
|
|
5552
|
+
*,
|
|
5553
|
+
messages: list[AgentMessage],
|
|
5554
|
+
file_reader=None,
|
|
5555
|
+
callbacks=None,
|
|
5556
|
+
) -> list[dict[str, object]]:
|
|
5557
|
+
del file_reader
|
|
5558
|
+
del callbacks
|
|
5559
|
+
projected: list[dict[str, object]] = []
|
|
5560
|
+
for message in messages:
|
|
5561
|
+
if not isinstance(message, (TurnStart, TurnSteer)):
|
|
5562
|
+
continue
|
|
5563
|
+
text = "\n".join(
|
|
5564
|
+
item.text
|
|
5565
|
+
for item in message.content
|
|
5566
|
+
if isinstance(item, AgentTextContent) and item.text != ""
|
|
5567
|
+
)
|
|
5568
|
+
if text != "":
|
|
5569
|
+
projected.append({"role": "user", "content": text})
|
|
5570
|
+
return projected
|
|
5571
|
+
|
|
5550
5572
|
async def create_response(
|
|
5551
5573
|
self,
|
|
5552
5574
|
*,
|
|
@@ -29,6 +29,11 @@ app.add_lazy_command(
|
|
|
29
29
|
module="meshagent.cli.storage",
|
|
30
30
|
help="Manage storage for a room",
|
|
31
31
|
)
|
|
32
|
+
app.add_lazy_command(
|
|
33
|
+
name="mounts",
|
|
34
|
+
module="meshagent.cli.mounts",
|
|
35
|
+
help="List storage mounts currently ready in a room",
|
|
36
|
+
)
|
|
32
37
|
app.add_lazy_command(
|
|
33
38
|
name="service",
|
|
34
39
|
module="meshagent.cli.room_services",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.48.0"
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import Annotated, Optional
|
|
3
|
+
|
|
4
|
+
import typer
|
|
5
|
+
from rich import print
|
|
6
|
+
|
|
7
|
+
from meshagent.api import RoomException
|
|
8
|
+
from meshagent.api.client import StorageVolume
|
|
9
|
+
from meshagent.api.specs.service import (
|
|
10
|
+
ANNOTATION_STORAGE_CAPACITY,
|
|
11
|
+
ANNOTATION_STORAGE_CLASS,
|
|
12
|
+
)
|
|
13
|
+
from meshagent.cli import async_typer
|
|
14
|
+
from meshagent.cli.common_options import OutputFormatOption, ProjectIdOption, RoomOption
|
|
15
|
+
from meshagent.cli.helper import (
|
|
16
|
+
get_client,
|
|
17
|
+
print_json_table,
|
|
18
|
+
resolve_project_id,
|
|
19
|
+
resolve_room,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
app = async_typer.AsyncTyper(help="Manage durable storage volumes for a room")
|
|
24
|
+
_VOLUME_STORAGE_CLASSES = frozenset({"standard", "juice", "zerofs"})
|
|
25
|
+
_CAPACITY_STORAGE_CLASSES = frozenset({"juice", "zerofs"})
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _json_object(value: Optional[str], *, label: str) -> dict | None:
|
|
29
|
+
if value is None:
|
|
30
|
+
return None
|
|
31
|
+
try:
|
|
32
|
+
parsed = json.loads(value)
|
|
33
|
+
except json.JSONDecodeError as error:
|
|
34
|
+
raise typer.BadParameter(f"invalid {label} JSON: {error}") from error
|
|
35
|
+
if not isinstance(parsed, dict):
|
|
36
|
+
raise typer.BadParameter(f"{label} must be a JSON object")
|
|
37
|
+
return parsed
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _volume_options(
|
|
41
|
+
*,
|
|
42
|
+
annotations: dict | None,
|
|
43
|
+
volume_type: str | None,
|
|
44
|
+
max_size_mb: int | None,
|
|
45
|
+
) -> tuple[dict[str, str], str, int | None]:
|
|
46
|
+
values: dict[str, str] = {}
|
|
47
|
+
for key, value in (annotations or {}).items():
|
|
48
|
+
if not isinstance(key, str) or not isinstance(value, str):
|
|
49
|
+
raise typer.BadParameter("annotation keys and values must be strings")
|
|
50
|
+
values[key] = value
|
|
51
|
+
reserved = {ANNOTATION_STORAGE_CLASS, ANNOTATION_STORAGE_CAPACITY}.intersection(
|
|
52
|
+
values
|
|
53
|
+
)
|
|
54
|
+
if reserved:
|
|
55
|
+
raise typer.BadParameter(
|
|
56
|
+
"use --type and --max-size instead of reserved storage annotations"
|
|
57
|
+
)
|
|
58
|
+
storage_class = (volume_type or "standard").strip().lower()
|
|
59
|
+
if storage_class not in _VOLUME_STORAGE_CLASSES:
|
|
60
|
+
valid = ", ".join(sorted(_VOLUME_STORAGE_CLASSES))
|
|
61
|
+
raise typer.BadParameter(f"type must be one of: {valid}")
|
|
62
|
+
if max_size_mb is not None:
|
|
63
|
+
if storage_class not in _CAPACITY_STORAGE_CLASSES:
|
|
64
|
+
raise typer.BadParameter(
|
|
65
|
+
"--max-size is supported only for JuiceFS and ZeroFS volumes"
|
|
66
|
+
)
|
|
67
|
+
if max_size_mb <= 0:
|
|
68
|
+
raise typer.BadParameter("--max-size must be a positive integer in MB")
|
|
69
|
+
return values, storage_class, max_size_mb
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _volume_record(volume: StorageVolume) -> dict:
|
|
73
|
+
record = volume.model_dump(mode="json")
|
|
74
|
+
record["type"] = volume.storage_class
|
|
75
|
+
record["max_size_mb"] = volume.max_size_mb
|
|
76
|
+
return record
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@app.async_command("list")
|
|
80
|
+
async def list_volumes_command(
|
|
81
|
+
*,
|
|
82
|
+
project_id: ProjectIdOption,
|
|
83
|
+
room: RoomOption,
|
|
84
|
+
output: OutputFormatOption = "table",
|
|
85
|
+
) -> None:
|
|
86
|
+
client = await get_client()
|
|
87
|
+
try:
|
|
88
|
+
project_id = await resolve_project_id(project_id=project_id)
|
|
89
|
+
room_name = resolve_room(room)
|
|
90
|
+
if room_name is None:
|
|
91
|
+
raise RoomException("--room is required")
|
|
92
|
+
volumes = await client.list_room_volumes(
|
|
93
|
+
project_id=project_id,
|
|
94
|
+
room=room_name,
|
|
95
|
+
)
|
|
96
|
+
records = [_volume_record(volume) for volume in volumes]
|
|
97
|
+
if output == "json":
|
|
98
|
+
print(json.dumps(records, indent=2))
|
|
99
|
+
elif records:
|
|
100
|
+
print_json_table(
|
|
101
|
+
records,
|
|
102
|
+
"id",
|
|
103
|
+
"name",
|
|
104
|
+
"type",
|
|
105
|
+
"max_size_mb",
|
|
106
|
+
"provisioned",
|
|
107
|
+
"reconcile_error",
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
print("No storage volumes found.")
|
|
111
|
+
finally:
|
|
112
|
+
await client.close()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@app.async_command("create")
|
|
116
|
+
async def create_volume_command(
|
|
117
|
+
name: Annotated[str, typer.Argument(help="Volume name")],
|
|
118
|
+
*,
|
|
119
|
+
project_id: ProjectIdOption,
|
|
120
|
+
room: RoomOption,
|
|
121
|
+
description: Annotated[str, typer.Option(help="Volume description")] = "",
|
|
122
|
+
metadata: Annotated[
|
|
123
|
+
Optional[str],
|
|
124
|
+
typer.Option(help="Volume metadata JSON object"),
|
|
125
|
+
] = None,
|
|
126
|
+
annotations: Annotated[
|
|
127
|
+
Optional[str],
|
|
128
|
+
typer.Option(help="Volume annotations JSON object"),
|
|
129
|
+
] = None,
|
|
130
|
+
volume_type: Annotated[
|
|
131
|
+
Optional[str],
|
|
132
|
+
typer.Option(
|
|
133
|
+
"--type",
|
|
134
|
+
help="Storage type: standard, juice, or zerofs",
|
|
135
|
+
),
|
|
136
|
+
] = None,
|
|
137
|
+
max_size_mb: Annotated[
|
|
138
|
+
Optional[int],
|
|
139
|
+
typer.Option(
|
|
140
|
+
"--max-size",
|
|
141
|
+
help="Maximum volume size in MB (JuiceFS and ZeroFS only)",
|
|
142
|
+
),
|
|
143
|
+
] = None,
|
|
144
|
+
) -> None:
|
|
145
|
+
client = await get_client()
|
|
146
|
+
try:
|
|
147
|
+
project_id = await resolve_project_id(project_id=project_id)
|
|
148
|
+
room_name = resolve_room(room)
|
|
149
|
+
if room_name is None:
|
|
150
|
+
raise RoomException("--room is required")
|
|
151
|
+
parsed_annotations, storage_class, max_size_mb = _volume_options(
|
|
152
|
+
annotations=_json_object(annotations, label="annotations"),
|
|
153
|
+
volume_type=volume_type,
|
|
154
|
+
max_size_mb=max_size_mb,
|
|
155
|
+
)
|
|
156
|
+
volume = await client.create_room_volume(
|
|
157
|
+
project_id=project_id,
|
|
158
|
+
room=room_name,
|
|
159
|
+
name=name,
|
|
160
|
+
description=description,
|
|
161
|
+
metadata=_json_object(metadata, label="metadata"),
|
|
162
|
+
storage_class=storage_class,
|
|
163
|
+
max_size_mb=max_size_mb,
|
|
164
|
+
annotations=parsed_annotations,
|
|
165
|
+
)
|
|
166
|
+
print(json.dumps(volume.model_dump(mode="json"), indent=2))
|
|
167
|
+
finally:
|
|
168
|
+
await client.close()
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@app.async_command("delete")
|
|
172
|
+
async def delete_volume_command(
|
|
173
|
+
volume: Annotated[str, typer.Argument(help="Volume ID or name")],
|
|
174
|
+
*,
|
|
175
|
+
project_id: ProjectIdOption,
|
|
176
|
+
room: RoomOption,
|
|
177
|
+
) -> None:
|
|
178
|
+
client = await get_client()
|
|
179
|
+
try:
|
|
180
|
+
project_id = await resolve_project_id(project_id=project_id)
|
|
181
|
+
room_name = resolve_room(room)
|
|
182
|
+
if room_name is None:
|
|
183
|
+
raise RoomException("--room is required")
|
|
184
|
+
volumes = await client.list_room_volumes(
|
|
185
|
+
project_id=project_id,
|
|
186
|
+
room=room_name,
|
|
187
|
+
)
|
|
188
|
+
selected = next(
|
|
189
|
+
(
|
|
190
|
+
candidate
|
|
191
|
+
for candidate in volumes
|
|
192
|
+
if candidate.id == volume or candidate.name == volume
|
|
193
|
+
),
|
|
194
|
+
None,
|
|
195
|
+
)
|
|
196
|
+
if selected is None:
|
|
197
|
+
raise RoomException(f"storage volume {volume!r} was not found")
|
|
198
|
+
deleted = await client.delete_room_volume(
|
|
199
|
+
project_id=project_id,
|
|
200
|
+
room=room_name,
|
|
201
|
+
volume_id=selected.id,
|
|
202
|
+
)
|
|
203
|
+
print(f"Storage volume {deleted.name!r} was marked for deletion.")
|
|
204
|
+
finally:
|
|
205
|
+
await client.close()
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@app.async_command("expand")
|
|
209
|
+
async def expand_volume_command(
|
|
210
|
+
volume: Annotated[str, typer.Argument(help="Volume ID or name")],
|
|
211
|
+
*,
|
|
212
|
+
max_size_mb: Annotated[
|
|
213
|
+
int,
|
|
214
|
+
typer.Option(
|
|
215
|
+
"--max-size",
|
|
216
|
+
help="New maximum volume size in MB",
|
|
217
|
+
),
|
|
218
|
+
],
|
|
219
|
+
project_id: ProjectIdOption,
|
|
220
|
+
room: RoomOption,
|
|
221
|
+
) -> None:
|
|
222
|
+
if max_size_mb <= 0:
|
|
223
|
+
raise typer.BadParameter("--max-size must be a positive integer in MB")
|
|
224
|
+
client = await get_client()
|
|
225
|
+
try:
|
|
226
|
+
project_id = await resolve_project_id(project_id=project_id)
|
|
227
|
+
room_name = resolve_room(room)
|
|
228
|
+
if room_name is None:
|
|
229
|
+
raise RoomException("--room is required")
|
|
230
|
+
volumes = await client.list_room_volumes(
|
|
231
|
+
project_id=project_id,
|
|
232
|
+
room=room_name,
|
|
233
|
+
)
|
|
234
|
+
selected = next(
|
|
235
|
+
(
|
|
236
|
+
candidate
|
|
237
|
+
for candidate in volumes
|
|
238
|
+
if candidate.id == volume or candidate.name == volume
|
|
239
|
+
),
|
|
240
|
+
None,
|
|
241
|
+
)
|
|
242
|
+
if selected is None:
|
|
243
|
+
raise RoomException(f"storage volume {volume!r} was not found")
|
|
244
|
+
expanded = await client.expand_room_volume(
|
|
245
|
+
project_id=project_id,
|
|
246
|
+
room=room_name,
|
|
247
|
+
volume_id=selected.id,
|
|
248
|
+
max_size_mb=max_size_mb,
|
|
249
|
+
)
|
|
250
|
+
print(json.dumps(expanded.model_dump(mode="json"), indent=2))
|
|
251
|
+
finally:
|
|
252
|
+
await client.close()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
import typer
|
|
3
|
+
|
|
4
|
+
from meshagent.cli.volumes import _volume_options
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@pytest.mark.parametrize("storage_class", ["juice", "zerofs"])
|
|
8
|
+
def test_volume_options_support_max_size_for_managed_filesystems(
|
|
9
|
+
storage_class: str,
|
|
10
|
+
) -> None:
|
|
11
|
+
assert _volume_options(
|
|
12
|
+
annotations={"example.test/purpose": "models"},
|
|
13
|
+
volume_type=storage_class,
|
|
14
|
+
max_size_mb=512,
|
|
15
|
+
) == ({"example.test/purpose": "models"}, storage_class, 512)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.parametrize(
|
|
19
|
+
("storage_class", "max_size_mb"),
|
|
20
|
+
[("standard", 512), ("zerofs", 0), ("juice", -1)],
|
|
21
|
+
)
|
|
22
|
+
def test_volume_options_reject_unsupported_or_invalid_max_size(
|
|
23
|
+
storage_class: str,
|
|
24
|
+
max_size_mb: int,
|
|
25
|
+
) -> None:
|
|
26
|
+
with pytest.raises(typer.BadParameter):
|
|
27
|
+
_volume_options(
|
|
28
|
+
annotations=None,
|
|
29
|
+
volume_type=storage_class,
|
|
30
|
+
max_size_mb=max_size_mb,
|
|
31
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.48.0
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -22,8 +22,8 @@ Requires-Dist: openpyxl~=3.1
|
|
|
22
22
|
Requires-Dist: xlsxwriter~=3.2
|
|
23
23
|
Requires-Dist: pathspec<2,>=1.0.3
|
|
24
24
|
Requires-Dist: zstandard~=0.25.0
|
|
25
|
-
Requires-Dist: meshagent-llm-proxy==0.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.48.0
|
|
26
|
+
Requires-Dist: meshagent-codex==0.48.0
|
|
27
27
|
Requires-Dist: rich~=14.3.0
|
|
28
28
|
Requires-Dist: sounddevice~=0.5
|
|
29
29
|
Requires-Dist: textual<9.0,>=8.2.3
|
|
@@ -32,23 +32,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
|
|
|
32
32
|
Requires-Dist: ascii-magic~=2.3
|
|
33
33
|
Requires-Dist: pillow~=11.3.0
|
|
34
34
|
Provides-Extra: all
|
|
35
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.48.0; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.48.0; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.48.0; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.48.0; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.48.0; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.48.0; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.48.0; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.48.0; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.48.0; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.48.0; extra == "all"
|
|
45
45
|
Requires-Dist: supabase-auth~=2.28.0; extra == "all"
|
|
46
46
|
Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
|
|
47
47
|
Provides-Extra: mcp-service
|
|
48
|
-
Requires-Dist: meshagent-agents[all]==0.
|
|
49
|
-
Requires-Dist: meshagent-api==0.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.48.0; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.48.0; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.48.0; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.48.0; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -62,6 +62,7 @@ meshagent/cli/meshagent_images.py
|
|
|
62
62
|
meshagent/cli/meshagent_images_test.py
|
|
63
63
|
meshagent/cli/messaging.py
|
|
64
64
|
meshagent/cli/messaging_test.py
|
|
65
|
+
meshagent/cli/mounts.py
|
|
65
66
|
meshagent/cli/multi.py
|
|
66
67
|
meshagent/cli/oci_archive.py
|
|
67
68
|
meshagent/cli/oci_archive_test.py
|
|
@@ -124,6 +125,8 @@ meshagent/cli/version.py
|
|
|
124
125
|
meshagent/cli/version_check.py
|
|
125
126
|
meshagent/cli/version_check_test.py
|
|
126
127
|
meshagent/cli/voicebot.py
|
|
128
|
+
meshagent/cli/volumes.py
|
|
129
|
+
meshagent/cli/volumes_test.py
|
|
127
130
|
meshagent/cli/webserver.py
|
|
128
131
|
meshagent/cli/webserver_test.py
|
|
129
132
|
meshagent/cli/worker.py
|